0

以下:

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

4

2 回答 2

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);
于 2012-12-09T12:20:55.723 回答
0

来自 OpenGL 规范glActiveTexture

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

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

于 2012-12-09T06:36:50.803 回答