0

我知道程序中可以有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 纹理)“映射”到一个纹理单元?

4

2 回答 2

5

只要您不想同时在单个几何图形上使用多个纹理,这是完全可能的。实际上这是通常的做法,因为多重纹理和纹理单元的目的不是为不同的对象保存不同的纹理,而是在同一个对象上使用不同的纹理层。

将纹理单元想象成 Photoshop 中的图层。

于 2013-07-04T08:57:20.287 回答
2

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

文本单元是着色器指向纹理进行采样的一种方式。如果您的着色器必须访问多个纹理,则必须将它们分成不同的纹理单元。

在您的情况下,由于您似乎同时只需要 1 个纹理,所以 glActiveTexture 没用,让 Opengl 为所有使用默认的 GL_TEXTURE0 。

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

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

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

我希望它会帮助你。

于 2013-07-04T08:27:25.923 回答