代码改变世界

(原)GPU加速的超大规模物理粒子系统的实现

2010-05-29 16:05  六水  阅读(1057)  评论(0编辑  收藏  举报
如引用,请注明出处:http://www.cnblogs.com/sixwater

 images/lizi.jpg


引子
为了能实现大规模的粒子动画,我在引擎使用GPGPU方式对粒子动画进行建模,实现。
这种粒子可以广泛应用在真实感强的雨,雪,烟花等效果的制作中。

 images/gpgpu.jpg



问题的建模
为了能集中精力解决核心问题,我们把问题抽象了,并且减少了许多复杂或可选的因素,剩下了描述粒子物理特性里核心的问题:
位置,速度,加速度。
我们使用三张float-point纹理保存和更新每个粒子的这三项属性。
至于场景,我们使用一张实时渲染目标来保存。渲染的时候,在一定
的高度(高于场景的最高点就可以了),使用正投影,把场景渲染到目标。

技术要点
如上图,通过即时把场景渲染到高度图,
即使用降维处理,能获得效率非常高的碰撞检测。
具体来说,就是在象素SHADER里,对于每个粒子(对应着以上三张纹理的每个象素)
读取着三张纹理,分别计算。至于碰撞检测,我们根据粒子的位置,计算出所对应的
高度图的纹理坐标,然后读取对应象素(在该象素里,我用前三位表示该点的法线,
而用最后一位表示该点的高度)

测试结果
本系统使用前沿GPGPU的方式进行动画计算,
使得在50万个粒子动画的情况下在7950GT的机器上跑40FPS。
进一步优化,使用shadermodel3.0的新特性vertex texture的情况下,可跑70FPS。
这是基于严格的理论计算,使用最高精度的运行结果。
而在具体项目过程中,可采用优化策略,还有比较大的提高效率的空间。

拓展与局限性
理论上讲,这种方法的局限性是特别大,类似通过高度图实现的地形一样,对于复杂的场景,这种方法无法实现准确的碰撞
检测,因为有许多横向凹进去的地方,这种办法使用的盲目降唯处理,会丢失很多重要信息。
但从测试效果来看,其实这种错误其实从视觉来说是不明显的,也就是说,可以以欺骗眼睛的方式,应用于对真实性不是严

格要求的场合,譬如游戏里的大规模粒子(雪,雨)等,是可以了。