2012-12-09 32 views
0

以下:glActiveTexture不起作用

glActiveTexture(GL_TEXTURE0 + 0); 

unsigned i, w; 
unsigned tex_test = Memento::_LoadImageIntoTexture("ground.png", i, w); 

glBindTexture(GL_TEXTURE_2D, tex_test); 
glUniform1ui(program.GetUniformLocation("tex"), 0); 

會運行良好,我希望將圖像正常顯示。但是...

glActiveTexture(GL_TEXTURE0 + 1); 

unsigned i, w; 
unsigned tex_test = Memento::_LoadImageIntoTexture("ground.png", i, w); 

glBindTexture(GL_TEXTURE_2D, tex_test); 
glUniform1ui(program.GetUniformLocation("tex"), 1); 

當我嘗試將活動紋理更改爲0以外的任何值時,不顯示任何內容。這讓我瘋狂,因爲我找不到任何解決方案,而且沒有任何意義。幫幫我?

+0

經過glGetError:

無論如何,如果你改變你的代碼,這會發生什麼? – Tim

+0

是的,很明顯。 – Shokwav

+0

看起來很乍看,但這一切都取決於這個'Memento :: _ LoadImageIntoTexture'函數實際上做了些什麼...它是在製作一個GL_TEXTURE_2D還是它亂七八糟的東西?也許它強制紋理通道0?加載後嘗試激活紋理通道。 – Grimmy

回答

0

從OpenGL的規格爲glActiveTexture

紋理單元由紋理的使能狀態,紋理矩陣堆棧,紋理環境和當前綁定的質地。修改這些狀態​​中的任何一個只會影響活動紋理單元。

如果您使用非默認值,您可能忘記了致電glEnable(GL_TEXTURE_2D)和/或glTexEnv(...)

+2

這兩個都在3.1核心(我正在使用)中棄用。 – Shokwav

+1

在問題中指定GL版本是件好事:) – Grimmy

0

我的猜測是紋理加載函數與活動紋理單元混淆。就我個人而言,我認爲應該引入一個新的「代理」紋理單元,它不能作爲一個簡單的源,但可以用於加載圖像數據。這將允許執行紋理加載而不會破壞紋理單元的狀態。

unsigned i, w; 
unsigned tex_test = Memento::_LoadImageIntoTexture("ground.png", i, w); 

unsigned int texture_unit = 1; 
glActiveTexture(GL_TEXTURE0 + texture_unit); 
glBindTexture(GL_TEXTURE_2D, tex_test); 
glUniform1ui(program.GetUniformLocation("tex"), texture_unit);