2011年5月14日 星期六

OpenGL載入PNG時產生的透明異常 or 黑色邊邊 ( Android )

PNG 黑邊
白色史萊姆變灰色的

沒有黑邊的目錄
正常的白色史萊姆

圖截的有點不好,因為是在動的沒辦法正確抓圖=口=
不過說真的這樣一個OpenGL設定也實在太過分,
非常難用文字去解釋這樣的錯誤,而且誰會知道這樣的錯誤的原因叫做premultiplied alpha?
因此連爬GOOGLE都是一件苦惱的事,不管怎樣解決方法還是被找到了,但散播有錯誤程式碼的人也沒提醒=3=
PNG的透明異常是由於SRC的R,G,B分別已經先乘上SRC的Alpha(0~1)
所以當我們使用:
glBlendFunc(GL11.GL_SRC_ALPHA,GL11.GL_ONE_MINUS_SRC_ALPHA); 
並且用:
GLUtils.texImage2D(GL11.GL_TEXTURE_2D, 0, bmp, 0);
載入圖片Texture的時候,OpenGL的結果會出現
SRC_COLOR * SRC_ALPHA * SRC_ALPHA + (1-SRC_ALPHA)*DST_COLOR
而我們要的正確結果是
SRC_COLOR * SRC_ALPHA + (1-SRC_ALPHA)*DST_COLOR
因此用不適當的方法載入PNG圖片的RGB數值(有ALPHA的部分)會比正常值來的低!

※解決方法是用:
glBlendFunc(GL11.GL_ONE,GL11.GL_ONE_MINUS_SRC_ALPHA); 
但這方法會造成glColor4f無法使用,必須調回GL_SRC_ALPHA。
若用gl.glTexImage2D來載入圖片,就可以維持GL_SRC_ALPHA而不產生黑邊,但卻是一件苦差事:詳情點這http://groups.google.com/group/android-developers/browse_thread/thread/baa6c33e63f82fca
總之希望能幫助有遇到這個困難的人HAHA

1 則留言:

  1. 不错。我用AGAL写3D引擎也遇到了这个问题。Flash3D和opengl有很多相似的地方。

    回覆刪除