Это не работает должным образом (WebGL 1.0):
precision highp float;
...
uniform float u_time;
attribute vec2 a_texCoord;
attribute vec2 a_animation;
varying vec2 v_texCoord;
void main() {
v_texCoord = a_texCoord;
if (a_animation.y == 13.0) {
v_texCoord.x += mod(u_time, a_animation.y) * 0.0625;
}
...
Это работает (заменив строку внутри if):
v_texCoord.x += mod(u_time, 13.0) * 0.0625;
У меня есть анимация с 13 кадры. Он должен проходить через кадры от 0 до 12, но в 1-й версии он выглядит как go от 1 до 13 (за пределами).
2-я версия работает точно так же, как и ожидалось, от 0 до 12.
Как эта разница вообще возможна? Чего мне не хватает?
Редактировать: я исправил это!
Я заменил мод следующей реализацией (можно найти здесь Получить точное целое число по модулю в шейдере WebGL ):
/**
* Returns accurate MOD when arguments are approximate integers.
*/
float modI(float a,float b) {
float m=a-floor((a+0.5)/b)*b;
return floor(m+0.5);
}
Если кто-то захочет объяснить, в чем заключалась проблема, я приму их ответ как правильный.
Редактировать: Я хотел бы добавить, встроенный -in мод работал для других кадров, таких как 2, 11, 12. Но для 13 это будет иметь проблему off-1)