Eli*_*ita 1 opengl casting glsl
在 C++ 中,您可以获取 unsigned int 的指针,并将其转换为指向有符号 int ( reinterpret_cast
) 的指针。
unsigned int a = 200;
int b = *(reinterpret_cast<int *>(&a));
Run Code Online (Sandbox Code Playgroud)
我需要将int
着色器中生成的结果存储为unsigned int
,以使用无符号整数内部格式写入纹理。GLSL 中是否有类似于 C++ 的reinterpret_cast 的替代方案?
在 C++(20 之前)中,允许以非常不同的方式表示有符号和无符号整数。C++ 不要求有符号整数是二进制补码;实现可以使用补码或其他表示形式。C++ 对有符号与无符号的唯一要求是可以将所有非负(或陷阱)有符号值转换为无符号值。
仅供参考:您的代码会因违反严格的别名规则(通过指向 Y 类型的不相关对象的指针访问 X 类型的对象)而产生 UB。尽管这在低级代码中有些常见,但 C++ 对象模型实际上不允许这样做。但我离题了。
我提出了所有有符号与无符号的内容,因为 GLSL 实际上定义了有符号整数的表示。在 GLSL 中,有符号整数是二进制补码。因此,GLSL 可以定义如何从整个范围的无符号值转换为有符号值,反之亦然,只需保留值的位模式即可。
这正是它的作用。因此,您不必使用铸造体操,只需进行无符号到有符号的转换,就像浮点到有符号或其他任何转换一样:
int i = ...
uint j = uint(i);
Run Code Online (Sandbox Code Playgroud)
此转换保留了位模式。
哦,C++20 似乎也加入了这一行列。