Opengl ES 2.0:模型矩阵与每个顶点计算

时间:2015-02-25 02:52:50

标签: performance opengl-es model shader bytebuffer

我可能会问一个愚蠢的问题,但我对opengl es 2.0性能有点好奇。

假设我有一个包含顶点数组“VA”,缓冲数组“BA”和/或模型矩阵“MM”的绘图对象,我想每帧至少进行一次平移和一次旋转。那么,最好的替代方案是什么?

  1. 在VA上进行操作(Rot和Trans)并传递给BA。
  2. 直接在BA上进行操作(Ror和Trans)。
  3. 对MM进行操作并将其传递给Opengl Vertex Shader。
  4. 我的conecern是关于性能,处理/记忆比率。我认为第三个选项可能是最好的,因为GPU,但也是最昂贵的内存条款,因为每个对象都必须有一个MM,对吗?

    我认为另一种解决方案是将平移和旋转参数传递给着色器并在着色器上组装MM。

    如何做得最好?

1 个答案:

答案 0 :(得分:1)

这远非一个愚蠢的问题,但不幸的是,一切都取决于案件。一般来说,如果顶点数据不断变化,即使在GPU上使用顶点缓冲区也可能不是最好的选择,但我想这不是你的情况。

所以你所想的两个主要区别是:

  1. 修改CPU中的每个顶点,然后将顶点数据发送到GPU。
  2. 将数据保留在GPU上,并使用矩阵在顶点着色器中更改它们。
  3. 因此,如果顶点数据的变化超出了矩阵或任何其他类型的分析呈现的顶点变换,那么第一个选项实际上是好的。例如,如果您在CPU上生成随机位置。在这种情况下,即使使用顶点缓冲区也几乎没有意义,因为无论如何你都需要保持每个成名的顶点数据流。

    在基本顶点数据相对静态(每帧不变化太多)的情况下,第二个很好。您将顶点数据推送到GPU一次(或偶尔推送一次),然后使用顶点着色器为您转换顶点数据。 GPU上的顶点着色器非常有效,并且比在CPU上应用相同的算法要快得多。

    关于你的问题: 如果你有大量的顶点数据,第三个选项很可能是最好的,但我不会说它在内存方面很昂贵,因为一个矩阵由16个浮点数组成,它应该相对较小,因为6个3d顶点位置需要更多记忆那么你根本不用担心。如果您有任何问题,您应该担心流入GPU的数据量与此选项相比最少。

    要将平移和旋转传递给顶点着色器,而不是为每个顶点组合矩阵可能不是最好的主意。这里发生的是你获得一点流量来发送4 + 3浮点数而不是16浮点数,但只是开始你用两个块发送它可以产生开销。除此之外,您需要消耗相当多的内存,因为无论如何您需要在着色器中创建矩阵。如果你这样做,你将为每个顶点着色器计算一个新的矩阵,这意味着每个顶点。

    现在关于这些矩阵和内存很难说它实际上会对内存本身产生任何影响。堆栈大小通常是固定的或至少是舍入的,因此在着色器中添加矩阵或者根本不会对任何内存消耗产生任何差异。

    当谈到openGL和性能时,您首先需要注意:

    • 内存消耗。这主要是使用纹理,1024x1024 RGBA将占用大约4MB,相当于一百万个浮点数或大约350k个包含3D位置矢量的顶点,所以像矩阵这样的东西确实影响不大。
    • 数据流。这是您需要在每个帧上传递到GPU以进行处理的数据量。这应该尽可能地减少,但再次发送几MB应该不是问题。
    • 着色器的整体效率
    • 绘制调用次数。如果可能,尝试打包尽可能多的类似数据以减少绘制调用。