2012-08-29 31 views
-2

1我們可以在Global進行alpha測試嗎?OpenGL,關於alpha測試並繪製高效位圖

glEnable(GL_ALPHA_TEST); 
glAlphaFunc(GL_EQUAL, 0.7); 

使用這兩個功能,我們可以得出一個紋理並顯示該圖像,其中的α> = 0.7。我的問題是如果我繪製2紋理的某些部分重疊,他們的alpha總和爲0.7,如何顯示這部分?


2如何繪製位圖更有效

關於問題1,我嘗試一些功能在OpenGL中,並沒有達到。所以我嘗試另一種方式。我設置了map[512][512]。我首先在該地圖上繪製所有紋理並自己累積阿爾法。如果一個像素alpha> = 0.7,我設置它的顏色,如果沒有,我設置白色。最後,我將整個地圖作爲紋理繪製到窗口中。使用這種方法,我可以在全球範圍內實現alpha測試。但它非常非常慢。

(此方法來自鮑爾泰克Banachewicz在計算器)

這裏是我的功能:

  1. 初始化map[512][512]全部設置爲零

  2. 繪製這張地圖上的每一件事情,並積累阿爾法

  3. 循環地圖上的每個像素,根據那裏設置它們的顏色alpha

  4. 使用glTexImage2D()生成的紋理(我想這可能是緩慢的)使用glTexCoord2fglVertex3f得出這個窗口上

使用這種方法,我得出100的事情,它變得非常緩慢(約20 FPS)

我能做些什麼來優化這種方法還是有另一個成就是什麼?

+0

既然你引用了我 - 這只是一種方法。如果您使用軟件(基於CPU)處理實施它,它當然會很慢。關鍵是在兩個過程中都使用着色器(甚至是普通紋理/測試)。嘗試使用FBO而不是'map [512] [512]'。 –

+0

無論如何,相關http://stackoverflow.com/q/11915548/752976 –

+0

大聲笑,你幫我很多 – vvilp

回答

2

我的問題是,如果我畫2質地其中的某些部分重疊,他們的阿爾法和0.7,如何顯示此部分?

首先,一些術語:

你不能在所有繪製紋理。您只能繪製三角形,其中可能涉及將一個或多個紋理映射到它們。

如果你將兩個貼圖都映射到三角形,那麼你對它們的alpha值做什麼取決於你的着色器(或者如果你不使用着色器,那麼你的設置爲glTexEnv)。如果你正在分別繪製它們,那麼你不會繪製2個紋理。您正在繪製一個紋理,其次是另一個紋理。

除非你使用混合模式,否則第一個紋理畫了不能對影響第二。或第三個。

如何繪製位圖更有效

一般情況下,你。有幾種方法可以更高效地傳輸圖像數據(以pixel buffer objects爲中心進行異步傳輸,buffer streaming techniquesbuffer streaming techniques),但如果您所做的只是圖像傳輸,那麼正確的方法不是每幀都創建紋理。

你想要做的是給OpenGL所有你打算使用的圖像,然後使用紋理映射三角形(四邊形)將它們直接繪製到屏幕上。這是在做大量2D應用程序的大多數應用程序中完成的。

+0

謝謝你的回覆! – vvilp