Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

enum usage for bitwise and in GLSL

Tags:

c++

glsl

Ok, this is probably an easy one for the pro's out there. I want to use an enum in GLSL in order to make an if bitwise and check on it, like in c++.

Pseudo C++ code:

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

...

if ( Flag & Masked)
    Alphathreshold = 0.5;

But I am already lost at the beginning because it fails already compiling with:

'enum' : Reserved word

I read that enum's in GLSL are supposed to work as well as the bitwise and, but I can't find a working example.

So, is it actually working/supported and if so, how? I tried already with different #version in the shader, but no luck so far.

like image 678
Gnampf Avatar asked Dec 13 '15 13:12

Gnampf


1 Answers

The OpenGL Shading Language does not have enumeration types. However, they are reserved keywords, which is why you got that particular compiler error.

C enums are really just syntactic sugar for a value (C++ gives them some type-safety, with enum classes having much more). So you can emulate them in a number of ways. Perhaps the most traditional (and dangerous) is with #defines:

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

A more reasonable way is to declare compile-time const qualified global variables. Any GLSL compiler worth using will optimize them away to nothingness, so they won't take up any more resources than the #define. And it won't have any of the drawbacks of the #define.

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

Obviously, you need to be using a version of GLSL that supports unsigned integers and bitwise operations (aka: GLSL 1.30+, or GLSL ES 3.00+).

like image 190
Nicol Bolas Avatar answered Nov 18 '22 19:11

Nicol Bolas