2013-03-03 86 views
3

讀取的圓圈更接近觀察者,並且紋理具有透明背景。OpenGL混合模式和深度緩衝區

(兩個物體都是相同大小的正方形,只是不同的紋理和x,z座標)。

我想:

enter image description here

但我有:

enter image description here

我知道我必須做一些與混合模式,也許深度緩衝,但我不確切地知道什麼。有人能幫我嗎?

當前的代碼加載質地:

public void initTexture(GL10 gl, Bitmap bitmap) { 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 

    int[] texture = new int[1]; 
    gl.glGenTextures(1, texture, 0); 

    textureId = texture[0]; 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); 

    GLUtils.texImage2D(GLES10.GL_TEXTURE_2D, 0, bitmap, 0); 
    bitmap.recycle(); 
} 

圖的相關部分,對每個對象:

gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

    gl.glFrontFace(GL10.GL_CW); 

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 

    gl.glDrawElements(GLES20.GL_TRIANGLES, indices.length, GLES10.GL_UNSIGNED_SHORT, indicesBuffer); 

謝謝!

注:我使用的OpenGL ES 1

回答

0

我認爲你必須改變你的混合功能:

嘗試:

gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_DST_ALPHA); 
+0

沒有改變任何東西,除了兩個物體的顏色現在更明亮(如柔和)。 – Ixx 2013-03-03 20:02:13

+0

哦,是的,我正在考慮'glAlphaFunc'是否嘗試過Bartek的解決方案?它似乎相關。 – Guian 2013-03-05 10:25:08

+0

是的,但它並不完整,我的第一次嘗試沒有改善任何東西...當我有時間時會嘗試更多。 – Ixx 2013-03-14 09:46:54

0

您應禁用寫深度緩存:

glDepthMask(false); 

然後先畫藍色的四邊形,然後把紅色的四邊形(靠近相機)畫出來。在繪製透明幾何圖形之後,您可能需要使用glDepthMask(true)再次啓用對深度緩衝區的寫入。

否則藍色四方被紅色的剔除。

+0

嗯...我有一個有點複雜的場景,但我只是從左到右繪製所有四邊形...我必須關心繪製順序嗎?對不起,如果問題很愚蠢,但OpenGL中已經有z座標,爲什麼我必須組織繪圖順序?我只是想透明的位圖讓我們看看背後是什麼...... – Ixx 2013-03-14 09:45:18

1

你不想混合,因爲這會混合顏色。你想要的是alphatesting。使用glEnable(GL_ALPHA_TEST)glAlphaFunc進行適當的設置。