2012-01-29 102 views
0

所以我有一種Z字形圖案,如下所示。 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); 
} 

,我想通過向上具有Z字形移動的動畫。

我的問題是,考慮到我使用數組來創建中位數的偏移量,我該如何做到這一點?我不完全確定如何調整數組,以便在下一個動畫步驟中,數組看起來像(.1,.2,.1,0, - 。1, - 。2, - 。1,0, 0.1)?

回答

1

有兩種方法可以做到這一點。您可以將偏移量設置爲數組(可能是最簡單的),也可以爲數組本身設置動畫。你已經傳遞了一個時間參數,所以你可以使用它,就像這樣:

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 ]); 
}