GPU加速的大规模粒子雪景

发表于2015-08-28
评论0 1.8k浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏程序行业精英群

711501594

背景

       雨、雪等天气效果是户外场景的重要组成部分,一个高效、真实的天气模拟系统可以显著地提高户外场景的真实感和渲染品质。目前,对于雨、雪等自然效果的模拟方案可以归结为两大类:

1.  粒子系统:使用粒子模拟场景中的每个雪花、每条雨丝

2.  纹理卷轴动画:在屏幕空间中通过纹理卷轴模拟整体效果

传统的粒子系统和纹理卷轴都存在其各自固有的局限性,因此也衍生出了许多巧妙的解决方案。对于纹理卷轴动画而言,解决方案主要集中在提高纹理动画的层次感和解决在不同观察角度的时差问题,比较有代表性的是ATI提出的层次纹理卷轴和微软提出的锥体纹理动画,在KM上有针对这种方案详细介绍和实现(参见文章:天涯明月刀OL中的雨景渲染)。这里我们主要针对讨论如何弥补传统粒子系统的缺陷,在基于粒子系统的基础上实现对雨、雪等效果的高效模拟。

 

基于粒子系统的雨、雪模拟

和纹理卷轴动画的模拟系统相比,粒子系统在模拟雨、雪等效果上存在以下优势:

1.  粒子真实存在于场景中,不存在层次和视角切换带来的视差缺陷

2.  可以自由地控制每个粒子的运动,可以比较轻松地实现在风中的扰动等复杂效果

3.  实现简单

同时,传统的粒子系统在模拟雨、雪等天气效果时也存在一些严重的问题:

1. 密集粒子系统对CPU、GPU以及带宽存在多重的性能消耗

2. 很难高效地营造大雨或大雪的效果

 

基于GPU的大规模粒子系统

针对传统粒子系统的这些问题,我们参考基于GPU的粒子系统实现方案设计了一套简单的大规模密集粒子系统用于模拟雨、雪等自然效果:

http://km.oa.com/files/post_photo/446/191446/96297608c77a1333741ac1713735cf34.jpg  

上图展示了设计方案的关键流程,算法的核心思想在于充分利用现代 GPU的顶点处理能力将粒子顶点数据的更新完全放入顶点着色器中,减少CPU的在粒子更新上的消耗,并且利用类似实例化的思想将一份顶点数据辅以不同的随机参数多次渲染,以达到期望的粒子密度而没有额外的数据和带宽消耗。

 

粒子数据共享和复用

在此方案中,我们一次在制定范围内随机生成了1,000个粒子,并将这1,000辅以不同的随机参数(风向、风速、随机扰动)渲染了4遍,达到了理想的粒子密度。在整个过程中,全部粒子数据仅在程序初始化时创建并在第一渲染时上传GPU,极大地提高了数据的复用率,节约了带宽资源。

CPU数据更新

由于粒子的位置更新全部在GPU顶点处理阶段实现,CPU仅需要更新全局粒子的累计下降位移以及每个批次粒子在风速影响下的累计扰动位移,其负载可以忽略不计。

GPU数据更新

粒子在顶点着色器中的更新包括中心点位置更新和顶点数据展开两大部分,经过顶点变化之后,我们便可以得到动态的雨、雪效果,并且可以通过速度、粗细、长短等参数方便地模拟出小雨、大雨、小雪、大雪等不同需求的场景。

中心点位置更新

在CPU中,我们以粒子的中心点为单位进行累计的重力和风力更新,在GPU中,我们直接假设数据的数据为世界坐标系,并在指定的区域内进行WRAP,超出范围的顶点将通过WRAP的方式重复利用。最终我们将顶点适当偏移后进行View-Project变换,形成了以相机位置为参考原点的无限雨、雪区域。

顶点数据展开

为了灵活性和数据复用,同大多数GPU粒子系统一样,我们在创建粒子数据时将粒子QUAD相关的四个点全部集中于粒子中心点的坐标,然后在顶点着色器中进行展开,以实现不同大小的粒子

1.  Y方向展开:Y方向展开以速度和长度以及旋转方向作为缩放因子,并以UV的Y坐标作为展开索引

http://avocado.oa.com/fconv/files/201402/914dd1ed72f7773160fbf1dda1ffdab4.files/image002.jpg

2.   X方向展开:X方向展开出了宽度因子还要考虑面向相机的问题。因为我们在屏幕空间实现X方向展开,因此只要X的展开方向和Y展开方向正交,就可以保证粒子QUAD面向相机。假设Y展开的2D方向是(x, y)x的展开方向只需简单地设为(-y, x)

http://avocado.oa.com/fconv/files/201402/914dd1ed72f7773160fbf1dda1ffdab4.files/image003.jpg

测试

为了关注于粒子系统的性能,我们搭建了一个只有粒子系统的简单场景,包含1,000粒子共4,000个顶点数据,渲染了四次共16,000个顶点,消耗4个DrawCall,相机渲染负载不到1MS,CPU端除了相机的Culling无其它负载

http://avocado.oa.com/fconv/files/201402/914dd1ed72f7773160fbf1dda1ffdab4.files/image004.png

http://avocado.oa.com/fconv/files/201402/914dd1ed72f7773160fbf1dda1ffdab4.files/image005.jpg

http://avocado.oa.com/fconv/files/201402/914dd1ed72f7773160fbf1dda1ffdab4.files/image006.jpg

结论

基于GPU的粒子系统充分利用了现代GPU在复杂运算上的性能优势,将大规模粒子系统的负载从CPU转移到了GPU。对于大型游戏而言,具有非常优秀的实践价值。然后,顶点运算负载的加重对于大量使用了GPU蒙皮或者Morph的D3D9程序而言,仍然需要充分的验证和测试。此外,对于雨、雪场景中其它常用的效果,如涟漪、地面反射、环境高度图遮挡等方案在KM上都有比较详尽的介绍,这里就不再累述。

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

游戏学院公众号二维码
腾讯游戏学院
微信公众号

提供更专业的游戏知识学习平台