【问题标题】:What's the difference between TMU and openGL's GL_TEXTUREn?TMU 和 openGL 的 GL_TEXTUREn 有什么区别?
【发布时间】:2014-06-13 02:18:21
【问题描述】:
我不太明白有什么区别。
我知道 TMU 是 GPU 上的纹理映射单元,在 opengl 中,我们可以有很多纹理单元。我曾经认为它们是相同的,如果我有 n 个 TMU,那么我可以有 n 个 GL_TEXTURE 使用,但我发现这可能不是真的。
最近在做一个安卓游戏,目标是一个使用Mali 400MP GPU的平台。根据文档,它只有一个TMU,我以为我一次只能使用一个纹理。但令人惊讶的是,我可以在至少4个纹理没有麻烦。这是为什么?
硬件或驱动程序级别是否为我自动交换不同的纹理?如果是这样,是否应该导致大量缓存未命中?
【问题讨论】:
标签:
mobile
opengl-es
opengl-es-2.0
texture-mapping
【解决方案1】:
我不是终极硬件架构专家,尤其是 Mali。但我还是会试一试,根据我的理解。
TMU 是用于纹理采样的硬件单元。它不会永久分配给 OpenGL 纹理单元。每当着色器执行纹理采样操作时,我都希望将此特定操作分配给其中一个 TMU。然后 TMU 执行请求的采样,将结果传递回着色器,并可用于下一次采样操作。
所以 TMU 的数量和支持的 OpenGL 纹理单元的数量没有关系。可以支持的OpenGL纹理单元数量由硬件的状态跟踪部分决定。
TMU 的数量会影响性能。可用的 TMU 越多,在给定时间内可以执行的纹理采样操作就越多。因此,如果您在着色器中使用大量纹理采样,您的代码将受益于拥有更多 TMU。无论您是从同一个纹理还是从许多不同的纹理中多次采样都没关系。
【解决方案2】:
纹理映射单元 (TMU) 是硬件上的功能单元,曾几何时,它们与像素管线的数量直接相关。由于硬件现在更加抽象/通用,它不再是衡量一次可以应用多少纹理的好方法。它可以指示整体多纹理性能,但它本身并没有施加任何限制。
OpenGL 的GL_TEXTURE0+n 实际上代表纹理图像单元 (TIU),它们是您绑定纹理的位置。您可以同时应用的纹理数量(在着色器的单次执行中)因着色器阶段而异。在 GL 4.4 中具有 5 个阶段的 Desktop GL 中,实现必须支持每个阶段 16 个独特的纹理。这就是为什么纹理图像单元的数量是 80 (16x5)。 GL 3.3 只有 3 个阶段,因此其最小 TIU 计数只有 48 个。这为您提供了足够的绑定位置,可以为 GLSL 程序中的每个阶段提供一组 16 个独特的纹理。
GL ES,尤其是 2.0,是一个完全不同的故事。它要求在片段着色器阶段至少支持 8 个同时纹理,在顶点着色器中支持 0(可选)。
const mediump int gl_MaxVertexTextureImageUnits = 0; // Vertex Shader Limit
const mediump int gl_MaxTextureImageUnits = 8; // Fragment Shader Limit
const mediump int gl_MaxCombinedTextureImageUnits = 8; // Total Limit for Entire Program
您在程序的一次执行中可以在所有着色器中应用的纹理数量也有限制 (gl_MaxCombinedTextureImageUnits),这个限制通常只是总和每个阶段的限制。