2012-07-05 26 views
1

我想創建Android上的OpenGL ES 2.0的滾動列表,我想我的列表的內容淡出作爲列表到達頂部或底部。現在我在一個片段着色器實現這一點,但它是非常緩慢的。衰落效應對OpenGL ES的滾動列表2.0

這裏是我的着色器

precision mediump float; 

uniform bool uEnableTexture; 
uniform sampler2D uTexture; 
uniform bool uEnableFade; 
uniform float uTopFade; 
uniform float uBottomFade; 
uniform float uFadeWidth; 

varying vec4 vPosition; 
varying vec2 vTexCoord; 
varying vec4 vColor; 

void main(){ 
    if (uEnableTexture) { 
     gl_FragColor = texture2D(uTexture, vTexCoord) * vColor; 
    } else { 
     gl_FragColor = vColor; 
    } 

    if (uEnableFade) { 
     if (vPosition.y > uTopFade) { 
      gl_FragColor = gl_FragColor * 0.0; 
     } else if (vPosition.y > uTopFade - uFadeWidth) { 
      gl_FragColor = gl_FragColor * (1.0 - (vPosition.y - (uTopFade - uFadeWidth))/uFadeWidth); 
     } else if (vPosition.y < uBottomFade) { 
      gl_FragColor = gl_FragColor * 0.0; 
     } else if (vPosition.y < uBottomFade + uFadeWidth) { 
      gl_FragColor = gl_FragColor * (1.0 + (vPosition.y - (uBottomFade + uFadeWidth))/uFadeWidth); 
     } 
    } 
} 

這是我想達到的效果。 Effect screenshot

有沒有更有效的方式來實現這一目標?

編輯:我能夠通過使用單獨的程序,並使用只有當我需要淡出這個shader來改善這個有很多。

void main(){ 
    gl_FragColor = texture2D(uTexture, vTexCoord) * vColor; 

    if (vPosition.y > uTopFade - uFadeWidth) { 
     gl_FragColor = gl_FragColor * (1.0 - (vPosition.y - (uTopFade - uFadeWidth))/uFadeWidth); 
    } if (vPosition.y < uBottomFade + uFadeWidth) { 
     gl_FragColor = gl_FragColor * (1.0 + (vPosition.y - (uBottomFade + uFadeWidth))/uFadeWidth); 
    } 
} 

我也許可以加快速度更受分成兩個着色器,一個頂部和一個底部,或使用uFadeWidth確定方向這一點。

回答

1

您最好的選擇可能不是做數學題的着色器,但要預先計算「褪色的質感」,這將是1個像素寬,並作爲「高」爲您的口中。

在此紋理中,您可以存儲每個屏幕的漸變值

然後,在你的着色器,你會留下另一個texture2D電話,和乘法。