В настоящее время я работаю с 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
Я обновил свои драйверы и снова проверил, те же результаты. Еще раз не воспроизводится на рабочем столе. Согласно документам GLSL на mod возможные комбинации параметров: GenType, float) и (GenType, GenType) (без двойного числа, так как у нас ‹ 4.0). Также возвращаемый тип принудительно плавает, но это не должно иметь значения для этой проблемы.
!(abs(mod(x, y)) >= abs(y))
должен ВСЕГДА быть истинным. Ломать то, что ломает мод для графических программ. (странное !...›= таково, что оно всегда верно и для значений NaN). - person Chris Dodd   schedule 02.09.2019