Android openGL ES glDrawArrays还是glDrawElements?

lac*_*cas 21 android opengl-es

什么是最好的方法?如果我使用drawarrays,或者我使用drawelements?有什么不同的?

rya*_*anm 32

对于两者,您将OpenGL传递一些包含顶点数据的缓冲区.

glDrawArrays基本上是"使用我之前给你的数据绘制这个连续的顶点范围".好:

  • 您不需要构建索引缓冲区

坏:

  • 如果将数据组织到GL_TRIANGLES中,则相邻三角形将具有重复的顶点数据.这显然是浪费.
  • 如果您使用GL_TRIANGLE_STRIP和GL_TRIANGLE_FAN来尝试避免重复数据:它不是非常有效,您必须为每个条带和扇形进行渲染调用.OpenGL调用很昂贵,应该尽可能避免

使用glDrawElements,您可以传入包含要绘制的顶点索引的缓冲区.

  • 没有重复的顶点数据 - 您只需为不同的三角形索引相同的数据
  • 您可以使用GL_TRIANGLES并依赖顶点缓存来避免两次处理相同的数据 - 无需重新组织几何数据或通过多次调用拆分渲染

  • 索引缓冲区的内存开销

我的建议是使用glDrawElements


Jör*_*ann 6

性能影响在iPhone上可能类似,iOSOpenGL ES编程指南建议使用三角形条带并通过简并三角形连接多个条带.

该链接有一个很好的插图概念.通过这种方式,您可以重复使用一些顶点并仍然可以一步完成所有绘图.

为了获得最佳性能,您的模型应使用glDrawArrays作为单个无索引三角形条提交,并尽可能少复制顶点.如果您的模型需要复制许多顶点(因为许多顶点由三角形共享的三角形共享,或者因为您的应用程序合并了许多较小的三角形条),您可以使用单独的索引缓冲区并调用glDrawElements获得更好的性能代替.有一个权衡:未编制索引的三角形条必须定期复制整个顶点,而索引三角形列表需要额外的索引内存,并增加查找顶点的开销.为获得最佳效果,请使用索引和未编制索引的三角形条测试模型,并使用速度最快的三角形条.

在可能的情况下,对顶点和索引数据进行排序,以便共享公共顶点的三角形在三角形条带中相互接近地绘制.图形硬件通常会缓存最近的顶点计算,因此引用的局部性可能允许硬件避免多次计算顶点.

缺点是您可能需要一个预处理步骤来对网格进行排序,以获得足够长的条带.我还没有想出一个很好的算法,所以与GL_TRIANGLES相比,我不能给出任何性能或空格数.当然,这也高度依赖于您想要绘制的网格.