2

我想讓我的點精靈顯示正確的不透明度。在Android上使用OpenGL ES 2.0的雪碧不透明度

最初,我在一個黑色的正方形上得到了我的精靈紋理。

所以,我增加了以下我的片段着色器:

"if(color.a < 0.5) "+ 
       "discard;"+ 

現在,這似乎工作,在我的精靈顯示沒有黑色的背景,但是,我的質地本身是「部分透明」 - 並沒有表現出這種局部透明度,它顯得堅實。這有點難以解釋,但我希望你明白我的意思。如果我使用canvas/surfaceview繪製相同的紋理,它將正確顯示。

基本上我試圖讓我的紋理以原始格式顯示(即他們在創建它們的軟件中 - 即Gimp/photoshop等)。

希望得到任何幫助 - 感謝

回答

6

首先確保你的紋理是由透明的PNG圖像加載通過Bitmap有兩種RGBA_8888RGBA_4444配置,這樣你就不會失去alpha通道。

其次,您需要啓用GL_BLENDglEnable()命令。在Android上,你會這樣寫:GLES20.glEnable(GLES20.GL_BLEND);。這使您可以將已繪製的顏色與新顏色混合,實現透明效果。 融合功能應設置爲GL_ONE, GL_ONE_MINUS_ALPHA定期透明度:glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); GL_SRC_ALPHA, GL_ONE_MINUS_ALPHA定期透明度:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

最後,你並不需要使用丟棄,只需設置gl_FragColor到4分矢量與阿爾法在第四個通道中(這是從採樣器讀取紋理時得到的),例如如果你願意,你可以做gl_FragColor = texture2D(sampler, texCoord);

您將很可能不得不關閉深度測試glDisable(GL_DEPTH_TEST)以避免未分類三角形的問題。

您可以閱讀關於透明度here的更多信息。

+0

謝謝@Jave,我用你的建議,我已經刪除了碎片着色器的丟棄部分,雖然現在沒有黑盒,但它看起來不正確 - 紋理現在是'透明',但有它周圍的黑色輪廓和圖像是比它應該更沉悶 - (太透明??)將不勝感激,如果您有任何其他建議 - 謝謝 – Zippy 2013-03-22 12:55:31

+1

我想通了 - 我需要使用GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);連同你的建議 - 謝謝你指出我在正確的方向! – Zippy 2013-03-22 13:44:41

+0

是的,我忘了這一步,但更新了我的答案:) – Jave 2013-03-22 14:18:07