学习笔记10:粒子与声效

粒子系统

粒子系统里有各种发射器(emitter),发射器发射的粒子(particle)。

粒子是拥有位置、速度、大小尺寸、颜色和生命周期的3D模型。
粒子的生命周期中,包含产生(Spawn)、与环境交互以及死亡。设计中很重要的一点是要控制场景中粒子的数量。
粒子发射器有三个作用:
– 具体规定粒子产生的规则
– 具体规定粒子模拟的逻辑
– 描述如何渲染粒子
粒子系统经常有不止一类发射器,比如火堆这个系统中有火焰、火星和烟雾三种发射器
关于粒子的产生,关系到整体效果的好坏,在位置上可以分为单点产生、在区域上产生和在mesh上产生三类;在模式上也可以分为连续产生和间歇性产生等

粒子的形状一般有三类:
1、Billboard Particle。这种粒子由一些面片构成,其形状其实只有一面,但它始终保持面向摄像头,所以看起来是一个3D的粒子。如果这个particle比较小就无所谓,但如果比较大的时候建议是其形状也会随时间而变化,不然比较假
2、Mesh Particle。要模拟散的碎的粒子时往往直接用3D mesh当做粒子,然后给它们设置各种不同类别的随机属性,从而艺术家也更容易实现想要的效果
3、Ribbon Particle。样条形粒子,其实粒子是样条上的控制点,然后通过连接获得完整的条状。往往使用在比如武器挥舞的残影之类的地方。在控制点连接过程中需要插值,不然每一个连接点间的形状是不连续的(看起来像一个个四边形拼在一起)。一般使用向心的catmull-rom插值(在粒子间加入额外的分割块且数量可自己选定,不过对CPU要求会变高)
 

粒子渲染

常见的透明融合问题在粒子渲染处也需要解决,排序一定要从远到近。
粒子排序有两种方式,一种是全局法,完全按粒子个体来排序,很精准但消耗巨大;另一种是按层级,从简单到复杂的排序是依照粒子系统排序、依照emitter排序和在emitter之内排序。
具体来说,如果依照粒子排序,则按粒子离相机的距离排序;如果按系统或发射器排序,则按Bounding box排序。

另一方面,粒子渲染会带来巨大消耗的原因是“全分辨率粒子”。当我们渲染普通(不透明的)场景时,由于Z-buffer的帮助,其实只需要渲染接触到的场景的第一个物体(其他被遮挡不需要渲染),但粒子效果有时候(最差情况下)会在一瞬间产生叠满整个分辨率好多层的粒子,而且它们不存在完全遮挡关系,所以相当于一下子要进行超大量的渲染。
解决方案是:
降分辨率下采样进行粒子的渲染,此时与原场景无关,获得粒子的颜色和透明度alpha。然后再上采样融合到原场景中。

GPU粒子


从上面的所述可以看到,粒子计算功耗很大,所以放到GPU中是一个解决方案,原因有三:

高并行运算,适合大量粒子的模拟计算
可以释放CPU功耗来进行游戏本身计算
方便获得深度缓冲来做遮挡判断
但有一个难点是粒子拥有生命周期,会不断产生消失,所以如何在GPU中实现粒子是一个难点 。

解决方案:

Intial State
先建立一个粒子池,设计一个数据结构,设定系统包含的粒子总数量,每个粒子的位置、速度等。再有两个list,一个是Dead List,记录当前死亡的粒子,初始时包含所有粒子序号,还有一个是alive list,记录当前活着的粒子,初始时为空。
比如emitter发射了5个粒子,则从池子结尾取5个粒子(序号)放入alive list,同时把dead list的后5个序号清空。

Simulate:
当时间跳转到下一次tick时,会新建一个alive list1,并依序检索alive list中的粒子,如果发现某个粒子死亡了,就会把这个粒子序号移到死亡列表中,并且在渲染时也跳过这个粒子,如果仍存活就照抄到alive list1中。
这个操作因为compute shader的发明变得容易,因为compute shader可以进行原子级操作。
同时,在更新完活着的粒子之后,还可以利用GPU进行frustum culling视角剔除(针对活着的粒子),并且计算它们的距离,写入距离buffer。

Sort, Render and Swap Alive Lists
接着,还需要进行排序、渲染和交换alive list:
1、排序。根据距离buffer对活着的剔除后的粒子排序
2、渲染。对排序后的粒子渲染
3、交换。交换alive list1和alive list,更新存活列表。

具体来说排序。GPU的排序类似归并算法,复杂度为nlogn。采取的方式是针对目标序列(排序后)的每一个位置设置一个线程,考虑它应该从两个列表中哪个取得。这样做会比每个源列表位置一个线程去考虑插入到哪里更简单,因为后者会让“写过程”跳来跳去不连续 。

方法2就是通过目标上位置的点在2个排列好的列表上找对应的值。

同时利用深度缓冲还可以进行碰撞的检测,具体:
1、把粒子的当前位置投影到上一帧的屏幕空间纹理坐标(相当于投影到上一帧相机坐标系?)
2、读取上一帧的深度纹理图中的深度值
3、检查1和2中的深度值,判断是否碰撞了但又没完全穿过去(厚度值会被用到)
4、如果碰撞发生了,就计算碰撞表面法向和粒子反弹的方向
(有点类似于计算阴影的一个方法)

现在的粒子系统在人群运行的运用也逐渐变多

Crowds - Runtime Behavior 人群-运行时行为
.Design target locations to guide the movement of crowds 。设计目标地点,引导人群流动
.The desire moving towards the target location, pushing away from blocking geometry, all become forcesto influence the movement of crowds (if close enough, the camera also acts as a force) 。向目标位置移动的欲望,远离封闭的几何图形,都成为影响人群运动的力量(如果距离足够近,相机也会起到一种力量)。

音效系统

Audio 音频


激发玩家的游玩兴趣
增强现实主义
营造气氛
 

声量的大小

声波,sl单位(Pa)引起的与周围大气压力的局部偏差

粒子速度(V):粒子在介质中传播波的速度,S1单位(m/S)。

 声强(/):单位面积的声波在垂直于该区域的方向上所携带的功率,S1单位:W/m2

频率

音色就是几种基波叠合在一起,频率差不多但是不同基波组合造成音色不同。

Digital Sound 数字声音

通过离散采样把连续的声音数据给存储起来。对任何采样的对象,采样的频率超过它的2倍就可以看做无损。

3D Audio Rendering 三维音频渲染
 

a mono-phonic audio signal 单音音频信号
emanating from a specific position 产生于某一特定位置
空间感:

panning算法

音频信号在新立体声或多声道声场中的分布,可以让人产生空间感的算法。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值