2011-09-07 121 views
1

如何使用alpha渲染紋理?如何渲染帶有alpha的紋理?

我有一個紋理,需要在不同的位置使用不同的alpha值來渲染它。任何方式來這樣做? (我的紋理是GL_RGBA)

如果無法在飛行中更改alpha值,我必須爲不同的alpha級別創建不同的紋理?

+1

什麼結構保存圖像? –

+0

我有一個DIB數據(從HBITMAP轉換而來),然後我從DIB創建紋理,但是創建紋理之後剛剛刪除了DIB數據。 (即:免費(dib_data_handle);) – jondinham

回答

2

您的紋理是GL_RGBA,所以它具有爲每個紋理元素不同的alpha值。

如果要更改用於渲染的阿爾法值,我能想到以下方法:

  • 改變紋理α值(不知道你說你不想做, )。使用glColor4f更改頂點的alpha值。它會乘以紋理值。您可能需要使用glEnable(GL_COLOR_MATERIAL)和/或glColorMaterial()
  • 使用頂點着色器來更改頂點alpha值。它會乘以紋理值。
  • 使用片段着色器即時更改採樣的紋理值。
  • 使用兩個紋理階段並將它們相乘。第二個將具有修改後的alpha值(請參閱glActiveTexture()和朋友)。
  • 使用片段着色器和兩個(或更多)紋理階段。這是最酷的!
+0

我想要的是從每個像素減少一半的alpha,我應該選擇哪種解決方案? – jondinham

+1

只要啓用了顏色,只要glColor4f(1,1,1,0.5f)應該這樣做。 – rodrigo

+0

我需要啓用GL_BLEND,並且在生成紋理時我必須使用GL_MODULATE? – jondinham

3

首先,確保你的紋理有一個alpha通道。您提到您正在加載RGBA格式,但在圖像編輯程序中檢查原始文件總是很好。然後確保您的紋理已準備好在openGL中渲染。一個常見的錯誤是忘記通過glTexParameter*設置紋理的過濾模式。它開始於需要的貼圖的設置,所以我覺得這是最容易入手:

glTexParameteri(GL_TEXTURE_2D, GL_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_MAG_FILTER, GL_LINEAR); 

其次,你將需要設置的openGL以準備混合。這涉及與GL_BLENDglBlendFunc呼叫的glEnable呼叫。大多數情況下,您會希望函數調用爲glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),因爲大多數其他的令牌組合會爲您提供以後沒有的效果(有關更多信息,請參閱glBlendFunc規範頁面)。

最後,確保您在不同的點對您的紋理進行採樣。如果您正在使用即時模式(使用glVertex*繪製場景),則需要使用glTexGen*或在致電glVertex*前使用glTexCoord*手動指定紋理點。如果使用陣列數據繪製場景,請確保使用glEnableClientState(GL_TEXTURE_COORD_ARRAY)glTexCoordPointer啓用了紋理指針。