1

EDIT 1:含まれるシェーダー

EDIT 2:含まれるスクリーンショット

EDIT 3 : 元のテクスチャのスクリーンショットが含まれています

編集4

EDIT 5 :問題は、ビットマップに最初から部分的に透明なピクセルがあるためだと思うので、ここで与えられた答えがこの質問に対して正しいので、新しい質問をします。

よく調べてみると、問題が完全に解決されたようには見えず、色が正しく見えません。

String strFShader =
        "precision mediump float;" +
        "uniform float Opacity;" +
        "varying vec2 v_texCoords;" +
        "uniform sampler2D u_baseMap;" +
        "void main()" +
        "{" +
        "gl_FragColor = texture2D(u_baseMap, v_texCoords);" +
        "gl_FragColor.a *= Opacity;"+            
        "}";

そして、私のレンダリング方法では:

    //Enable and set mode
    GLES20.glEnable(GLES20.GL_BLEND); 
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);

//Draw
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

//Disable
GLES20.glDisable(GLES20.GL_BLEND);

したがって、最大の透明度 (0.0) で問題ありません。つまり、何も描画されません。ただし、他のレベルではまったく正しくありません。たとえば、透明度がゼロ (不透明度が 1.0 に設定) の場合、次のようになります。

![ここに画像の説明を入力][1]

しかし、実際には次のようになります。

![ここに画像の説明を入力][2]

色が少し暗すぎるように見え、(元の画像では) わずかに暗いエッジが非常に目立ちます。

ブレンドモードと関係があると思いますか?基本的に、あるレイヤーの不透明度を別のレイヤーに変更するときにフォトショップで得られる可能性のある効果を求めているだけです。他の提案は非常に役に立ちます。

ここにある解決策も試しました:

https://gamedev.stackexchange.com/questions/7260/opengl-es-basic-fragment-shader-help-with-transparency

しかし、私は同じ結果を得ますか?

ありがとう :-)

4

1 に答える 1

4

まず、に変更glBlendFuncしますglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

不透明度を使用したレンダリングは、 への呼び出し後に実行される描画操作中にバインドされるシェーダー プログラムによって処理されglBlendFuncます。より具体的には、これはバインドされたプログラムのフラグメント シェーダーの gl_FragColor 出力のアルファ コンポーネントによって指定されます。次のフラグメント シェーダーは、シェーダー プログラムを使用してフェード効果を実現する方法の非常に簡単な例を示しています。

precision mediump float;
uniform float Opacity; // range 0.0 to 1.0
varying vec2 v_texCoords;
uniform sampler2D u_baseMap;

void main(void)
{
    gl_FragColor = texture2D(u_baseMap, v_texCoords) ;
    gl_FragColor.a *= Opacity;
}

前景レイヤーの現在の不透明度をシェーダー プログラム uniform にバインドする場所Opacity。あなたの場合、前景レイヤーをフェードインさせたいので、スムーズなフェードを実現するために、操作間の時間ステップを選択して、完全な描画操作(背景レイヤーと前景レイヤー)を何度も実行するだけです。

また、前景オブジェクトを描画した後は、毎回ブレンド状態を無効にすることを忘れないでください。OpenGL では、操作が完了したら値を以前の状態にリセットすることを常にお勧めします。これを忘れると、深刻な頭痛の種になる可能性があります。

于 2013-03-29T08:23:10.920 に答える