2011-08-09 77 views
1

創建新的紋理我掙扎試圖理解(如果可能的話用新GLHandle)如何創建一個新的紋理合並其他兩個在多重紋理相同的概念之後。我這樣做是因爲我使用ETC1壓縮紋理,女巫不支持Alpha通道,因此我想從另一個文件加載預先生成的Alpha通道,並在解壓縮後將它們「合併」。從多紋理

我知道multitexturing做到了這一點,但它意味着完全渲染兩個紋理(壓縮的+ alpha),對嗎?

而且,因爲我已經通過使用壓縮紋理出現在我的渲染管線大規模加速我這樣做。如果我用alpha通道重新創建它,它應該會保持性能優勢,對吧?

+0

沒有完全呈現兩個紋理(因此使用多重紋理),你會不會讓他們合併,因爲紋理是唯一未壓縮每次被讀取特定片段的時間。所以你不能只是解壓縮整個紋理併合併成一個。你可以做到這一點,但你最終會得到一個標準的未壓縮紋理,它不會爲你購買任何東西。片段着色器(przemo_li的答案)或固定功能multitexturing(我的答案)是唯一的途徑。 –

回答

1

我想你可以使用OpenGL ES 1.1使用多紋理和GL_COMBINE環境。首先,我們使用任何你想要的標準環境的顏色紋理:

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, rgbTexture); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //or maybe GL_REPLACE 

那麼對於阿爾法紋理,這勢必會第二單元中,我們只取前一個階段的彩色(顏色紋理),只使用紋理的alpha。

glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, alphaTexture); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
glTenEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); //default 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); //or maybe GL_REPLACE 
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);  //default 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); //default 
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS); //default 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); //default 

如果我誤解你了,你不希望使用多重紋理(既不片段着色),那麼你將無法在渲染過程中這兩種材質結合起來。也許採用多通道技術,但我不確定這是否會以性能方式向您購買任何產品。

0

你只需要片段着色器。

其中您將從這兩個紋理中混合顏色和alpha值。就這樣。 (顏色隨意使用,alpha值直接輸出)。

+0

片段着色器只是OpenGLES 2.0的形式嗎?我無法在1.0上做到這一點? – scooterman

+2

爲您的問題添加關於OpenGL ES版本的信息!這一點很重要。我不能幫助你,因爲對ES1.0/1.1瞭解不多 –