我在 2D 游戏中渲染粒子。每个粒子都是一个四边形(2 个三角形)。我怎样才能使绘图尽可能快?所有粒子都有相同的纹理,我只是改变它的位置。
现在我为每个粒子调用 glVertexPointer 和 glDrawArrays 。所以我每次向 GPU 发送 4 个顶点。
有没有其他方法可以更快?
我正在使用 OpenGL ES 1.1 (iPhone)
谢谢!
您进行的每个绘制调用 (glDrawArrays) 都很昂贵。每个粒子都这样做一次肯定太频繁了。您的所有粒子都可以通过一次绘制调用绘制;只需设置一个包含所有三角形顶点的大数组和另一个带有纹理坐标的大数组,然后调用 glVertexPointer/glDrawArrays 一次——这就是 glVertexPointer 的强大功能:一次调用中相同类型的任意几何图形。:)
对于您正在做的事情,您还应该研究点精灵(GL_POINTS),它也可以用作微小的纹理四边形。它们只是 2D 的,所以你不能将你的纹理映射到 Z 轴,但是如果你的粒子只是相同纹理的 2D 四边形一遍又一遍,点精灵很可能会做你想要的。
有一种方法可以在一个绘图程序中完成所有这些操作。我认为这是通过在每个四边形之后添加一个额外的顶点,这与前一个顶点相同,但我可能是错的。
编辑:稍微研究了一下,看起来你需要两个;基本上是一个之后,一个之前。它确实增加了很多额外的顶点,但我从经验中知道,在一次绘制操作中完成所有这一切在 iPhone 上产生了巨大的积极影响(我们从纹理中绘制文本,所以本质上是一样的)。
EDIT2:另外请注意,我指的是使用 GL_TRIANGLE_STRIP - 如果您使用的是 GL_TRIANGLE_STRIP,则不需要额外的顶点......除非,由于重复 2每隔一个三角形。