TMU和openGL的GL_TEXTUREn之间的区别是什么?

时间:2014-04-27 16:18:49

标签: mobile opengl-es opengl-es-2.0 texture-mapping

我不太明白有什么区别。 我知道TMU是GPU上的纹理映射单元,在opengl中,我们可以有很多纹理单元。我曾经认为它们是相同的,如果我有n TMU,那么我可以使用n GL_TEXTURE,但是我发现这可能不是真的。 最近,我正在开发一款Android游戏,使用Mali 400MP GPU定位平台。根据文档,它只有一个TMU,我认为我一次只能使用一个纹理。但令人惊讶的是,我可以使用至少4个纹理没有麻烦。为什么这个? 硬件或驱动程序级别是否为我自动交换不同的纹理?如果是这样,它是否应该导致大量缓存未命中?

2 个答案:

答案 0 :(得分:2)

纹理映射单元(TMU)是硬件上的功能单元,曾几何时它们与像素管道的数量直接相关。由于硬件现在更加抽象/通用,因此不再能够在一次通过中应用多少纹理。它可以指示整体多纹理性能,但本身并没有施加任何限制。

OpenGL的GL_TEXTURE0+n实际上代表纹理图像单元(TIU),它是绑定纹理的位置。可以同时应用的纹理数(在着色器的单次执行中)因着色器阶段而异。在Desktop GL中,从GL 4.4开始有5个阶段,实现必须支持每个阶段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),此限制通常是 每个阶段的总和限额。

答案 1 :(得分:1)

我不是最终的硬件架构专家,尤其不适合马里。但根据我的理解,无论如何我都会试一试。

TMU是纹理采样的硬件单元。它不会永久分配给OpenGL纹理单元。每次着色器执行纹理采样操作时,我都希望将此特定操作分配给其中一个TMU。然后,TMU执行请求的采样,将结果传送回着色器,并可用于下一次采样操作。

因此,TMU的数量与支持的OpenGL纹理单元的数量之间没有关系。可以支持的OpenGL纹理单元的数量由硬件的状态跟踪部分确定。

TMU的数量会影响性能。可用的TMU越多,在给定时间内可以执行的纹理采样操作越多。因此,如果在着色器中使用大量纹理采样,则代码将从拥有更多TMU中获益。如果您从相同的纹理或许多不同的纹理中多次采样,则无关紧要。