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

4

我该如何关闭贴图单元,或者至少在绑定贴图时防止它的状态改变?我正在使用着色器,因此我认为这里没有 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的单元是1。也就是说,您必须写成:

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

我当然简化了这个例子,但是创建并绑定纹理时,即使你只是作为创建过程的一部分来绑定纹理,也可能会不经意地影响当前活动的纹理单元,这让我感到有些不安。除非我犯了错误,并且有什么方法可以禁用当前glActiveTexture中的状态更改?谢谢你在这里给我的任何帮助。
1个回答

4
这在OpenGL中是必须学习的东西。GL函数只影响当前状态。所以要修改一个对象,你必须将其绑定到当前状态并进行修改。
然而,通常情况下,你不应该有问题。没有理由在创建纹理的地方同时绑定它们以供使用。实际上遍历场景并绑定纹理以供渲染的代码永远不应该创建纹理。渲染代码应该为每个渲染建立所有必要的状态(除非它知道在这个渲染调用中已经建立了所有必要的状态)。所以它应该绑定每个对象需要的所有纹理。因此先前创建的纹理将被驱逐。
一般来说,我建议在创建后取消绑定纹理(即: glBindTexture(..., 0))。这可以防止它们留在那里。
记住:当你绑定一个纹理时,你也会解除当前绑定的纹理。因此,纹理函数只会影响新对象。
然而,如果你想依赖一个EXT扩展,有EXT_direct_state_access可供使用。它受到NVIDIA和AMD的支持,因此它相当普及。它允许你在不绑定对象的情况下修改对象,所以你可以创建一个不绑定的纹理。

我刚刚读到EXT_direct_state_access还不是完美的,所以我想我会避免它。但整体而言,我并不打算像那样交错地创建和绑定纹理,但这确实让我想到,总有一天我会遇到一个黑色表面,并且很难跟踪它! - Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接