我在iOS中使用Open GL ES 2.0(使用GLkit)并想知道绘制多个对象的最佳方法是什么,比如折线:
为每条折线使用单独的顶点缓冲区,不带索引缓冲区,只需绘制GL_LINE_LOOP。在这种情况下,每个对象都会有一个绘图调用。
将所有顶点聚集到一个缓冲区中并准备索引缓冲区。在这种情况下,将有一个绘制调用将绘制GL_LINES。
任何其他方式。
另外,如果每一行都有不同的颜色(但每个顶点的颜色没有变化),答案会如何变化。
答案 0 :(得分:1)
因为我们在性能方面定义了“最佳”:
使用单个顶点缓冲区应该总是更快,只要所有折线都具有相同的顶点属性,并且可以直接将它们收集到单个顶点缓冲区中(即,您不需要经常收集和重新打包它们)。这需要更少的OpenGL ES API调用来重新绑定数据,因为您可以对每个属性使用glVertexAttribPointer*
一次调用,并依赖于first
glDrawArrays
参数或偏移索引(如您所述)在你的问题中)。
假设每条折线具有不同的顶点和顶点数,则实例化不适用。我认为在这一点上,这里有两个很好的选择,沿着空间换CPU时间的权衡曲线:
glVertexAttrib4f
设置当前值,而不是使用实际的每顶点数组数据。循环使用折线,使用glVertexAttrib4f
更新颜色,然后使用glDrawArrays(GL_LINE_LOOP, first, count)
,其中first
和count
由您将折线打包到单个顶点缓冲区中定义。< / LI>
请注意,此提议1)与您的问题中的1)类似,但无论如何所有顶点数据都存在于单个顶点缓冲区中。由于两个解决方案现在都使用单个顶点缓冲区,因此选择主要取决于您是否愿意对glVertexAttrib4f
和glDrawArrays
进行额外调用,以避免为重复的颜色和索引数据分配额外的内存。请注意,更改顶点属性的当前值和用于每次绘制的start
偏移量仍然比绑定新顶点缓冲区和重置顶点数组状态要便宜得多。