我可以将一个纹理单元用于5种不同的2D纹理

时间:2013-07-04 07:49:22

标签: opengl textures

我知道GL_MAX_TEXTURE_IMAGE_UNITS计划中可能有OpenGL个纹理单元。但我们假设我只使用一个。 假设我有5个2D纹理。我可以将它们“映射”到单个纹理单元(TEXTURE0)来渲染所有这些纹理单元。 我的意思是我会这样做:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex1);
//specify tex data and tex params for tex1

glBindTexture(GL_TEXTURE_2D, tex2);
//specify tex data and tex params for tex1
所有5个纹理

..等等

渲染循环:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex1);
//draw

glBindTexture(GL_TEXTURE_2D, tex2);
//draw
所有5个纹理

..等等

在片段着色器中,我只使用1个sampler2d变量,该变量初始化为零(对于纹理单元0)

如果这不能正常工作,那么我应该使用5个不同的纹理单位(TEXTURE0, TEXTURE0+1, ....TEXTURE0+5)并将每个纹理“映射”到不同的纹理单元。

最重要的问题:如果我的第一种方法是正确的,那么有多少2D纹理(现在只讨论2D纹理)可以“映射”到纹理单元吗?

2 个答案:

答案 0 :(得分:5)

只要您不想同时在单个几何体上使用多个纹理,这是完全可能的。实际上这是常见的事情,因为多纹理和纹理单元的目的是来为不同的对象保持不同的纹理,但在同一个对象上使用不同的纹理层。

将纹理单位视为Photoshop中的图层。

答案 1 :(得分:2)

好吧,据我了解OpenGL纹理单元:

文本单位是着色器指向采样纹理的一种方法。如果着色器必须访问多个纹理,则必须将它们分隔为不同的纹理单元。

在你的情况下,因为你似乎同时只需要1个纹理,glActiveTexture是没用的,只是让我们的Opengl使用默认的GL_TEXTURE0。

所以,是的,你的渲染循环是正确的。

纹理单位的限制是多少? 48+,绰绰有余!

注意: 请记住,OpenGL是一个状态机,所以要配置多个纹理同时工作,你需要一种方法来选择它们,这正是glActiveTexture所做的。

我希望它会对你有所帮助。