我正在尝试在 Android 上的 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);
}
}
}
这是我想要达到的效果。
有没有更有效的方法来实现这一目标?
编辑:我可以通过使用单独的程序并仅在需要淡入淡出时使用此着色器来改进这一点。
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 来确定方向。