改进粒子系统-GPU实现
作者:fannyfish
Blog:http://blog.csdn.net/fannyfish
amma@zsws.org
介绍
即时粒子系统的性能主要受两个因素制约:填充率(fillrate)、CPU-GPU之间的数据传输。填充率即GPU每帧可以渲染的象素数,当粒子很大并且出现好多粒子重叠在一起的情况时会明显影响性能(比如用粒子模拟大面积水雾,烟尘)。通常的做法是先在CPU上进行粒子的物理运算,然后将运算结果传输给GPU渲染。当粒子数目巨大时(如100000个),运算时间和CPU-GPU的传输时间,对即时演算来说都难以接受(比如用粒子模拟大面积雨雪)。
我做的项目中使用了大量粒子:场景特效、打击特效、甚至界面特效,无处不在。目前的粒子系统使用CPU进行物理运算。再加上物理引擎、骨骼融合、游戏逻辑,CPU成为了系统瓶颈,游戏中每帧GPU都要等待一短时间,显卡越好CPU越差越明显。如何将CPU的物理物理运算转移到GPU上,达到负载均衡是优化的关键。
设计
状态无关(Stateless) vs 状态相关(State-preserving)
1,状态无关是指粒子的数据运算,都只根据初始的位置,速度等属性来计算。
2,状态相关是指粒子的数据运算,可以根据上个状态的位置,速度等属性来计算。
在GPU上处理状态相关的粒子系统,需要多张纹理存储粒子状态,对显卡的要求很高。
相反,状态无关的粒子系统对显卡要求低,实现相对简单,所以首先考虑实现这种粒子系统。
与原有粒子系统的关系
使用原有的粒子系统分为如下几个步骤:
1, 美术通过编辑器创建粒子