簡體   English   中英

OpenglES 2.0 PNG alpha紋理重疊

[英]OpenglES 2.0 PNG alpha texture overlap

我正在嘗試在屏幕上繪制具有Alpha通道的多個六邊形。 圖像是這樣的:

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

所以,我將紋理加載到程序中,這沒關系。 當它運行時,alpha通道與背景顏色混合即可,但是,當兩個六邊形重疊時,重疊的部分將成為背景的顏色! 圖片下方:

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上使用不同的函數,但似乎沒有任何工作..有誰知道問題是什么? 我真的迷路..如果需要更多的代碼只是問!

謝謝!

我的猜測是你需要在繪制這些時禁用深度測試。 由於它們都出現在相同的深度,當你繪制最左邊的環時,它會為四邊形中的每個像素寫入深度緩沖區,甚至是透明的。

然后,當您向右繪制下一個四邊形時,重疊的像素不會被繪制,因為它們未通過深度測試,因此您只需獲得一個與第一個四邊形相交的空白區域。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM