7

次のフラグメントシェーダーがあります。

precision highp float; 
varying highp vec2 vTexCoord; 
uniform sampler2D uColorTexture; 
void main () {
   highp vec4 tmp;
   tmp = ((texture2D (uColorTexture, vTexCoord) + texture2D (uColorTexture, vTexCoord)) / 2.0);   
    gl_FragColor = tmp; 
}

このシェーダがあまり意味をなさないことはわかっていますが、それでも正しく動作するはずであり、問​​題を再現しようとしています。Xcode OpenGL-ES アナライザーでこのシェーダーを分析すると、エラーが表示されます。

暗黙的な変換でのオーバーフロー。lowp float の最小範囲は (-2,2)

このエラーが表示されるだけでなく、レンダリング出力が壊れてオーバーフローします。したがって、実際にオーバーフローするのは、アナライザーからの単なる誤検知ではありません。

どこでもhighpを選択したのに、disがオーバーフローを生成する理由を誰かに説明できますか?

4

1 に答える 1

14

どこでも highp を選択したわけではありません。GLSL ES 仕様の第 8 章 (組み込み関数) から:

パラメーターと戻り値の精度修飾子は示されていません。テクスチャ関数の場合、戻り型の精度はサンプラー型の精度と一致します。

および 4.5.3 (デフォルトの精度修飾子) から:

フラグメント言語には、次の事前宣言されたグローバル スコープのデフォルトの精度ステートメントがあります: ... precision lowp sampler2D;...

これは、コードでtexture2D (uColorTexture, vTexCoord)が返されることを意味しlowp、そのうちの 2 つを追加すると、値が 2.0 になる可能性があります。

4.5.2 (Precision Qualifiers) から:

精度修飾子に必要な最小範囲と精度は次のとおりです。 ... lowp (−2,2) ...

の括弧は(-2,2)開放範囲を示します。つまり、2 までの値が含まれます (2 は含まれません)。

つまり、2 つの を足しlowp合わせているということは、オーバーフローしていることを意味していると思います。その行を次のように変更してみてください。

tmp = texture2D(uColorTexture, vTexCoord)/2.0 + texture2D(uColorTexture, vTexCoord)/2.0;
于 2013-07-30T15:01:25.680 に答える