十二、特效:粒子和声效系统

12.1 粒子基础

12.1.1 粒子

空间中的一个面片/3D模型,包含如下属性:

  • 位置、速度、大小、颜色、生命周期

image-20230731111013026

12.1.2 粒子的生命周期

image-20230731111137829

12.1.3 粒子发射器

发射器设置粒子的随即初始值:

  • 随机速度、随机方向

image-20230731112909187

12.1.4 粒子生成

生成位置:

  • 单点、区域、mesh

image-20230731113202843

生成模式:

  • 连续型、爆发型

image-20230731113344685

12.1.5 粒子模拟

image-20230731113450835

image-20230731113528467

可以改变粒子的

  • 位置、旋转、颜色、大小
  • 与环境产生碰撞

12.1.6 粒子的类型

12.1.6.1 Billboard Particle

一个面片,始终朝向摄像机

image-20230731113840940

12.1.6.2 Mesh Particle

每个粒子都是一个3D模型

  • 每个particle都不一样,可以通过XYZ方向的随机放缩&旋转实现

image-20230731114050915

12.1.6.3 Ribbon Particle

每个粒子拖出的是一条光带

image-20230731114215219

  • 粒子在飞行的过程中,会拉出一个个额外的控制点
  • 每个粒子有一定的宽度,把一个个控制点连接在一起

image-20230731114238604

  • 一般会使用样条曲线插值,使用Catmull曲线

image-20230731114609891

image-20230731114509858

12.2 粒子渲染

12.2.1 透明物排序

从最远的透明物,逐步画到最近的透明物

image-20230731114732175

12.2.2 粒子排序

全局排序:将所有emitter生成的粒子放在一起排序

  • 优点:真实
  • 缺点:绘制成本高

按照emitter分类排序

  • 缺点:不同emitter生成的粒子相互的重叠关系不对,如右下图

image-20230731114819367

12.2.3 Full-Resolution Particles

粒子由于是透明物,因此无法像其他物体一样,只需要shading最后一个像素,因此会十分吃性能

image-20230731115755930

12.2.4 Low-Resolution Particles

将屏幕的分辨率降低,然后绘制所有透明物体,最后再将其进行上采样,与原有图像混合

  1. 下采样后的绘制不需要绘制Z-Buffer,因为每一个透明物体都需要绘制
  2. 需要对整个图像计算一个alpha值,用于后续的混合
  3. 当粒子离相机特别近的时候,会删除一些粒子,以降低在同一个像素点上需要绘制的粒子的数量

image-20230731115741692

12.3 GPU粒子

image-20230731153534879

12.3.1 生成 => 模拟 => 排序

12.3.1.1 Initial State

  • 定义Particle Pool,用于保存所有粒子的描述数据
    • 如位置、速度、颜色、尺寸
  • 定义Dead List,用于表示当前Particle Pool中可用的粒子数据
  • 定义Alive List,用于表示活着的粒子的数据

image-20230731153611222

12.3.1.2 Spawn Particles

假设一个emitter产生了5个粒子:

  1. 从Dead List的尾部取5个位置,放到Alive List中

image-20230731153823555

12.3.1.3 Simulate

计算Alive List中所有粒子的属性,并写入Particle Pool

  1. 如果该粒子活着,则将其添加到Alive List 1中
  2. 如果该粒子死亡,则将其添加进Dead List中
  • 每个tick时,在computer shader中,计算出每个粒子生命周期的变化,将其反向更新到Alive List & Dead List,再通过buffer swapping,就得到了下一帧要绘制的粒子
  • 使用frustum culling,得到所有可见的粒子的列表,进一步减少要绘制的粒子数量

image-20230731153952906

12.3.1.4 Sort,Render and Swap Alive Lists

image-20230731154715120

12.3.2 并行的归并排序

在两个数列中选取一个元素,判断其在合并数列之后的位置:

  1. 当前数列中在自己前面的,在合并数列中依旧在自己前面
  2. 在另一个数列中,二分查找有哪些数在自己的前边
  3. 两者加和,即可得到自己在合并数列中的位置

image-20230731154923121

image-20230731155040057

12.3.3 Depth Buffer Collision

用View Space的深度缓冲,模拟出空间的几何形状,粒子在这里进行碰撞

image-20230731163336612

12.4 粒子应用

12.4.1 Animated Particle Mesh

  1. 每个粒子存储一个影响自己的Bone
  2. 把每个粒子所有可能的动画,和在某个状态对粒子速度的影响,全部转换为一个texture
  3. 每个粒子在simulation的时候,不仅仅计算速度位移,还需要在状态机之间来回切换

image-20230731163643143

image-20230731163736750

让粒子在世界中流动起来:

  1. 根据当前场景形成一个SDF场,表示当前角色在建筑的里面还是外面
  2. 由SDF,可以得到场景中任何一个位置的导向图
  3. 对于每个粒子,可以由导向图生成一个指引性的力,让人物动起来
  4. 在计算过程中,可以添加一些随机量,让粒子随机切换状态

image-20230731164133003

image-20230731164615197

12.4.3 Design Philosophy

image-20230731164837811

image-20230731164848741

image-20230731164957470

12.5 声音基础

12.5.1 相关术语

12.5.1.1 音量

音量本质上是空气的压强

image-20230731171227694

image-20230731171239196

12.5.1.2 Pitch 频率

image-20230731171619641

12.5.1.3 Timbre 音色

音色是由不同基波叠加产生的差异

image-20230731171721378

12.5.1.4 相位 & 降噪

image-20230731171838212

12.5.1.5 人的听力范围

image-20230731171924901

12.5.2 数字声音

12.5.2.1 PCM:脉冲代码调制器

对信号依次进行:

  1. 采样
  2. 量化
  3. 编码

image-20230731172034772

image-20230731172709056

image-20230731172731618

12.5.2.2 Audio Format

image-20230731173016753

12.6 三维音频渲染

12.6.1 Listener

是一个虚拟的麦克风

  1. 位置(第三人称游戏通常会在角色和相机之间的某个点)
  2. 速度
  3. 朝向

12.6.2 Spatialization 空间感

  1. 声音的大小
  2. 到达左右耳之间声音的差距(10ms即可感知差距)
  3. 到达左右耳时,音色会发生变化

image-20230731173830145

12.6.3 Panning

Panning算法:通过调整在通道中不同声音的大小、音色、latency,产生虚拟的空间感觉

image-20230731174147523

image-20230731174203793

image-20230731174212714

image-20230731174310977

12.6.4 Attenuation 衰弱

image-20230731174657167

image-20230731174856935

image-20230731174906408

image-20230731174941647

image-20230731175008879

12.6.5 环境的影响

通过ray casting计算相应的效果

image-20230731175410804

image-20230731175500470

12.6.6 混响

  1. 干音dry:直接进入耳朵的声音
  2. 回音echo:声音打到墙上反射的声音
  3. 尾音tail:声音产生回音之后,还会有没有打到耳朵的声音继续反弹,产生尾音

image-20230731175629658

image-20230801103059842

image-20230801103121084

image-20230801103430858

12.6.7 运动中的声音:多普勒效应

image-20230801103508891

12.6.8 对声场的采样

image-20230801103644875

12.6.9 常用声音中间件

通过中间件,连接audio designer和游戏引擎,让audio designer在自己习惯的环境下工作

image-20230801103822294

12.6.10 对声音世界进行建模

image-20230801104022411