glActiveTexture 不起作用

glActiveTexture Doesn't Work

本文关键字:不起作用 glActiveTexture      更新时间:2023-10-16

以下内容:

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

来自 OpenGL 规范的 glActiveTexture

纹理

单元由纹理启用状态、纹理矩阵堆栈、纹理环境和当前绑定的纹理组成。修改这些状态中的任何一种只会对活动纹理单元产生影响。

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

我的猜测是纹理加载功能与活动纹理单元混淆了。我个人认为应该引入一个新的"代理"纹理单元,它不能用作映射源,但可用于加载图像数据。这将允许在不弄乱纹理单元状态的情况下执行纹理加载。

无论如何,如果您将代码更改为以下内容会发生什么:

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);