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