glBindMultiTexture
和glEnableIndexed
的语义是什么?
我已经看到glBindMultiTexture
与glEnableIndexed
一起使用,似乎与例如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/