glActiveTexture不起作用

时间:2012-12-09 06:16:50

标签: c++ opengl glsl

以下内容:

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以外的任何值时,不会显示任何内容。这让我发疯,因为我找不到任何解决方案,这没有任何意义。帮助

2 个答案:

答案 0 :(得分:0)

来自glActiveTexture的OpenGL规范:

  

纹理单元由纹理启用状态,纹理矩阵堆栈,纹理环境和当前绑定纹理组成。修改任何这些状态仅对活动纹理单元有效。

如果您使用非默认值,则可能忘记致电glEnable(GL_TEXTURE_2D)和/或glTexEnv(...)

答案 1 :(得分: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);