2012-12-09 20 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);