2017-10-13 122 views
0

如果我的理解是正确的,那么纹理单元就有多个可以将纹理绑定到的目标(GL_TEXTURE_2D等)。我可以用glActiveTexture来改变当前激活的纹理单元。当我打电话给glBindTexture时,我将指定的纹理对象绑定到当前活动纹理单元的指定目标,对吗?调用glActiveTexture编辑一个已经绑定的纹理就足够了吗?

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

回答

2

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

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

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

0

您可以将Texture单元看作GPU上的管道。 GPU上有很多这样的纹理单元。通过调用glActivateTexture(),您告诉OpenGL驱动程序告诉GPU我将绑定下一个负载/将其连接到所提到的纹理单元中的任何纹理。通过说glBindTexture()告诉驱动程序,无论我要做什么操作,请执行它在我绑定的纹理上。因为一旦你调用了glTextureImage2D,你的纹理就驻留在驱动程序的内存中,因此你不能直接访问它。所以驱动程序已经给你处理你绑定的纹理对象,并告诉驱动程序我正在谈论的资源。

所以,当你把它总是很好的时候同时激活纹理单元,然后绑定你的纹理。正如您先完成激活并稍后进行绑定,纹理将自动绑定到您提供的单位。

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

希望这会有所帮助。

相关问题