GAMES104-12:特效:粒子和声效系统
十二、特效:粒子和声效系统
12.1 粒子基础
12.1.1 粒子
空间中的一个面片/3D模型,包含如下属性:
- 位置、速度、大小、颜色、生命周期
12.1.2 粒子的生命周期
12.1.3 粒子发射器
发射器设置粒子的随即初始值:
- 随机速度、随机方向
12.1.4 粒子生成
生成位置:
- 单点、区域、mesh
生成模式:
- 连续型、爆发型
12.1.5 粒子模拟
可以改变粒子的
- 位置、旋转、颜色、大小
- 与环境产生碰撞
12.1.6 粒子的类型
12.1.6.1 Billboard Particle
一个面片,始终朝向摄像机
12.1.6.2 Mesh Particle
每个粒子都是一个3D模型
- 每个particle都不一样,可以通过XYZ方向的随机放缩&旋转实现
12.1.6.3 Ribbon Particle
每个粒子拖出的是一条光带
- 粒子在飞行的过程中,会拉出一个个额外的控制点
- 每个粒子有一定的宽度,把一个个控制点连接在一起
- 一般会使用样条曲线插值,使用Catmull曲线
12.2 粒子渲染
12.2.1 透明物排序
从最远的透明物,逐步画到最近的透明物
12.2.2 粒子排序
全局排序:将所有emitter生成的粒子放在一起排序
- 优点:真实
- 缺点:绘制成本高
按照emitter分类排序
- 缺点:不同emitter生成的粒子相互的重叠关系不对,如右下图
12.2.3 Full-Resolution Particles
粒子由于是透明物,因此无法像其他物体一样,只需要shading最后一个像素,因此会十分吃性能
12.2.4 Low-Resolution Particles
将屏幕的分辨率降低,然后绘制所有透明物体,最后再将其进行上采样,与原有图像混合
- 下采样后的绘制不需要绘制Z-Buffer,因为每一个透明物体都需要绘制
- 需要对整个图像计算一个alpha值,用于后续的混合
- 当粒子离相机特别近的时候,会删除一些粒子,以降低在同一个像素点上需要绘制的粒子的数量
12.3 GPU粒子
12.3.1 生成 => 模拟 => 排序
12.3.1.1 Initial State
- 定义Particle Pool,用于保存所有粒子的描述数据
- 如位置、速度、颜色、尺寸
- 定义Dead List,用于表示当前Particle Pool中可用的粒子数据
- 定义Alive List,用于表示活着的粒子的数据
12.3.1.2 Spawn Particles
假设一个emitter产生了5个粒子:
- 从Dead List的尾部取5个位置,放到Alive List中
12.3.1.3 Simulate
计算Alive List中所有粒子的属性,并写入Particle Pool
- 如果该粒子活着,则将其添加到Alive List 1中
- 如果该粒子死亡,则将其添加进Dead List中
- 每个tick时,在computer shader中,计算出每个粒子生命周期的变化,将其反向更新到Alive List & Dead List,再通过buffer swapping,就得到了下一帧要绘制的粒子
- 使用frustum culling,得到所有可见的粒子的列表,进一步减少要绘制的粒子数量
12.3.1.4 Sort,Render and Swap Alive Lists
12.3.2 并行的归并排序
在两个数列中选取一个元素,判断其在合并数列之后的位置:
- 当前数列中在自己前面的,在合并数列中依旧在自己前面
- 在另一个数列中,二分查找有哪些数在自己的前边
- 两者加和,即可得到自己在合并数列中的位置
12.3.3 Depth Buffer Collision
用View Space的深度缓冲,模拟出空间的几何形状,粒子在这里进行碰撞
12.4 粒子应用
12.4.1 Animated Particle Mesh
- 每个粒子存储一个影响自己的Bone
- 把每个粒子所有可能的动画,和在某个状态对粒子速度的影响,全部转换为一个texture
- 每个粒子在simulation的时候,不仅仅计算速度位移,还需要在状态机之间来回切换
12.4.2 Navigation Texture
让粒子在世界中流动起来:
- 根据当前场景形成一个SDF场,表示当前角色在建筑的里面还是外面
- 由SDF,可以得到场景中任何一个位置的导向图
- 对于每个粒子,可以由导向图生成一个指引性的力,让人物动起来
- 在计算过程中,可以添加一些随机量,让粒子随机切换状态
12.4.3 Design Philosophy
12.5 声音基础
12.5.1 相关术语
12.5.1.1 音量
音量本质上是空气的压强
12.5.1.2 Pitch 频率
12.5.1.3 Timbre 音色
音色是由不同基波叠加产生的差异
12.5.1.4 相位 & 降噪
12.5.1.5 人的听力范围
12.5.2 数字声音
12.5.2.1 PCM:脉冲代码调制器
对信号依次进行:
- 采样
- 量化
- 编码
12.5.2.2 Audio Format
12.6 三维音频渲染
12.6.1 Listener
是一个虚拟的麦克风
- 位置(第三人称游戏通常会在角色和相机之间的某个点)
- 速度
- 朝向
12.6.2 Spatialization 空间感
- 声音的大小
- 到达左右耳之间声音的差距(10ms即可感知差距)
- 到达左右耳时,音色会发生变化
12.6.3 Panning
Panning算法:通过调整在通道中不同声音的大小、音色、latency,产生虚拟的空间感觉
12.6.4 Attenuation 衰弱
12.6.5 环境的影响
通过ray casting计算相应的效果
12.6.6 混响
- 干音dry:直接进入耳朵的声音
- 回音echo:声音打到墙上反射的声音
- 尾音tail:声音产生回音之后,还会有没有打到耳朵的声音继续反弹,产生尾音
12.6.7 运动中的声音:多普勒效应
12.6.8 对声场的采样
12.6.9 常用声音中间件
通过中间件,连接audio designer和游戏引擎,让audio designer在自己习惯的环境下工作
12.6.10 对声音世界进行建模
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 华风夏韵!
评论