シェーダーのDecode71()でScalarの精度が通常より劣化してしまう

お世話になっております。

ずいぶん昔から存在するコードでエンジン内部では自分の知っている限り一度も使われていないコードなのですが、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);

にした方が良いと思うのですが、いかがでしょうか?

個人的にはこの関数を修正して何度か使用したことがあるのですが、エンジンでは使用されていないので削除しても構わないのかもしれません。

ご確認の方よろしくお願いいたします。

再現手順
Scalar = 0.7777 をエンコードしてデコードした結果

Mask = 0 の場合 Scalar = 0.7747

Mask = 1 の場合 Scalar = 0.7786

となります。

お世話になっております。

本件詳細な調査及び修正提案まで行って頂きありがとうございます。

該当関数の挙動に関してこちらでも確認させていただきました。

内容としては適切かと思われますので、修正案含めて現在以下Issueとして報告させて頂いている状態となります。

UE-294750 Insufficient precision of Decode71 function

※確認が行われ次第Issueとして公開予定です。

お手数おかけしますが、現状利用する際にはローカルで修正運用頂けますと幸いです。

よろしくお願いいたします。