0

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

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

  1. 在 VBO 中设置粒子初始条件。
  2. 在顶点着色器中集成粒子,在片段着色器中将结果写入纹理。(第一次渲染调用)
  3. 将数据从纹理复制到 VBO。
  4. 从 VBO 中的数据渲染粒子。(第二次渲染调用)
  5. 重复 2.-4。

我唯一不知道如何有效地做的是第3步。我必须通过CPU吗?我想知道是否可以使用 OpenGL ES 2.0 完全在 GPU 上执行此操作。非常感谢任何提示!

4

1 回答 1

2

如果不简单地使用 glReadPixels,我认为这是不可能的——ES2 没有 OpenGL 允许您使用 GPU 复制缓冲区内容的灵活缓冲区管理(例如,您可以在纹理之间复制数据)和 vbo,或者简单地使用转换反馈,它基本上旨在完全按照您的意愿进行操作)。

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

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

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

于 2013-06-13T17:54:25.817 回答