GLSL - использование атрибута, который равен числу, не то же самое, что непосредственное использование числа - PullRequest
0 голосов
/ 27 марта 2020

Это не работает должным образом (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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...