gpt4 book ai didi

ios - Opengl ES - 绘制多个对象的最佳方法是什么

转载 作者:行者123 更新时间:2023-11-29 03:26:28 24 4
gpt4 key购买 nike

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

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

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

  3. 任何其他方式来执行此操作。

此外,如果每条线都有不同的颜色(但每个顶点的颜色不会改变),答案会如何变化。

最佳答案

由于我们根据性能定义“最佳”:

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

假设每条折线都有不同的顶点和顶点数,实例化不适用。我认为此时可能有两个不错的选择,沿着空间换 CPU 时间的权衡曲线:

  1. 将折线颜色作为顶点属性传递,但通过 glVertexAttrib4f 设置当前值,而不是使用实际的每个顶点数组数据。遍历多段线,使用 glVertexAttrib4f 更新颜色,然后使用 glDrawArrays(GL_LINE_LOOP, first, count),其中 firstcount 由您如何将多段线打包到单个顶点缓冲区中来定义。
  2. 将您的折线颜色作为顶点属性传递,并扩展您为每个顶点存储的数据集以包含颜色,该颜色对折线中的每个顶点重复。 (如果您重复同一条折线,这就是实例化可以帮助您的地方。)准备索引缓冲区,就像您在问题中为 2) 所做的一样。

请注意,建议的 1) 与您问题中的 1) 类似,但所有顶点数据无论如何都存在于单个顶点缓冲区中。由于这两种解决方案现在都使用单个顶点缓冲区,因此选择主要是在您是否愿意对 glVertexAttrib4fglDrawArrays 进行额外调用之间进行选择,以避免为重复的操作分配额外的内存颜色和索引数据。请注意,更改顶点属性的当前值和用于每次绘制的 start 偏移量仍然比绑定(bind)新的顶点缓冲区和重置顶点数组状态便宜得多。

关于ios - Opengl ES - 绘制多个对象的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20401472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com