3

アルファチャネルを持つ複数の六角形を画面に描画しようとしています。画像はこれです:

http://img834.imageshack.us/img834/571/hexagon.png

だから、私はテクスチャをプログラムにロードし、それは大丈夫です。実行すると、アルファチャネルが背景色とブレンドされます。これで問題ありませんが、2つの六角形が重なると、重なった部分が背景色になります。写真の下:

http://img259.imageshack.us/img259/213/20120731163847.png

もちろん、これは私が期待した効果ではありません。この背景が他のテクスチャの上に描画されることなく、それらを重ねてほしいです。これが私の描画コードです:

    GLES20.glUseProgram(Program);

    hVertex  = GLES20.glGetAttribLocation(Program,"vPosition");
    hColor   = GLES20.glGetUniformLocation(Program, "vColor");
    uTexture = GLES20.glGetUniformLocation(Program, "u_Texture");
    hTexture = GLES20.glGetAttribLocation(Program, "a_TexCoordinate");
    hMatrix  = GLES20.glGetUniformLocation(Program, "uMVPMatrix");

    GLES20.glVertexAttribPointer(hVertex, 3, GLES20.GL_FLOAT, false, 0, bVertex);
    GLES20.glEnableVertexAttribArray(hVertex);
    GLES20.glUniform4fv(hColor, 1, Color, 0);
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, hTexture);
    GLES20.glUniform1i(uTexture, 0);
    GLES20.glVertexAttribPointer(hTexture, 2, GLES20.GL_FLOAT, false, 0, bTexture);
    GLES20.glEnableVertexAttribArray(hTexture);

    GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);
    GLES20.glEnable(GLES20.GL_BLEND);

    x=-1;y=0;z=0;
    for (int i=0;i<10;i++) {
        Matrix.setIdentityM(ModelMatrix, 0);
        Matrix.translateM(ModelMatrix, 0, x, y, z);
        x+=0.6f;
        Matrix.multiplyMM(ModelMatrix, 0, ModelMatrix, 0, ProjectionMatrix, 0);
        GLES20.glUniformMatrix4fv(hMatrix, 1, false, ModelMatrix, 0);
        GLES20.glDrawElements(GLES20.GL_TRIANGLES, DrawOrder.length, GLES20.GL_UNSIGNED_SHORT, bDrawOrder);
    }

    GLES20.glDisable(GLES20.GL_BLEND);
    GLES20.glDisableVertexAttribArray(hVertex);
}

そして私のフラグメントシェーダー:

public final String fragmentShaderCode =
        "precision mediump float;" +
        "uniform vec4 vColor;" +
        "uniform sampler2D u_Texture;" +
        "varying vec2 v_TexCoordinate;" +
        "void main() {" +
        "  gl_FragColor = vColor * texture2D(u_Texture, v_TexCoordinate);" +
        "}";

と私のレンダラーコード:

    super(context);
    setEGLContextClientVersion(2);
    getHolder().setFormat(PixelFormat.TRANSLUCENT);
    setEGLConfigChooser(8, 8, 8, 8, 8, 8);
    renderer = new GLRenderer(context);
    setRenderer(renderer);

私はすでにglBlendFuncで別の関数を使おうとしましたが、何も機能していないようです。問題が何であるかを誰かが知っていますか?私は本当に迷子になっています。もうコードが必要な場合は、質問してください。

ありがとうございました!

4

1 に答える 1

7

私の推測では、これらを描画するときは深度テストを無効にする必要があります。それらはすべて同じ深度で表示されるため、左端のリングを描画すると、透明なものも含め、クワッド内のすべてのピクセルの深度バッファに書き込まれます。

次に、次のクワッドを右に描画すると、深度テストに失敗するため、オーバーラップするピクセルは描画されません。したがって、最初のクワッドと交差する空白の領域が表示されます。

于 2012-08-02T15:58:39.580 に答える