这是一个奇怪的问题。我有一个片段着色器,据我观察只能返回黑色或红色,但它却渲染为白色像素。如果我删除一行特定的代码,就会返回我期望的颜色。它在WebGL中可用,但在树莓派上的OpenGL ES中不行。
以下是着色器代码。如果像素代表Mandelbrot集合内的点,则返回黑色,否则返回红色。
precision mediump float;
varying vec2 vPosition;
void main(void) {
float cx = vPosition.x;
float cy = vPosition.y;
float x = 0.0;
float y = 0.0;
float tempX = 0.0;
int runaway = 0;
for (int i=0; i < 100; i++) {
tempX = x * x - y * y + float(cx);
y = 2.0 * x * y + float(cy);
x = tempX;
if (runaway == 0 && x * x + y * y > 100.0) {
runaway = i;
}
}
if (runaway != 0) {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
} else {
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
}
}
那个着色器会将所有像素都涂成白色。但是,如果我删除这一行:
runaway = i;
然后,正如你所期望的那样,它会将所有像素都涂成黑色(因为它总是最终的if
语句中的else
分支中)。
渲染白色像素是否是某种错误条件的症状? 如果是,可能是什么呢?
[编辑] 在任何人问之前 - 在该行上设置runaway = 1;
也会导致整个屏幕变成白色。
runaway
,而没有通过在循环上放置break
或&& runaway == 0
条件来退出 - 即使它们不需要,着色器的所有实例也始终执行 100 次迭代。 - Giles Thomas