1

我已将我的案例缩小到这个简单的 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,它可以正常工作。

4

1 回答 1

1

您的除法结果是 1443360.833333333

本规范https://www.khronos.org/registry/OpenGL/specs/es/3.0/GLSL_ES_Specification_3.00.pdf

在“12.33 整数除法的舍入”部分的第 144 页上,它询问整数除法是否应舍入,答案是“解决方案:此版本的规范未定义舍入模式”。

因此,考虑到该规范,即使不是最有用的,您看到的结果当然似乎是有效的。

该规范适用于 GLSL ES 3.00,它可能不是您正在使用的,但我现在找不到另一个规范提到这一点,但这似乎至少表明您的结果在给定规范的情况下是有效的,即使不是什么你希望

于 2020-07-20T10:43:41.390 回答