02 - 声效系统
本文将对游戏引擎中的声效系统做简单介绍,包括声音基础,3D音频渲染等内容。
声音基础
音频系统对游戏也很重要,它能让玩家更加声临其境。
音量
声音通过物体振动产生,并在介质中传播。物体振动的幅度越大,音量也就越大。
声音的压强,声音的速度和声音的强度的定义如下:
我们常用于描述音量大小的单位db是用于描述声音压强等级的,它的定义如下:
0分贝相当于一个蚊子在你3米外飞。
音调
就是声音的频率,音调越高听到的声音就越“尖”。
音色
音色则是不同声音波的叠加组合。
相位和降噪
对于一个被认为是噪声的声波,可以另外一个波将其抵消,这也是降噪耳机的原理。
人类的听觉范围
数字音频
现实世界中的声音是无限连续的信号,而要在计算机中存储声音就需要将其离散化。可以通过PCM解决这个问题。
脉冲代码调制器PCM
主要步骤有三步:采样、量化和编码。
采样
根据香农定理,只要采样率是频率的两倍,那么结果就能看作是无损的。
量化
接下来通过量化将采样的数据表达为对应位宽的数据,位宽越大可存储的细节越多。
编码
接下来就能将这些处理好的数据进行编码,常见的音频编码格式如下:
游戏中常用的音乐格式是.ogg
。
3D音频渲染
监听器
就像3D渲染中摄像机负责成像一样,在3D音频中也需要一个监听器来负责“渲染”周围的3D音源。监听器一般有“位置”,“速度”和“朝向”三个属性。
构造空间感
接下来还需要构造监听器对音频的感知空间,一个好的感知空间可以让人们“听声辩位”,能很好的听出声源的位置,甚至左右耳听到的内容还有一点差距。
声像调整算法
这个算法调整多通道不同声音的大小、音色等属性,让监听器身临其境。
例如要模拟一个声源从左到右移动,可以使用线性的Panning算法。
而人们能感知到的其实是它的平方:
需要注意的是,使用线性调整算法且声源刚好在监听器前方时,声强是有较大减弱的:
为了减轻这种效果,可以使用另一种调整算法,它保证左右听到的声强为1:
声音的衰弱
声音的衰弱对于游戏的空间感来说很重要,例如吃鸡中可以根据枪声的程度来判断它离你的距离。
有多种声音衰弱模型供设计师选择:
球体:多用于点声源。
胶囊体:多用于水管等。
箱体:多用于房间内外声音的隔断,出了范围就迅速衰减。
锥体:多用于方向性声源,例如大喇叭。
阻挡物
声音在传播时还会碰到阻挡物,部分阻挡和全部阻挡也有区别。
一些做法是从声源出做一些随机光线投射采样,根据采样结果决定阻挡程度。
混响
混响(Reverb)对空间感的影响也很大,例如在旷野上开车和在隧道里开车听到的效果是完全不同的。混响由如下三要素组成:
- 干音:真实发出的声音,没有经过任何反射。
- 回音:经过障碍物反射(没几次)的声音。
- 尾音:经过障碍物多次反射后的声音。
回音和尾音也被称为湿音。
障碍物也会吸收部分声音,且材质不同吸收声音的程度也不同。
在引擎/中间件中,通过参数化的方式来描述混响:
多普勒效应
波源和观察者有相对运动时,观察者接受到波的频率与波源发出的频率并不相同。这是游戏中打击感和速度感的一个重要来源。
常用中间件
除了自己开发声学引擎外,还能使用中间件。主要有Fmod和Wwise两个,前者较为简单。
参考资料
- GAMES104 (boomingtech.com)
待阅读的资料
- Designing the Bustling Soundscape of New York City in Marvel’s Spider-Man – GDC 2019
- An Interactive Sound Dystopia: Real-Time Audio Processing in NieR:Automata– GDC 2018
- Game Audio Programming in C++ – CppCon
- Spatialization Overview
- Sound Attenuation
- A Wwise Approach to Spatial Audio – Part1 – Distance Modeling and Early Reflections
- A Wwise Approach to Spatial Audio – Part1 – Diffraction
- A Wwise Approach to Spatial Audio – Part1 – Beyond Early Reflections