按位和GLSL的枚举用法

时间:2015-12-13 13:33:39

标签: c++ glsl

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

伪C ++代码:

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

...

if ( Flag & Masked)
    Alphathreshold = 0.5;

但我在开始时已经迷失了,因为它已经失败已经编译:

'enum':保留字

我读到GLSL中的枚举应该和bitwise一样好用,但我找不到一个有效的例子。

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

1 个答案:

答案 0 :(得分:4)

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

C枚举实际上只是一个值的语法糖(C ++赋予它们一些类型安全性,enum class具有更多的类型。所以你可以通过多种方式模仿它们。也许最传统(也很危险)的是#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 +)。