2012-12-10 67 views
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

其實我幾個小時的搜索後,通過這個答案跌跌撞撞。你必須開啓混合。希望這有助於他人。

GLES20.glEnable(GLES20.GL_BLEND); 
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 
1

你可能喜歡你編碼透明區域的Alpha通道,使透明區域有一個平穩的過渡。如果您只使用黑色RGB(0,0,0)顏色,則應在片段着色器中考慮此問題。黑色並不意味着沒有顏色,意味着黑色。啓用OpenGL混合狀態,以便在將像素值寫入緩衝區時考慮來自片段着色器的Alpha通道。例如:

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; 
    } 
} 

(我沒有檢查是否上面的代碼編譯,它只是給你一個想法)。

+0

我可能已經在誤導我的語言。我的意思是說,原始圖像在精靈的背景透明度(不是黑色),但OGL被渲染它爲黑色。 我不能讓你的shader例子鏈接。它不斷出錯,但我找不到錯誤。 – xtraorange

+0

我很高興你發現了這個問題。這就是我所說的「啓用OpenGL混合狀態,以便將來自片段着色器的Alpha通道考慮在內」。乾杯。 – Trax

+0

啊,謝謝你的幫助,我很感激。 – xtraorange