c++ - glBindMultiTexture 和 glEnableIndexed 的语义?

标签 c++ c opengl

glBindMultiTextureglEnableIndexed 的语义是什么?

我见过 glBindMultiTextureglEnableIndexed 一起使用,它似乎类似于例如glEnable(GL_TEXTURE_2D) 虽然我不确定它是否是必需的,以及它是否取代 glEnable(GL_TEXTURE_2D) ,还是应该同时使用? DSA specglBindMultiTextureEXT 的上下文中似乎没有提及 glEnableIndexed

正确的用法是什么?

// 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/

相关文章:

c++ - std::lock_guard 和 #pragma omp critical 之间的区别

c++ - 为什么在调用 reset() 时,通过 unique_ptr 创建的内存没有被正确删除?

带有水果的 C++ 依赖注入(inject)

c++ - 我不明白为什么这段代码无法打开文件

c - 循环提前终止程序

java - 使用 OpenGL 更改 Java 中纹理中的某些颜色

c - tcp socket hungry 程序是否会干扰文件系统 I/O

c - 姓名和姓氏搜索功能将无法使用。为什么?

opengl - 怎么做对应2D-3D点

opengl - glBufferData 中目标参数的意义是什么