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

标签 ios opengl-es

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

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

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

glBindVertexArrayOES(vertexArray);

glDrawArrays(GL_TRIANGLE_STRIP, index, numVertex);

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

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

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

我想知道您对每个选项的性能的看法。

最佳答案

毫无疑问,使用多个纹理单元会给您带来更好的性能。一般来说,您的数据在管道中的行程越少,它们完成的速度就越快。因此,如果您可以将更多操作塞入单个片段着色器中,您将获得更多功能。

您可能考虑不这样做的唯一原因是,如果您遇到硬件限制,例如使用的临时寄存器或指令槽的数量或纹理图像单元,这些都与您的简单示例无关。即使在能够实现 OpenGL ES 2.0 的最可悲的硬件上,也保证有 8 个纹理单元:

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

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

关于ios - 着色器中的多个纹理单元与多个半透明纹理网格 - 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18697944/

相关文章:

ios - 如何使用 swift 在 Collection View 中制作页眉和页脚

ios - 我是否必须添加我在 ios8 应用程序中使用的所有框架?

ios - Xcode-iOS内存泄漏使我发疯,我认为是NSNotificationCenter,但希望新鲜的眼睛能看到我看不到的东西

c++ - glColorMask 是否影响 glClear

android - 如何解决 Buffer.put() 和 Android OpenGL 的性能问题

ios - CallKit Framework 是否可以调用、接听和结束电话调用,或者仅用于 VOIP 调用?

ios - 在 xamarin.ios 中使用带有 nativecss 组件的模糊过滤器

ios - Opengl ES 着色器 - 获取属性

opengl-es - 是否也渲染了 OpenGL ES Frustum 之外的几何图形?

android - 使用 OpenGL-ES 的 Android 上的卷页动画