Анимация шейдера, который использует массив для раскраски - PullRequest
0 голосов
/ 30 января 2012

Итак, у меня есть своего рода зигзагообразный паттерн, как показано ниже. ZigZag Pattern, который создается следующим фрагментным шейдером:

uniform float time;
varying vec2 texture_coord;
void main()
{
    float wav[10] = float[10](0,.1,.2,.1,0,-.1,-.2,-.1,0,.1);
    //gl_FragColor = gl_Color;
    float mod_time = mod(time, 1);
    float x_pos = mod(texture_coord.x, 1.1);
    float x_pos2 = x_pos * 10;
    int index = int(x_pos2);
    if(texture_coord.y < .5 + wav[index])
        gl_FragColor = vec4(.7,.3,.3,1.0);
    else
        gl_FragColor = vec4(.3,.3,.3,1.0);
}

, который я хотел бы анимировать, перемещая зигзаг вверх.

Мой вопрос: как мне это сделать, учитывая, что я использую массив для создания смещения от медианы?Я не совсем уверен, как бы я настроил массив так, чтобы на следующем шаге анимации массив выглядел следующим образом (.1, .2, .1,0, -. 1, -. 2, -. 1,0,0,1)

1 Ответ

1 голос
/ 30 января 2012

Есть 2 способа сделать это. Вы можете либо анимировать смещение в массив (возможно, самое простое), либо вы можете анимировать сам массив. Вы уже передаете параметр времени, так что вы можете использовать его, например, так:

if (texture_coord.y < 0.5 + wav [ (index + (mod_time * 10)) % 10 ]) // Note you may have to calculate the "%" operator yourself
... etc. ...

Или вы можете передать массив. Чтобы передать массив, вы просто получаете единое местоположение первого элемента массива и увеличиваете его для последующих значений. Итак, в вашем исходном коде вы можете сделать это:

Фрагмент шейдера:

uniform float wav [ 10 ];
... rest of fragment shader ...

Исходный код:

wavLoc = glGetUniformLocation (program, "wav");
offset++; // This starts at 0 and is incremented on each frame you want to advance the pattern
for (int i = 0; i < 10; i++)
{
    glUniform1f (wavLoc + i, wavePattern [ (i + offset) % 10 ]);
}
...