Games104学习笔记(14)
GAMES104:游戏引擎中的粒子和声效系统
课程:GAMES104《现代游戏引擎:从入门到实践》
第 12 讲:游戏引擎中的粒子和声效系统
本地视频时长:约 1 小时 47 分钟
一、这节课解决什么问题
粒子与声音都属于游戏中的效果系统:它们通常不直接决定规则,却负责把事件转化为可感知的反馈。爆炸、火焰、尘土、雨雪、脚步、枪声、环境混响等效果,需要在有限预算内同时做到可控、可信和可扩展。
两类系统的共同点是:都以大量短生命周期对象或信号为载体,都需要围绕生成、更新、裁剪、混合与资源管理建立稳定的数据流。区别在于粒子主要处理可见的动态几何或图像元素,声效主要处理时域信号及其与听者、空间的关系。
二、学习目标
- 理解粒子的生命周期,以及发射器、模块和粒子系统之间的关系。
- 认识粒子模拟、透明渲染、排序与 GPU 并行更新的主要矛盾。
- 了解声音的振幅、频率、声压级和采样等基础概念。
- 建立 3D 音频中方位、距离衰减、遮挡和混响的整体框架。
三、粒子系统:用大量简单单元构成复杂效果
1. 粒子生命周期
一个粒子通常经历生成、存活、响应环境与死亡四个阶段。运行时需要维护的位置、速度、年龄、寿命、颜色、尺寸、旋转、随机种子等属性,会随着每一帧更新。
可把单个粒子的状态写为:
$$ \mathbf{s} = \left(\mathbf{x}, \mathbf{v}, a, T, c, q, \ldots\right) $$
其中 $\mathbf{x}$ 是位置,$\mathbf{v}$ 是速度,$a$ 是年龄,$T$ 是寿命,$c$ 是颜色,$q$ 可代表尺寸或旋转等显示属性。当 $a \geq T$ 时,粒子退出存活集合,并可回收到对象池中复用。
生命周期的关键不在于固定一条公式,而在于让属性变化可配置:例如颜色从亮到暗、尺寸由小变大、速度逐渐衰减,或由碰撞结果改变运动方向。
2. 发射器、模块与系统
粒子系统常按如下层次组织:
| 层次 | 职责 | 示例 |
|---|---|---|
| 模块 | 封装一种可组合的行为 | 初始速度、颜色渐变、重力、碰撞 |
| 发射器 | 决定一组粒子如何产生和更新 | 火焰发射器、烟雾发射器 |
| 粒子系统 | 管理多个发射器并形成完整效果 | 爆炸、魔法技能、暴风雪 |
这种组合式设计将共性逻辑放入模块,将效果差异留给发射器参数与模块组合。编辑器侧的图形化模块编排,实质上是在配置一条粒子数据的生成与变换管线。
3. 模拟:力、积分与环境交互
粒子运动通常采用近似积分。以显式欧拉法为例:
$$ \mathbf{v}_{n+1} = \mathbf{v}_n + \mathbf{a}_n \Delta t $$
$$ \mathbf{x}_{n+1} = \mathbf{x}n + \mathbf{v}{n+1} \Delta t $$
常用作用包括重力 $\mathbf{F}=m\mathbf{g}$、黏滞阻力 $\mathbf{F}=-k\mathbf{v}$、风场以及吸引或排斥力。粒子效果追求的是可读的视觉运动,并不总要使用高精度物理;在表现和预算之间选取合适近似更重要。
环境交互会显著增加成本。地面碰撞、深度碰撞、网格碰撞和流场会让火星弹跳、烟雾绕行或尘土附着,但也需要明确碰撞精度、次数和可接受的穿透误差。
四、粒子的呈现:外观、透明与排序
1. 常见表示方式
| 表示方式 | 优点 | 适用效果 |
|---|---|---|
| Sprite 或 Billboard | 面数低,易于批量绘制 | 火焰、烟雾、光点、雨雪 |
| Mesh Particle | 体积感和轮廓更强 | 碎石、落叶、爆裂物 |
| Ribbon 或 Trail | 连续轨迹自然 | 刀光、弹道、拖尾、飘带 |
| Animated Mesh | 可展示局部骨骼或形变动画 | 具有角色感的特效单元 |
选择表示方式时,应优先判断效果依赖的是体积、方向、连续轨迹还是纹理变化,而不是一律增加模型复杂度。
2. 半透明混合与绘制顺序
半透明粒子常使用源颜色与目标颜色的 alpha 混合:
$$ C_{\text{out}} = C_{\text{src}}\alpha_{\text{src}} + C_{\text{dst}}\left(1-\alpha_{\text{src}}\right) $$
这类混合一般依赖从远到近的绘制顺序;顺序错误时,烟雾、云雾和火焰会出现层次颠倒。全局排序能得到较好的正确性,但粒子数量大时开销高,因此工程中常采用近似:按发射器排序、按桶排序,或把粒子分块后再排序。
3. 降分辨率粒子
当半透明粒子覆盖大量屏幕像素时,填充率会成为瓶颈。一个常见折中是先在低分辨率缓冲区绘制粒子,再结合场景颜色、深度和双边上采样合成回主画面。
它降低了粒子的像素着色成本,但也带来边缘模糊、深度断裂和小粒子丢失等风险。因此应根据效果类型决定:大面积烟雾和雾气适合该策略,清晰的近景火星、UI 化特效则更需要完整分辨率(事实上还是需要依据现实条件来考虑)。
五、GPU 粒子:让数据布局服务于并行更新
1. 粒子池与存活列表
GPU 粒子通常预先分配固定容量的粒子池,并用存活列表与死亡列表管理槽位:
- 发射时从死亡列表取出空槽位,写入初始状态。
- 模拟时只遍历存活粒子,更新属性并标记死亡项。
- 渲染时读取存活列表,而不扫描整个粒子池。
这种结构避免了频繁创建、销毁对象,也让粒子数量可以被明确限制。它是效果系统可预测性能的基础。
2. 并行筛选与合并
更新后需要把仍存活的粒子紧凑地写入下一帧列表。并行场景中,线程无法直接随意追加而不发生竞争,因此需要使用前缀和、分块计数、并行归并等方法,为每个线程计算稳定的写入位置。
排序与筛选的共同难点是:逻辑上要得到连续、有序的数据,执行上又希望每个线程独立工作。设计 GPU 算法时,数据访问模式和同步代价通常比单条计算公式更决定性能。
3. 系统设计取舍
GPU 粒子擅长高并发更新和绘制,但 CPU 读取粒子状态、做复杂游戏逻辑或频繁跨端同步会削弱优势。较好的职责划分是:CPU 配置发射器与资源、决定高层触发;GPU 负责大量粒子的模拟、筛选、排序和渲染。
六、声音基础:先理解信号,再谈空间感
1. 振幅、频率与相位
声音可视作随时间变化的波形。振幅影响响度感知,频率对应音调高低,相位描述波形在周期中的相对位置。相同频率和振幅的波如果相位相反,会出现相互抵消;这也是混音和降噪中需要关注相位关系的原因。
声压级常以分贝表示:
$$ L_p = 20\log_{10}\left(\frac{p}{p_0}\right),\mathrm{dB} $$
其中 $p$ 是有效声压,$p_0$ 是参考声压。分贝是对数尺度,数值上的线性加减并不等同于听感上的线性增减。
2. 采样与音频格式
数字音频以固定采样率记录连续信号。为避免混叠,采样频率应至少满足奈奎斯特条件:
$$ f_s \geq 2f_{\max} $$
采样率、位深、声道数和编码方式共同决定音频的质量、体积、解码成本与流式播放策略。无损或未压缩格式便于保真和编辑,有损格式更有利于节省存储与带宽;在游戏中还需区分短音效的内存常驻和长音乐的流式读取。
七、3D 音频:把声音放回游戏世界
1. 空间化的组成
空间化不是只调节音量,而是让听者感知声源的方向、距离和环境。常见手段包括:
| 手段 | 主要线索 | 特点 |
|---|---|---|
| 声像控制 Panning | 左右声道能量差 | 实现简单,适合立体声布局 |
| 声场 Soundfield | 多声道方向信息 | 有利于环绕声与环境声 |
| 双耳音频 Binaural | 头部相关传递函数等线索 | 耳机下方向感更强 |
空间化应随声源、听者位置和朝向更新,并与相机系统区分:视觉上可见不意味着听觉上应同样突出。
2. 距离衰减
现实世界中,声压随距离增大而减弱。游戏中常以可调的衰减曲线近似这一规律,例如让强度与距离 $r$ 呈反比或分段衰减:
$$ A(r) \propto \frac{1}{r} $$
实际项目通常会设定最小距离、最大听距和自定义曲线,避免近距离音量爆炸、远距离突然消失,或让关键反馈在玩法上听不见。
3. 遮挡与环境
墙体、地形和建筑会阻挡或改变声音传播。简单实现可从听者向声源发射射线,依据命中材质或遮挡比例降低直达声,并对高频做更强衰减。复杂场景可以使用多个采样方向、区域连通关系或预计算数据来估计声源可达性。
混响描述声音在环境中多次反射后形成的尾声。它通常由直达声、早期反射和后期混响组成。预延迟、衰减时间、湿声比例和频段衰减等参数,决定了空间是狭小房间、空旷大厅还是潮湿洞穴。
4. 声音世界建模
声音系统需要从场景获得几何与材质信息:哪些表面会反射,哪些区域彼此连通,听者与声源之间是否存在遮挡。与渲染类似,精确声学模拟代价很高;游戏引擎通常使用分层近似,将关键空间特征转化为实时可控的音频参数。
八、粒子与声效如何协同
一个好的效果不应把粒子和声音当作彼此独立的装饰。它们应由同一游戏事件驱动,并共享必要的空间、材质和强度信息:
- 命中事件可同时触发火花粒子、冲击声和短暂的环境反射。
- 爆炸的粒子规模、低频能量和听距衰减应表达同一强度等级。
- 进入室内时,视觉烟尘、声源遮挡与混响变化共同提示空间切换。
效果系统的目标是建立一致的感知因果关系,而不是单独堆叠更多特效资源。
九、要点回顾
- 粒子系统的核心是可配置生命周期与批量数据管理,而非单个粒子的复杂性。
- 半透明粒子的主要工程问题是填充率与排序;近似方法需要在画质和成本之间选择。
- GPU 粒子依赖固定粒子池、存活列表和高效并行筛选,避免 CPU 与 GPU 频繁来回同步。
- 声音系统以信号处理为基础,以空间化、衰减、遮挡和混响建立听觉世界。
- 粒子和声音应共同服务于同一个游戏事件与空间语义,形成可信、及时的反馈。