1

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を使用して方向を決定することで、おそらくもう少し高速化できます。

4

1 に答える 1

1

おそらく、シェーダーで計算を行うのではなく、幅が1ピクセルで、ビューポートと同じ高さの「フェードテクスチャ」を事前に計算するのが最善の策です。

このテクスチャでは、すべての画面yのフェード値を保存できます。

次に、シェーダーで、別のtexture2D呼び出しと乗算が残ります。

于 2012-07-07T00:16:32.390 に答える