着色器中的多个纹理单元与多个半透明纹理网格 - 性能

时间:2013-09-09 12:12:15

标签: ios opengl-es

使用OpenGL ES 2.0有一个2D场景。我需要绘制一个带有许多半透明纹理(一种噪声)的四边形,它以不同的相位旋转以模拟有机效果。我假设有两种选择:

  • 使用带有多个采样器的着色器并为每个采样器旋转纹理坐标(例如在顶点着色器中)绘制一个四边形。
  • 绘制多个叠加和旋转四边形,将不同纹理绑定到每个网格(以及更简单的着色程序)。

将使用顶点数组绘制四边形(或四边形):

glBindVertexArrayOES(vertexArray);

glDrawArrays(GL_TRIANGLE_STRIP, index, numVertex);

第一个选项似乎更有效,因为只有一个网格,并且所有混合都在片段着色器中完成一次。只有一次调用glDrawArrays()。

另一方面,第二个选项意味着一个更简单的片段着色器,一个纹理查找(但每个四边形称为N次)。

在两个选项中都有相同数量的纹理绑定,但在第一个选项中,所有纹理都绑定到不同的纹理单元。

我想知道您对每个选项的效果的看法。

1 个答案:

答案 0 :(得分:2)

这里没有问题,使用多个纹理单元将为您提供更好的性能。一般来说,您的数据减少的次数越多,他们完成的速度就越快。因此,如果您可以将更多操作填充到单个片段着色器中,那么您将获得更多功能。

您可能考虑采取其他措施的唯一原因是,如果您遇到硬件限制,例如临时寄存器或使用的指令槽或纹理图像单元的数量,这些都不是简单示例中的相关内容。即使在能够实现OpenGL ES 2.0的最可怜的硬件上,也能保证8个纹理单元:

  • const mediump int gl_MaxVertexTextureImageUnits = 0; //顶点纹理查找是 可选
  • const mediump int gl_MaxCombinedTextureImageUnits = 8;
  • const mediump int gl_MaxTextureImageUnits = 8;

ES 2.0没有每纹理单位矩阵,但您可以使用制服提供自己的单位矩阵。然后在顶点着色器中,您可以将纹理坐标乘以定义旋转的矩阵,并以单独的纹理坐标集的形式将结果传递给片段着色器。在达到纹理图像单元限制之前,这应该是您首选的操作过程。

相关问题