2013-07-25 27 views
5

をオーバーフローし、私は次のフラグメントシェーダがありますGLSL ES精度誤差や

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アナライザでこのシェーダを分析するとき、それはエラーを示しています。

Overflow in implicit conversion, minimum range for lowp float is (-2,2)

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

なぜ私はhighpをどこでも選んだが、disがオーバーフローを起こす理由を説明することはできますか?

答えて

10

は本当にになりました。 GLSL ES spec 8章(組み込み関数)から:

Precision qualifiers for parameters and return values are not shown. For the texture functions, the precision of the return type matches the precision of the sampler type.

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

The fragment language has the following predeclared globally scoped default precision statements: ... precision lowp sampler2D; ...

コード内でtexture2D (uColorTexture, vTexCoord)lowpを返すことを意味し、あなたそれらのうちの2つを追加している可能性があります。

4.5.2(精密修飾子)から:

The required minimum ranges and precisions for precision qualifiers are: ... lowp (−2,2) ...

(-2,2)中括弧は、それが最大値(は含まない)2.

は、だから私は思うが含ま意味、オープン範囲を示しますあなたが2つのlowpを一緒に追加しているという事実は、あなたがあふれていることを意味します。その行を次のように変更してみてください:

tmp = texture2D(uColorTexture, vTexCoord)/2.0 + texture2D(uColorTexture, vTexCoord)/2.0;