在片段着色器 GLSL 中共享变量

sharing variables in fragment shader GLSL

我试过这个片段着色器。 但结果出人意料

void main() {
   float test;
   if(gl_FragCoord.x==300.0){
       test=1.0;
   }


   gl_FragColor = vec4(test, 1,1,1);
} 

此程序使所有片段都变成白色。 但这是出乎意料的,因为每个片段的着色器 运行 是异步的。 请注意,颜色取决于 if 块中的测试值。 例如,如果我将它更改为 0,它将用浅蓝色填充所有片段。 我原以为只用 x=300 填充片段。 请解释如何?

此代码表现出未定义的行为,因为您从未初始化 test

此外,即使您这样做了,条件本身也几乎肯定永远不会满足。 gl_FragCoord 不需要是整数,所以你在做 floating-point 相等。系统不需要提供准确的值,所以这样的相等性测试几乎肯定会失败。

我测试了很多。 似乎 GLSL 考虑了第一个初始化语句,即未初始化变量的默认值;尽管它位于何处。