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

OpenGL,禁用纹理单元,glActiveTexture和glBindTexture,opengl,textures,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语义,这似乎是不可能的,因为纹理

如何关闭纹理单元,或者至少在绑定纹理时防止其状态更改?我正在使用着色器,所以我认为没有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的最后一个单元。i、 e.你必须写:

Create texture 1
Create texture 2
Use texture 1 with texture unit 1
Use texture 2 with texture unit 2
当然,我已经简化了这个示例,但是创建和绑定纹理可能会意外地影响当前活动的纹理单元,即使您只是在创建过程中绑定纹理,这一事实让我有些不舒服。当然,除非我在这里犯了一个错误,并且我可以做些什么来禁用当前glActiveTexture中的状态更改


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

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

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

一般来说,我建议在创建纹理后解除绑定(即:
glBindTexture(…,0)
)。这样可以防止它们粘在一起

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


但是,如果您想依赖EXT扩展,则可以使用EXT\u direct\u state\u访问。它是由NVIDIA和AMD支持的,所以它是相当广泛的可用性。它允许您在不绑定对象的情况下修改对象,因此您可以在不绑定对象的情况下创建纹理。

我刚刚读到EXT_direct_state_access还不是完整的文章,所以我想我会避免它。但总的来说,不,我不打算这样做纹理创建和绑定交错,但它确实让我觉得,在某个时候,我会得到一个黑色的表面,很难找到它!