AndroidのOpenGLES2.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);
}
}
これをさらに2つのシェーダー(1つは上部用、もう1つは下部用)に分割するか、uFadeWidthを使用して方向を決定することで、おそらくもう少し高速化できます。