2012-07-31 143 views
3

我試圖繪製具有alpha通道屏幕上的多個六邊形。形象是這樣的:OpenglES 2.0 PNG阿爾法紋理重疊

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使用diferent功能,但似乎沒有工作..有誰知道問題是什麼?我真的失去了..如果需要更多的代碼只是問!

謝謝!

+0

你有任何機會啓用深度測試? – Tim 2012-08-01 17:09:22

+0

是的,我確實..我在onSurfaceCreated函數中啓用它。我認爲這個migth一直在混合,但不會改變混合類型,紋理仍然在這個奇怪的alpha重疊。 – rdnobrega 2012-08-02 10:28:46

回答

6

我的猜測是,你需要禁用深度測試畫這些的時候。由於它們全都出現在同一深度,所以當繪製最左邊的環時,它會寫入四邊形中每個像素的深度緩衝區,即使是透明的也是如此。

然後當你畫下一個四邊形的權利,重疊像素不要糾纏,因爲他們失敗的深度測試,所以你只要得到它與第一四相交的空白區域。

+0

它工作完美!我永遠不會猜測..謝謝! =) – rdnobrega 2012-08-03 10:07:20