在C ++中,您可以获取unsigned int的指针,并将其转换为指向signed int(reinterpret_cast
)的指针。
unsigned int a = 200;
int b = *(reinterpret_cast<int *>(&a));
我需要将着色器中生成的int
存储为unsigned int
,以便写入具有无符号整数内部格式的纹理。在GLSL中有没有类似于C ++的reinterpret_cast的替代方案?
答案 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.