使用OpenGL ES 2.0有一个2D场景。我需要绘制一个带有许多半透明纹理(一种噪声)的四边形,它以不同的相位旋转以模拟有机效果。我假设有两种选择:
将使用顶点数组绘制四边形(或四边形):
glBindVertexArrayOES(vertexArray);
glDrawArrays(GL_TRIANGLE_STRIP, index, numVertex);
第一个选项似乎更有效,因为只有一个网格,并且所有混合都在片段着色器中完成一次。只有一次调用glDrawArrays()。
另一方面,第二个选项意味着一个更简单的片段着色器,一个纹理查找(但每个四边形称为N次)。
在两个选项中都有相同数量的纹理绑定,但在第一个选项中,所有纹理都绑定到不同的纹理单元。
我想知道您对每个选项的效果的看法。
答案 0 :(得分:2)
这里没有问题,使用多个纹理单元将为您提供更好的性能。一般来说,您的数据减少的次数越多,他们完成的速度就越快。因此,如果您可以将更多操作填充到单个片段着色器中,那么您将获得更多功能。
您可能考虑采取其他措施的唯一原因是,如果您遇到硬件限制,例如临时寄存器或使用的指令槽或纹理图像单元的数量,这些都不是简单示例中的相关内容。即使在能够实现OpenGL ES 2.0的最可怜的硬件上,也能保证8个纹理单元:
gl_MaxVertexTextureImageUnits
= 0; //顶点纹理查找是 可选 gl_MaxCombinedTextureImageUnits
= 8; gl_MaxTextureImageUnits
= 8; ES 2.0没有每纹理单位矩阵,但您可以使用制服提供自己的单位矩阵。然后在顶点着色器中,您可以将纹理坐标乘以定义旋转的矩阵,并以单独的纹理坐标集的形式将结果传递给片段着色器。在达到纹理图像单元限制之前,这应该是您首选的操作过程。