【问题标题】:Can I use one Texture unit for 5 different 2D textures我可以将一个纹理单元用于 5 种不同的 2D 纹理吗
【发布时间】:2013-07-04 16:57:20
【问题描述】:

我知道OpenGL 程序中可以有GL_MAX_TEXTURE_IMAGE_UNITS 纹理单元。但是让我们假设我只使用一个。 假设我有 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 纹理)“映射”到一个纹理单元?

【问题讨论】:

  • 嗯?你的意思是使用多重纹理而不使用多重纹理?您真正想要实现的目标是什么?"map" 对您的实际意义是什么?如果您的片段着色器只有一个 sampler2D,它怎么可能一次使用多个纹理?

标签: opengl textures


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    希望对你有帮助。

    【讨论】:

    • 谢谢阿德里安,我没有足够的声誉来投票赞成你的答案,但这很棒!这些话让我非常清楚“如果着色器想要一次使用超过 1 个纹理,则需要超过 1 个 tex 单位”谢谢!
    • @kvikram 很高兴为您提供帮助 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    相关资源
    最近更新 更多