按位和 GLSL 的枚举用法

Gna*_*mpf 5 c++ glsl

好的,这对于专业人士来说可能很容易。我想在 GLSL 中使用枚举,以便按位进行 if 并检查它,就像在 C++ 中一样。

伪C++代码:

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

...

if ( Flag & Masked)
    Alphathreshold = 0.5;
Run Code Online (Sandbox Code Playgroud)

但是我一开始就迷路了,因为它已经编译失败了:

'enum' : 保留字

我读到 GLSL 中的枚举应该像按位和一样工作,但我找不到工作示例。

那么,它实际上是否有效/受支持,如果是,如何?我已经尝试过在着色器中使用不同的 #version,但到目前为止还没有运气。

Nic*_*las 5

OpenGL 着色语言没有枚举类型。但是,它们是保留关键字,这就是您遇到特定编译器错误的原因。

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

#define Invisible    0x00000001u
#define Masked       0x00000002u
#define Translucent  0x00000004u
Run Code Online (Sandbox Code Playgroud)

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

const uint Invisible    = 0x00000001u;
const uint Masked       = 0x00000002u;
const uint Translucent  = 0x00000004u;
Run Code Online (Sandbox Code Playgroud)

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

  • @Gnampf 它不需要比较,它需要一个布尔表达式。因此,像 `if(bool(PolyFlags & Masked))` 这样的显式转换也将起作用。 (2认同)