一旦它已被绑定,是否足以调用glActiveTexture来编辑纹理?

时间:2017-10-13 07:42:54

标签: opengl textures opengl-3

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

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

2 个答案:

答案 0 :(得分:2)

只要你知道哪个州与哪个单位绑定,你就可以依靠改变glActiveTexture来切换到正确的单位来找到它。

但是,您不应该为此目的而依赖此。不是因为OpenGL不可靠,而是因为你可能错误关于你认为你被绑定到哪个单位。

此外,它模糊了用它来渲染纹理和将纹理绑定到修改之间的界限。你希望这两者完全分开。首先,因为在渲染循环中修改纹理的状态(你将它绑定以修改它)是不好的形式,并且可能很慢。第二,因此,当采用GL 4.5和DSA时,您可以快速有效地完成这项工作。

答案 1 :(得分:0)

您可以将纹理单元视为GPU上存在的管道。 GPU上存在许多这样的纹理单元。通过调用glActivateTexture(),你告诉GPU告诉GPU我将绑定哪个纹理然后加载/连接它提到的纹理单元。通过说glBindTexture()你告诉驱动程序,无论我将要做什么操作,请做它在我绑定的纹理上。一旦你调用glTextureImage2D,你的纹理就会驻留在驱动程序内存中,因此你无法直接访问它。所以驱动程序已经让你处理你绑定的纹理对象并告诉驱动程序我正在谈论哪个资源。

所以,当你渲染它总是好的时候,激活纹理单元,然后绑定你的纹理。如果你先激活并稍后绑定,纹理将自动绑定到你给出的单位。

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

希望这有帮助。