按位和在 GLSL 中的枚举用法
enum usage for bitwise and in GLSL
好的,这对于专业人士来说可能很简单。我想在 GLSL 中使用枚举来按位生成 if 并检查它,就像在 C++ 中一样。
伪C++代码:
enum PolyFlags
{
Invisible = 0x00000001,
Masked = 0x00000002,
Translucent = 0x00000004,
...
};
...
if ( Flag & Masked)
Alphathreshold = 0.5;
但是我一开始就迷路了,因为它已经编译失败了:
'enum' : 保留字
我读到 GLSL 中的枚举应该和按位与一样有效,但我找不到有效的示例。
那么,它实际上是 working/supported 吗?如果是,怎么办?我已经尝试在着色器中使用不同的#version,但到目前为止运气不好。
OpenGL 着色语言没有枚举类型。但是,它们是保留关键字,这就是您遇到特定编译器错误的原因。
C 枚举实际上只是一个值的语法糖(C++ 为它们提供了一些类型安全,enum class
es 有更多)。因此,您可以通过多种方式模拟它们。也许最传统(也是最危险的)是使用#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+)。
好的,这对于专业人士来说可能很简单。我想在 GLSL 中使用枚举来按位生成 if 并检查它,就像在 C++ 中一样。
伪C++代码:
enum PolyFlags
{
Invisible = 0x00000001,
Masked = 0x00000002,
Translucent = 0x00000004,
...
};
...
if ( Flag & Masked)
Alphathreshold = 0.5;
但是我一开始就迷路了,因为它已经编译失败了:
'enum' : 保留字
我读到 GLSL 中的枚举应该和按位与一样有效,但我找不到有效的示例。
那么,它实际上是 working/supported 吗?如果是,怎么办?我已经尝试在着色器中使用不同的#version,但到目前为止运气不好。
OpenGL 着色语言没有枚举类型。但是,它们是保留关键字,这就是您遇到特定编译器错误的原因。
C 枚举实际上只是一个值的语法糖(C++ 为它们提供了一些类型安全,enum class
es 有更多)。因此,您可以通过多种方式模拟它们。也许最传统(也是最危险的)是使用#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+)。