GLSL中的逐位和枚举用法

enum usage for bitwise and in GLSL

本文关键字:枚举 用法 GLSL      更新时间:2023-10-16

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

伪C++代码:

enum PolyFlags
{
    Invisible       = 0x00000001,   
    Masked          = 0x00000002,   
    Translucent     = 0x00000004,
    ...
};
...
if ( Flag & Masked)
    Alphathreshold = 0.5;

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

'enu':保留字

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

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

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

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

#define Invisible    0x00000001u
#define Masked       0x00000002u
#define Translucent  0x00000004u

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

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

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