GLSL ES精度错误和溢出

时间:2013-07-25 15:00:13

标签: ios opengl-es glsles

我有以下片段着色器:

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)

并且它不仅显示此错误,而且渲染输出中断也会溢出。所以它不仅仅是分析仪实际上溢出的误报。

有人可以向我解释为什么dis会产生溢出但我到处都选择了highp?

1 个答案:

答案 0 :(得分:13)

你没有真的到处选择highp;来自GLSL ES spec第8章(内置函数):

  

不显示参数和返回值的精度限定符。对于纹理函数,返回类型的精度与采样器类型的精度相匹配。

和4.5.3(默认精度限定符):

  

片段语言具有以下预先声明的全局范围默认精度语句:... precision lowp sampler2D; ...

这意味着在您的代码texture2D (uColorTexture, vTexCoord)中将返回lowp,您将添加其中两个,可能会导致值为2.0。

从4.5.2(精确限定符):

  

精度限定符所需的最小范围和精度为:... lowp(-2,2)...

(-2,2)中的括号表示开放范围,这意味着它包含最多(但不包括)2的值。

所以我认为你将两个lowp加在一起的事实意味着你已经满溢了。尝试将该行更改为:

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