2012-07-05 25 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电话,和乘法。