1

非常に単純な2Dの正方形があり、テクスチャからゲームのスプライトをレンダリングします。テクスチャで透明にする必要がある領域が黒でレンダリングされることを除いて、これはすべて非常にうまく機能します。これらの透明な領域をレンダリングして、正方形の背後にあるオブジェクト(この場合は背景)を表示するにはどうすればよいですか?


関連する場合は、単純なフラグメントシェーダーを次に示します。

uniform sampler2D uTexture;
varying vec2 vImagePosition;
void main(){
    gl_FragColor =  texture2D(uTexture, vImagePosition);
}

そして頂点シェーダー:

attribute vec4 aPosition;
attribute vec2 aImagePosition;
uniform mat4 uMVPMatrix;
varying vec2 vImagePosition;
void main(){
    gl_Position = uMVPMatrix*aPosition;
    vImagePosition = aImagePosition;
}
4

2 に答える 2

4

数時間検索した後、私は実際に答えに出くわしました。ブレンディングをオンにする必要があります。これが他の人に役立つことを願っています。

GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
于 2012-12-10T06:21:13.077 に答える
1

透明な領域がスムーズに移行するように、透明な領域をアルファチャネルとしてエンコードすることをお勧めします。黒のRGB(0,0,0)カラーのみを使用している場合は、フラグメントシェーダーでこれを考慮に入れる必要があります。黒は色がないという意味ではなく、黒い色を意味します。OpenGLブレンディング状態を有効にして、ピクセル値をバッファーに書き込むときにフラグメントシェーダーから出てくるアルファチャネルが考慮されるようにします。例えば:

uniform sampler2D uTexture;
varying vec2 vImagePosition;
vec4 color;

void main(){
    color =  texture2D(uTexture, vImagePosition);
    if(color.r == 0 && color.g == 0 && color.b == 0){
        gl_FragColor = vec4(0,0,0,0);
    } else{
        gl_FragColor = color;
    }
}

(私は上記のコードがコンパイルされるかどうかをチェックしていません、それはあなたにアイデアを与えるためだけです)。

于 2012-12-10T05:52:35.833 に答える