2012-07-29 308 views
1

我在遊戲正與一個朋友,我們正在使用OpenGL,供過於求,魔鬼,和C++來呈現的一切。簡單地說,我們使用的大多數.png都正確渲染,但隨機像素顯示爲白色。OpenGL渲染透明的PNG與隨機白色像素

這些像素分爲兩類。第一個是圖像邊緣的像素。這些是由於Photoshop中風功能(我正在嘗試修復)發生的反走樣造成的。第二個是更神祕的一個。當敵人靜止時,紋理看起來很好,但一旦它跳起來,它的頂部會出現一條隨機的白線。

enter image description here

在頂部的線是不同的堅固的(這個鏡頭是不是最固體)

這似乎是一個混合的問題,但我不熟悉的方式OpenGL的處理透明度(然而我們在這個問題上找不到任何關於堆棧溢出的其他問題,我們從透明度的代碼中學到了這一點)。我希望能解決這兩個問題,但我更擔心第二個問題。

我們當前的設置代碼:

glEnable (GL_BLEND); 
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glEnable(GL_TEXTURE_2D); 
glDisable(GL_DEPTH_TEST); 
+0

您對紋理使用什麼環繞模式? – Gigi 2012-07-30 18:12:05

回答

1

位圖的透明區域也有顏色。如果它是100%透明的,你通常看不到它。 Photoshop通常在這些區域填充白色。

如果使用縮小文件或放大鏡未GL_NEAREST標誌,那麼你將有插值。如果你在兩個像素之間進行插值,其中一個是藍色和不透明的,另一個是白色和透明的,那麼你將得到50%透明和淺藍色的東西。使用插值法時,您也可能會遇到與mimaps相同的問題。如果你使用mipmap,一個解決方案是自己生成它們。這樣,您可以在執行插值時忽略透明區域。看到一些很好的解釋在這裏:http://answers.unity3d.com/questions/10302/messy-alpha-problem-white-around-edges.html

你爲什麼要使用PNG文件?您節省了一些磁盤空間,但需要包含像魔鬼這樣的複雜庫。在交付應用程序時,您不會節省任何空間,因爲創建交付包的大多數工具都具有非常高效的壓縮。而且你不會在GPU上保存任何內存,這可能是最關鍵的。

+0

我會研究一下;我只使用.png,因爲它們是我使用透明度最多的文件類型。你會建議使用哪種文件類型? – 2012-07-29 20:29:54

+0

使用Windows'bmp'格式很簡單,加載它的源代碼適合於一個頁面。但是,如果你已經有了它並且能夠工作,那麼我想你可能還會繼續使用png。如果你正在製作一個完全商業化的應用程序,那麼你最終可能需要自己的專有格式。確保你學習魔鬼和其他子庫的許可證。 – 2012-07-29 20:34:43

+0

謝謝你的擡頭。通常我記得檢查這些內容是相當不錯的,但我認爲我的朋友的話是最有用的,並沒有在這種情況下。 – 2012-07-29 20:42:01

0

這看起來像源PNG中的工件。你確定那裏沒有這種不透明的像素嗎?

顯示在上面白行可能是從鄰居的紋理在紋理圖集紫外線插值誤差(或填充,如果你墊的NPOT紋理鍋白色不透明像素)。這就是爲什麼通常你需要在每個方向至少填充一個邊緣像素的紋理。儘管如此,這對mipmaps沒有幫助,正如Lars所說 - 您可能需要使用自定義mipmap生成或完全刪除它。