我目前正在使用 GLSL 330 并遇到了 mod() 函数的一些奇怪行为。我在 Windows 8 下使用 Radeon HD 6470M 工作。我无法在使用 Windows 7 和 GeForce GTX 260 的台式电脑上重新创建此行为。
这是我的测试代码:
float testvalf = -126;
vec2 testval = vec2(-126, -126);
float modtest1 = mod(testvalf, 63.0); //returns 63
float modtest2 = mod(testval.x, 63.0); //returns 63
float modtest3 = mod(-126, 63.0); //returns 0
编辑:
以下是在 IceCools 建议之后完成的更多测试结果。
int y = 63;
int inttestval = -126;
ivec2 intvectest(-126, -126);
float floattestval = -125.9;
float modtest4 = mod(inttestval, 63); //returns 63
float modtest5 = mod(intvectest, 63); //returns vec2(63.0, 63.0)
float modtest6 = mod(intvectest.x, 63); //returns 63
float modtest7 = mod(floor(floattestval), 63); //returns 63
float modtest8 = mod(inttestval, y); //returns 63
float modtest9 = mod(-126, y); //returns 63
我更新了驱动程序并再次测试,结果相同。再次无法在桌面上重现。根据mod上的 GLSL 文档,可能的参数组合是 (GenType, float) 和 (GenType, GenType) (没有双精度,因为我们小于 4.0)。返回类型也被强制浮动,但这对这个问题无关紧要。