GLSL ES精度错误和溢出

V1r*_*ru8 6 opengl-es ios 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; 
}
Run Code Online (Sandbox Code Playgroud)

我知道这个着色器没有多大意义,但它应该仍然运行正确,我尝试重现它的问题.当我使用Xcode OpenGL-ES分析器分析此着色器时,它显示错误:

隐式转换溢出,lowp float的最小范围是(-2,2)

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

任何人都可以向我解释为什么dis产生溢出虽然我到处都选择了highp?

Aer*_*ert 13

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

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

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

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

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

从4.5.2(精确限定符):

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

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

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

tmp = texture2D(uColorTexture, vTexCoord)/2.0 + texture2D(uColorTexture, vTexCoord)/2.0;
Run Code Online (Sandbox Code Playgroud)