OpenGL,禁用纹理单元、glActiveTexture 和 glBindTexture

Posted

技术标签:

【中文标题】OpenGL,禁用纹理单元、glActiveTexture 和 glBindTexture【英文标题】:OpenGL, disabling a texture unit, glActiveTexture and glBindTexture 【发布时间】:2011-09-25 19:33:13 【问题描述】:

如何关闭纹理单元,或者至少在绑定纹理时防止其状态发生变化?我正在使用着色器,所以我认为没有 glDisable 。问题是事件链可能看起来像这样:

Create texture 1 (implies binding it)
Use texture 1 with texture unit 1
Create texture 2 (implies binding it)
Use texture 2 with texture unit 2

,但是考虑到 glActiveTexture 语义,这似乎是不可能的,因为纹理 2 的创建将与纹理单元 1 的状态相关联,因为那是我调用 glActiveTexture 的最后一个单元。即你必须写:

Create texture 1
Create texture 2
Use texture 1 with texture unit 1
Use texture 2 with texture unit 2

我当然已经简化了这个例子,但是创建和绑定纹理可能会偶然影响当前活动的纹理单元,即使您只是将纹理绑定作为创建过程的一部分,这让我有点不舒服.当然,除非我在这里犯了一个错误,并且我可以做些什么来禁用当前 glActiveTexture 中的状态更改?

感谢您在这里给我的任何帮助。

【问题讨论】:

【参考方案1】:

这几乎是您在 OpenGL 中必须学会使用的东西。 GL 函数只影响当前状态。所以要修改一个对象,你必须把它绑定到当前状态,然后修改它。

不过,一般来说,您应该没有问题。没有理由在绑定它们以供使用的同一位置创建纹理。实际遍历您的场景并绑定纹理以进行渲染的代码应该从不创建纹理。渲染代码应该为每个渲染建立所有必要的状态(除非它知道所有必要的状态都是在这个渲染调用中建立的)。所以它应该绑定每个对象需要的所有纹理。所以之前创建的纹理将被驱逐。

一般来说,我建议在创建后解除绑定纹理(即:glBindTexture(..., 0))。这可以防止他们留下来。

记住:当你绑定一个纹理时,你也解除了当前绑定的任何纹理。所以纹理函数只会影响新对象。

但是,如果您想依赖 EXT 扩展,则有 EXT_direct_state_access。它受到 NVIDIA 和 AMD 的支持,因此相当广泛。它允许您在不绑定对象的情况下修改对象,因此您可以在不绑定对象的情况下创建纹理。

【讨论】:

我刚刚读到 EXT_direct_state_access 还没有完成,所以我想我会避免它。但总的来说不,我不打算像那样交错进行纹理创建和绑定,但这确实让我觉得在某些时候我会得到一个黑色的表面并且很难追踪它!

以上是关于OpenGL,禁用纹理单元、glActiveTexture 和 glBindTexture的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 纹理映射禁用着色

没有纹理图像单元的 Opengl 纹理

Opengl 和 Webgl:从附加到当前帧缓冲区的纹理中采样

openGL之API学习(一九六)纹理单元名和纹理单元的管理

openGL之API学习(一九九)纹理单元和纹理对象的关系

opengl - glBindTexture 是不是覆盖活动纹理单元的内容