C++ GLSL中按位和的枚举用法

C++ GLSL中按位和的枚举用法,c++,glsl,C++,Glsl,好的,这对职业选手来说可能是一个简单的问题。我想在GLSL使用EnUM,以便在It中按位进行检查,就像在C++中。 伪C++代码: enum PolyFlags { Invisible = 0x00000001, Masked = 0x00000002, Translucent = 0x00000004, ... }; ... if ( Flag & Masked) Alphathreshold

好的,这对职业选手来说可能是一个简单的问题。我想在GLSL使用EnUM,以便在It中按位进行检查,就像在C++中。

伪C++代码:

enum PolyFlags
{
    Invisible       = 0x00000001,   
    Masked          = 0x00000002,   
    Translucent     = 0x00000004,
    ...
};

...

if ( Flag & Masked)
    Alphathreshold = 0.5;
但一开始我就迷路了,因为它已经无法编译了:

'enum':保留字

我读到GLSL中的枚举应该和按位and一样有效,但我找不到一个有效的例子


那么,它是否真正起作用/得到支持?如果是,如何?我已经在着色器中尝试了不同的#版本,但到目前为止没有成功。

OpenGL着色语言没有枚举类型。但是,它们是保留关键字,这就是为什么会出现特定的编译器错误

C枚举实际上只是一个值的语法糖(C++给了它们一些类型安全性,而
enum类
es有更多)。因此,您可以通过多种方式模拟它们。也许最传统的(也是最危险的)是#定义:

更合理的方法是声明编译时
const
限定全局变量。任何值得使用的GLSL编译器都会将它们优化为零,因此它们不会占用比
#define
更多的资源。而且它不会有
#define
的任何缺点

const uint Invisible    = 0x00000001u;
const uint Masked       = 0x00000002u;
const uint Translucent  = 0x00000004u;

显然,您需要使用支持无符号整数和位运算的GLSL版本(又名:GLSL 1.30+,或GLSL ES 3.00+)。

编译器是否指向特定行?在我看来,枚举定义的末尾缺少分号;是的,不是这样。我只是在我的示例代码中忘记了:)我认为它值得放在一起。例如,为我们提供一个简短但完整的程序,而不使用
。我只想知道一个简短的解释或更好的例子,说明如何在着色器中正确使用“enum”,最好是但不必与“按位and”组合使用。如果我知道要写什么,我不会问,现在这是一个纯理论性质的问题,因为我在这里或网络上没有发现任何有用的东西,除了被提到要支持它,我还没有一个程序来支持它。然后我只想知道为什么一些来源声称枚举实际上是受支持的。感谢你的详细回答和优化。嗯,还有一件事:也许,在C++中我可以做(多标记和掩饰),但是在GLSL中,这会引起错误:0:101:‘:期望的布尔表达式-什么是正确的方法?哦,NVM,我想我知道,“如果”在GLSL中总是期望比较。@ GnAMFF我不知道任何关于GLSL的东西,但是C++ <代码> IF(Frand Mask:Eng/Mask:<代码> >使用了从<代码> UTEN<代码>到 BOOL的隐式转换。如果(0!=(PolyFlags&Masked))应该可以解决GLSL中的问题,那么可以通过编写
来明确这一点。@Gnampf它不需要比较,而是需要一个布尔表达式。所以像
if(bool(PolyFlags&Masked))
这样的显式转换也可以工作。
const uint Invisible    = 0x00000001u;
const uint Masked       = 0x00000002u;
const uint Translucent  = 0x00000004u;