OpenGL-DrawArray还是drawelements?

OpenGL-DrawArray还是drawelements?,opengl,Opengl,我正在制作一个小的2D游戏演示,从我所读到的内容来看,使用drawElements()绘制索引三角形列表比使用drawArrays()绘制未索引三角形列表更好 但据我所知,似乎不可能使用drawerelements()在一个draw调用中绘制多个未连接的元素 因此,对于我的2D游戏演示,我只会绘制由两个三角形组成的正方形,最好的方法是什么,这样我就不会对每个对象进行一次绘制调用?是的,在许多情况下最好使用索引,因为你不必存储或传输重复的顶点,也不必处理重复的顶点(每个顶点只需运行一次顶点着色器)

我正在制作一个小的2D游戏演示,从我所读到的内容来看,使用
drawElements()
绘制索引三角形列表比使用
drawArrays()
绘制未索引三角形列表更好

但据我所知,似乎不可能使用
drawerelements()
在一个draw调用中绘制多个未连接的元素


因此,对于我的2D游戏演示,我只会绘制由两个三角形组成的正方形,最好的方法是什么,这样我就不会对每个对象进行一次绘制调用?

是的,在许多情况下最好使用索引,因为你不必存储或传输重复的顶点,也不必处理重复的顶点(每个顶点只需运行一次顶点着色器)。对于四边形,您可以将6个顶点减少到4个,再加上少量索引数据。三分之二确实是一个很好的改进,尤其是如果顶点数据不仅仅是位置

总之,
glpaurements
导致

  • 更少的数据(大部分),这意味着更多的GPU内存用于其他事情
  • 如果数据发生更改,更新速度会更快
  • 更快地传输到GPU
  • 更快的顶点处理(无重复)
如果引用的顶点在内存中不相邻,索引可能会影响缓存性能。建模者通常会生成考虑到这一点的优化网格

对于多个元素,如果您正在引用
GL\u三角形条带
,则可以使用一个
gldrawerelements
调用来绘制多条三角形条带。在您的情况下,使用
GL\u三角形
并引用4个顶点,每个四边形有6个索引。然后,您的顶点数组需要存储所有垂直面为所有四边形设置es。如果它们正在移动,您仍然需要每帧将该数据发送到GPU。您可以将所有移动的四边形放置在阵列的前端,并且只更新活动四边形。您还可以将静态顶点数据存储在单独的阵列中

绘制三维模型的典型方法是为几何体提供固定顶点列表,并使用模型矩阵移动整个对象(作为模型视图的一部分)。令人困惑的是,网格数据太小,正如您所说,绘制调用的开销可能会变得非常突出。我认为您必须先绘制大量四边形,然后才能进入出现问题的阶段。但是,如果您这样做,则应查看实例化或类似的想法,如粒子系统


可能只有在绘图调用或数据传输出现问题的情况下,才会进行以下操作,因为涉及的问题很多。完全在GPU上实现粒子系统的一个好方法是在纹理中存储实例属性,如位置/颜色。每个帧使用FBO/渲染到纹理到“乒乓”此数据在另一个纹理之间传输,并更新片段着色器中的属性。若要绘制粒子,可以设置一个静态VBO,该VBO存储具有属性数据纹理坐标的四边形,以便在顶点着色器中读取和应用粒子位置。我确信接下来会有很多好的教程/实现(如果你知道一个好的,请评论)。

DrawArrays
是一个
带线性(0,1,2,3,…)的抽屉元素索引。这是唯一的区别,因此使用
DrawArrays
没有什么比使用
DrawElements做不到的,所以我如何使用DrawElements()在一次绘制调用中绘制多个未连接的元素?有什么问题吗?生成线性索引,并尝试使用与
DrawArray
相同的方法。它会起作用。然后尝试通过合并相同的顶点和重新生成索引来减少顶点的数量。在2D tho中不太可能有很多相同的顶点-因此您不会从中获得太多好处。啊,这是有意义的。我将尝试使用它和c返回结果。@keltar:“DrawArray是具有线性索引的抽屉元素,这是唯一的区别”的说法并不完全正确,它更像是“没有索引的抽屉元素”。这就是存在性能差异的原因。添加到原始重新启动(这也是我现在建议的),有人可以提到简并tris作为替代。虽然这是公认的90年代后期的东西。在我的演示中,我将绘制许多移动的四边形,但仅限于2D。使用glPrimitveRestartIndex或简并tris(不知道这是什么)是否允许我绘制许多未连接的四边形?(就像屏幕顶部的一个四边形和底部的另一个?@Darkalfx TBH,我首先创建一个VBO,为所有移动对象绘制一个四边形,并将其与modelview矩阵一起定位。对于级别和静态内容,使用
GL_三角形
,并将尽可能多的内容合并到同一个VBO中。基本体重新启动并删除。)速率更适用于绘制多个三角形条带,在您的情况下,它可以为每个四边形节省一个额外的索引。这可能是过早优化的情况。将所有移动对象放入同一个VBO可能会加快速度,但粒子方法将最快(但要复杂得多)。啊,这似乎是有道理的。虽然,对于opengl和所有东西来说,VBO是什么?VBO是一种。有了VBOs,您可以将所有顶点和索引数据上载到GPU内存。如果网格数据不变,绘图速度会快得多。如果没有,它的速度与从系统内存中的数组绘图的速度类似。