glBindMultiTextureglEnableIndexed的语义是什么?

我已经看到glBindMultiTextureglEnableIndexed一起使用,似乎与例如glEnable(GL_TEXTURE_2D)尽管我不确定是否需要它,并且它是否可以代替glEnable(GL_TEXTURE_2D),还是应该同时使用?在glEnableIndexed的上下文中,DSA spec似乎没有提到glBindMultiTextureEXT

正确的用法是什么?

// Init 1

glEnable(GL_TEXTURE_2D);
for(int n = 0; n < 4; ++n)
    glEnableIndexed(GL_TEXTURE_2D, n);

// Init 2

for(int n = 0; n < 4; ++n)
    glEnableIndexed(GL_TEXTURE_2D, n);

// Init 3

glEnable(GL_TEXTURE_2D);


// For each frame 1

for(int n = 0; n < 4; ++n)
    glBindMultiTexture(GL_TEXTURE0 + n, GL_TEXTURE_2D, textureIds[n]);

// For each frame 2

for(int n = 0; n < 4; ++n)
{
    glEnableIndexed(GL_TEXTURE_2D, n);
    glBindMultiTexture(GL_TEXTURE0 + n, GL_TEXTURE_2D, textureIds[n]);
}

最佳答案

glEnableIndexed不存在。但是,glEnableIndexedEXT和glEnablei(等效于OpenGL 3.0的核心)一样。我假设您是在谈论他们。 glBindMultiTextureEXT也是如此。

现在,这种命名方式已经不合时宜,“使用正确”的含义还不是很清楚。

如果“ Init”代码的目的是在前四个固定功能纹理单元中启用GL_TEXTURE_2D进行固定功能使用,则1和2将执行此操作。 3将仅对当前纹理单元启用它。请注意,这仅用于固定功能纹理。

另一点在于:通常,您不像在初始化例程中那样简单地全局启用一堆纹理目标。仅当您在整个场景中渲染的所有内容在前四个纹理单元中使用4个2D纹理时,这才有意义。一般来说,您可以根据需要为每个对象启用和禁用纹理目标。

因此,我想说在初始化中不启用任何功能,而在渲染调用周围启用(和禁用)目标是“正确的用法”。

另外,请注意,这与直接使用glActiveTexture在这方面没有什么不同。因此,您正在使用DSA的无开关命令这一事实是无关紧要的。

关于c++ - glBindMultiTexture和glEnableIndexed的语义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13587226/

10-11 16:27