我正在尝试使用OpenGL ES 2.0在iPhone上实现状态保留粒子系统。通过状态保持,我的意思是每个粒子在时间上向前积分,具有独特的速度和位置矢量,其随时间变化并且不能从每个渲染调用的初始条件计算。
这是我能想到的一种可能方式。
我唯一不知道如何高效工作的是第3步。我是否必须通过CPU?我想知道是否可以使用OpenGL ES 2.0完全在GPU上完成这项工作。任何提示都非常感谢!
答案 0 :(得分:2)
如果不使用glReadPixels,我认为这是不可能的 - ES2没有与OpenGL相同的灵活缓冲管理,允许您使用GPU复制缓冲区内容(例如,您可以复制数据)在纹理和vbo之间,或者使用简单地使用变换反馈,它基本上是为了完全按你想要的那样设计的。
我认为,如果您需要使用GPU,唯一的选择就是使用glReadPixels在渲染后将帧缓冲内容复制回来。您可能还想检查并使用EXT_color_buffer_float或相关(如果可用)以确保您具有高精度值(RGBA8可能不足以满足您的粒子)。如果你将它与正常渲染混合在一起,你可能想要构建一堆缓冲(等待一两帧),这样就不会让CPU停止等待GPU(这在PowerVR上会特别糟糕,因为它会缓冲渲染前的整个帧。)
ES3.0将支持转换反馈,这无济于事,但希望能给你一些未来的希望。
此外,如果您在ARM cpu上运行,使用NEON快速更新所有粒子似乎更快。它可以非常快,并且将跳过您从CPU + GPU方法中产生的所有开销。