【发布时间】:2020-11-09 11:31:36
【问题描述】:
我已将我的案例缩小到这个简单的 GLSL 代码:
uniform int zeroUniform; // Always set to zero, it is there so that the code is not optimized out
out int c;
int a = 8660165;
int b = 6;
c = (a + zeroUniform) / b;
当我将它放入着色器并使用 RenderDoc 检查着色器时,它显示 c 是 1443361!但它应该是 1443360。到底发生了什么?在十六进制中,8660165 是 0x8424C5,因此在符号位可以改变计算之前有一个完整的字节空闲。我错过了什么还是这是一个 GPU 错误?
OpenGL 4.6 内核,在 AMD RX 5700 XT 上测试。我也尝试过使用 uint 而不是 int,它可以正常工作。
【问题讨论】:
-
有趣的问题。另一种可能性(虽然不太可能)是您的驱动程序使用舍入函数而不是预期的 floor 函数实现浮点到整数截断?
-
@jackw11111:这段代码中不应该有 float -> int 转换。
-
@BDL 我的错误,我的意思是从将浮点数分配给 int 的截断可能是 ceil() 而不是 floor()。
-
当前计算为
int = (int + int) / int;。不涉及浮点数。正确实施时,永远不应该有 float -> int 赋值。 -
这可能是一个驱动错误,AMD Navi 没有内置整数除法,所以它是在软件中模拟的。您可以检查实际发生的情况