一旦绑定了纹理,就足以调用 glActiveTexture 来编辑纹理吗?

Posted

技术标签:

【中文标题】一旦绑定了纹理,就足以调用 glActiveTexture 来编辑纹理吗?【英文标题】:Is it enough to call glActiveTexture to edit a texture once it has already been bound? 【发布时间】:2017-10-13 07:42:54 【问题描述】:

如果我的理解是正确的,纹理单元有许多目标(GL_TEXTURE_2D 等),我可以将纹理绑定到这些目标。我可以用glActiveTexture 更改当前活动的纹理单元。当我调用glBindTexture时,我将指定的纹理对象绑定到当前活动纹理单元的指定目标,对吧?

当我想稍后更改纹理的参数或调用像glTexSubImage2D 这样的函数时,使用我的纹理绑定到的纹理单元调用 glActiveTexture 是否足够?还是我必须每次都调用glBindTexture,即使纹理已经绑定到一个单元?

【问题讨论】:

【参考方案1】:

只要你知道什么状态绑定到哪个单元,你就可以依靠仅仅改变glActiveTexture切换到正确的单元来找到它。

但是,您不应为此目的而依赖它。不是因为 OpenGL 不可靠,而是因为您可能错误认为您绑定到了哪个单元。

此外,它模糊了绑定纹理以使用它进行渲染和绑定纹理以修改它之间的界限。您希望两者完全分开。首先,因为在渲染循环中修改纹理的状态(绑定它以修改它)是错误的形式并且可能很慢。其次,当需要采用 GL 4.5 和 DSA 时,您可以快速高效地进行。

【讨论】:

【参考方案2】:

您可以将纹理单元视为 GPU 上的管道。 GPU 上存在许多这样的纹理单元。通过调用 glActivateTexture(),您是在告诉 OpenGL 驱动程序告诉 GPU 我将绑定下一个在提到的纹理单元中加载/连接它的纹理。通过说 glBindTexture(),您是在告诉驱动程序我将要执行的任何操作,请执行它在我绑定的纹理上。一旦您调用 glTextureImage2D,您的纹理就驻留在驱动程序内存中,因此您无法直接访问它。所以驱动程序为您提供了您绑定的纹理对象的句柄,并告诉驱动程序我正在谈论哪个资源。

因此,当您渲染时,激活纹理单元然后绑定您的纹理总是好的。正如您先激活并稍后绑定一样,纹理将自动绑定到您指定的单元。

如果您不提及纹理单元,默认情况下将使用 GL_TEXTURE0,因此有时可能会造成混淆。

希望这会有所帮助。

【讨论】:

以上是关于一旦绑定了纹理,就足以调用 glActiveTexture 来编辑纹理吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBO 的纹理绑定无法正常工作

Java - LWJGL 中的绑定纹理导致白屏

纹理和纹理映射 GLUTess 多边形?

QOpenGLFramebufferObject 绑定纹理

OpenGL绑定几个2D纹理

无法将纹理绑定到 GL_QUADS