お世話になっております。
ずいぶん昔から存在するコードでエンジン内部では自分の知っている限り一度も使われていないコードなのですが、DeferredShadingCommon.ushに存在するDecode71()の計算結果でScalarの精度が通常より劣化してしまいます。
また、Maskの値が0と1とでScalarの結果が変わってしまいます。
// @param Scalar clamped in 0..1 range // @param Mask 0..1 // @return 8bit in range 0..1 float Encode71(float Scalar, uint Mask) { return 127.0f / 255.0f * saturate(Scalar) + 128.0f / 255.0f * Mask; } // 8bit reinterpretation as 7bit,1bit // @param Scalar 0..1 // @param Mask 0..1 // @return 7bit in 0.1 float Decode71(float Scalar, out uint Mask) { Mask = (uint)(Scalar > 0.5f); return (Scalar - 0.5f * Mask) * 2.0f; }
Decode71()の
> return (Scalar - 0.5f * Mask) * 2.0f;
の部分もEncode()と同じように
> return (Scalar - (128.0f / 255.0f) * Mask) * (255.0f / 127.0f);
にした方が良いと思うのですが、いかがでしょうか?
個人的にはこの関数を修正して何度か使用したことがあるのですが、エンジンでは使用されていないので削除しても構わないのかもしれません。
ご確認の方よろしくお願いいたします。