我有以下片段着色器:
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?
答案 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;