打开GL ES - 绘制多个对象的最佳方法是什么

时间:2013-12-05 13:36:56

标签: ios graphics opengl-es opengl-es-2.0

我在iOS中使用Open GL ES 2.0(使用GLkit)并想知道绘制多个对象的最佳方法是什么,比如折线:

  1. 为每条折线使用单独的顶点缓冲区,不带索引缓冲区,只需绘制GL_LINE_LOOP。在这种情况下,每个对象都会有一个绘图调用。

  2. 将所有顶点聚集到一个缓冲区中并准备索引缓冲区。在这种情况下,将有一个绘制调用将绘制GL_LINES。

  3. 任何其他方式。

  4. 另外,如果每一行都有不同的颜色(但每个顶点的颜色没有变化),答案会如何变化。

1 个答案:

答案 0 :(得分:1)

因为我们在性能方面定义了“最佳”:

使用单个顶点缓冲区应该总是更快,只要所有折线都具有相同的顶点属性,并且可以直接将它们收集到单个顶点缓冲区中(即,您不需要经常收集和重新打包它们)。这需要更少的OpenGL ES API调用来重新绑定数据,因为您可以对每个属性使用glVertexAttribPointer*一次调用,并依赖于first glDrawArrays参数或偏移索引(如您所述)在你的问题中)。

假设每条折线具有不同的顶点和顶点数,则实例化不适用。我认为在这一点上,这里有两个很好的选择,沿着空间换CPU时间的权衡曲线:

  1. 将折线颜色作为顶点属性传递,但是通过glVertexAttrib4f设置当前值,而不是使用实际的每顶点数组数据。循环使用折线,使用glVertexAttrib4f更新颜色,然后使用glDrawArrays(GL_LINE_LOOP, first, count),其中firstcount由您将折线打包到单个顶点缓冲区中定义。< / LI>
  2. 将折线颜色作为顶点属性传递,并展开每个顶点存储的数据集以包含颜色,该颜色对折线中的每个顶点重复。 (如果您重复相同的折线,那么实例化将帮助您。)准备索引缓冲区,就像您在问题中为2)所做的那样。
  3. 请注意,此提议1)与您的问题中的1)类似,但无论如何所有顶点数据都存在于单个顶点缓冲区中。由于两个解决方案现在都使用单个顶点缓冲区,因此选择主要取决于您是否愿意对glVertexAttrib4fglDrawArrays进行额外调用,以避免为重复的颜色和索引数据分配额外的内存。请注意,更改顶点属性的当前值和用于每次绘制的start偏移量仍然比绑定新顶点缓冲区和重置顶点数组状态要便宜得多。