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)

它不仅显示此错误,而且渲染输出也因溢出而损坏。所以它不仅仅是分析仪的误报,它实际上溢出了。

谁能向我解释为什么 dis 会产生溢出,尽管我到处都选择了 highp ?

4

1 回答 1

14

你并没有真正在任何地方都选择 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;
于 2013-07-30T15:01:25.680 回答