我想构建一个片段着色器,并且我意识到glsl 1.5.0中两个int之间的比较将始终返回false。我正在使用整数作为方法参数中的枚举。这是一个简单的问题,此代码具有相同的结果。
void main(){
int x = 5;
#if(x == 5)
gl_FragColor = vec4(1.0);
#else
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
#endif
}
我尝试了这段代码,条件x == int(2)
将始终返回true!
void main(){
int x = 5;
#if(x == int(2))
gl_FragColor = vec4(1.0);
#else
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
#endif
}
那么,我应该怎么做才能以正确的方式比较两个整数?
答案 0 :(得分:1)
#if
,#else
和#endif
是预处理程序语句。但是int x = 5;
是局部变量。预处理程序处理源字符串,它是编译过程的一部分,但它是在实际编译之前完成的。变量x
对预处理器没有任何意义。
预处理器的x
可以定义如下:
#define x 5
#if(x == 5)
gl_FragColor = vec4(1.0);
#else
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
#endif
但是glsl if
语句以关键字if
开头,后跟一个bool表达式和一个语句。可选,后接关键字else
和另一条语句:
int x = 5;
if (x == 5)
{
gl_FragColor = vec4(1.0);
}
else
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
在这种情况下,可以跳过花括号,因为在每种情况下,只有一个语句。
注意,也可以使用三元运算符:
gl_FragColor = x==5 ? vec4(1.0) : vec4(1.0, 0.0, 0.0, 1.0);
可以在OpenGL Shading Language 1.50 Specification中详细阅读所有内容。在“ 3.3预处理器”一章中对预处理器进行了说明,在“ 6.2选择”一章中指定了if
语句,在“ 5.8分配”一章中指定了三元运算符