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

时间:2011-09-25 19:33:13

标签: opengl textures

当我绑定纹理时,如何关闭纹理单元,或者至少防止其状态发生变化?我正在使用着色器,因此我没有想到这个没有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 个答案:

答案 0 :(得分:4)

这几乎是你必须要学会在OpenGL中使用的东西。 GL功能仅影响当前状态。因此,要修改对象,必须将其绑定到当前状态,然后对其进行修改。

但一般情况下,您应该没有问题。没有理由在绑定它们以供使用的相同位置创建纹理。实际遍历场景并绑定纹理以进行渲染的代码应该永远不会创建纹理。渲染代码应为每个渲染建立所有必要的状态(除非它知道之前在此渲染调用中已建立了所有必需的状态)。所以它应该绑定每个对象所需的所有纹理。因此,先前创建的纹理将被逐出。

总的来说,我建议在创建后解开纹理(即:glBindTexture(..., 0))。这可以防止它们粘在一起。

请记住:绑定纹理时,还可以取消绑定当前绑定的纹理。因此纹理函数只会影响新对象。

但是,如果您想依赖EXT扩展,则有EXT_direct_state_access。它得到了NVIDIA和AMD的支持,所以它相当广泛。它允许您修改对象而不绑定它们,因此您可以创建一个纹理而不绑定它。