用于OpenGL ES 2.0的状态保留粒子系统

时间:2013-06-13 14:41:48

标签: iphone opengl-es opengl-es-2.0 particle-system

我正在尝试使用OpenGL ES 2.0在iPhone上实现状态保留粒子系统。通过状态保持,我的意思是每个粒子在时间上向前积分,具有独特的速度和位置矢量,其随时间变化并且不能从每个渲染调用的初始条件计算。

这是我能想到的一种可能方式。

  1. 在VBO中设置粒子初始条件。
  2. 在顶点着色器中集成粒子,将结果写入片段着色器中的纹理。 (第一次渲染调用)
  3. 将数据从纹理复制到VBO。
  4. 从VBO中的数据渲染粒子。 (第二次渲染)
  5. 重复2.-4。
  6. 我唯一不知道如何高效工作的是第3步。我是否必须通过CPU?我想知道是否可以使用OpenGL ES 2.0完全在GPU上完成这项工作。任何提示都非常感谢!

1 个答案:

答案 0 :(得分:2)

如果不使用glReadPixels,我认为这是不可能的 - ES2没有与OpenGL相同的灵活缓冲管理,允许您使用GPU复制缓冲区内容(例如,您可以复制数据)在纹理和vbo之间,或者使用简单地使用变换反馈,它基本上是为了完全按你想要的那样设计的。

我认为,如果您需要使用GPU,唯一的选择就是使用glReadPixels在渲染后将帧缓冲内容复制回来。您可能还想检查并使用EXT_color_buffer_float或相关(如果可用)以确保您具有高精度值(RGBA8可能不足以满足您的粒子)。如果你将它与正常渲染混合在一起,你可能想要构建一堆缓冲(等待一两帧),这样就不会让CPU停止等待GPU(这在PowerVR上会特别糟糕,因为它会缓冲渲染前的整个帧。)

ES3.0将支持转换反馈,这无济于事,但希望能给你一些未来的希望。

此外,如果您在ARM cpu上运行,使用NEON快速更新所有粒子似乎更快。它可以非常快,并且将跳过您从CPU + GPU方法中产生的所有开销。