0

そのため、以下に示すように、一種のジグザグ パターンがあります。ジグザグ パターン、次のフラグメント シェーダーによって作成されます。

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, .1)?

4

1 に答える 1

1

あなたがそれをすることができる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 ]);
}
于 2012-01-29T22:21:36.090 に答える