在片段着色器 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 考虑了第一个初始化语句,即未初始化变量的默认值;尽管它位于何处。
我试过这个片段着色器。 但结果出人意料
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 考虑了第一个初始化语句,即未初始化变量的默认值;尽管它位于何处。