OpenGL,禁用纹理单元glActiveTexture和glBindTexture

OpenGL, disabling a texture unit, glActiveTexture and glBindTexture

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

1
2
3
4
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的单元。 即您必须写:

1
2
3
4
Create texture 1
Create texture 2
Use texture 1 with texture unit 1
Use texture 2 with texture unit 2

我当然简化了示例,但是即使在创建过程中仅绑定纹理时,创建和绑定纹理也会偶然影响当前活动的纹理单元这一事实使我有些不舒服。 当然,除非我在这里犯了一个错误,并且有什么办法可以禁用当前glActiveTexture中的状态更改?

感谢您的协助,您可以在这里给我。


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

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

通常,我建议在创建后解除纹理绑定(即:glBindTexture(..., 0))。这样可以防止他们粘在身边。

请记住:绑定纹理时,还可以解除绑定当前绑定的任何纹理。因此纹理功能只会影响新对象。

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