GLSL中两个整数之间的比较

时间:2019-05-29 21:14:06

标签: glsl

我想构建一个片段着色器,并且我意识到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
}

那么,我应该怎么做才能以正确的方式比较两个整数?

1 个答案:

答案 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分配”一章中指定了三元运算符