我可以在GLSL中重新解释演员阵容吗?

时间:2018-05-03 03:18:19

标签: opengl casting glsl

在C ++中,您可以获取unsigned int的指针,并将其转换为指向signed int(reinterpret_cast)的指针。

unsigned int a = 200;
int b = *(reinterpret_cast<int *>(&a));

我需要将着色器中生成的int存储为unsigned int,以便写入具有无符号整数内部格式的纹理。在GLSL中有没有类似于C ++的reinterpret_cast的替代方案?

2 个答案:

答案 0 :(得分:3)

在C ++(20之前版本)中,允许以非常不同的方式表示有符号和无符号整数。 C ++不需要有符号整数作为二进制补码;允许实现使用补码或其他表示。 C ++对有符号和无符号的唯一要求是可以将所有非负(或陷阱)有符号值转换为无符号值。

和FYI:您的代码产生UB违反严格别名规则(通过指向Y类型的无关对象的指针访问X类型的对象)。虽然这在低级代码中有点常见,但C ++对象模型并不真正允许它。但我离题了。

我提出了所有signed-vs-unsigned的东西,因为GLSL实际上定义了有符号整数的表示。在GLSL中,有符号整数是二进制补码。因此,GLSL可以定义如何从整个无符号值范围转换为有符号值,反之亦然,只需保留值的位模式即可。

而这正是它的作用。因此,您不必使用铸造体操,而只需进行无符号签名转换,就像浮动签名或其他任何内容一样:

int i = ...
uint j = uint(i);

此转换会保留位模式。

哦,C ++ 20似乎是getting on-board with this too

答案 1 :(得分:0)

GLSL不支持这种转换(也不支持指针)。相反,在GLSL中,您可以使用构造函数样式语法构造不同类型的值:

int a = 5;    // set an int to a constant
uint b = uint(a);   // "cast" that int to a uint by constructing a uint from it.