.. _1 Pico空间音频渲染器: 1 Pico空间音频渲染器 =============================== 以下将阐述Pico空间音频渲染器(Pico Spatial Audio)在unity环境中的集成指南,请认真跟随所述操作。 支持的Unity版本 -------------------------------------- 目前引擎在以下版本中测试可用 - 2020.3LTS - 2021.1LTS、2021.2LTS 检查 Pico Spatial Audio 引擎 Unity 包内容 ----------------------------------------------------------------------------- - Plugins: 保存着各个硬件平台的引擎动态库,可根据unity实际运行的平台自行删除无用的动态库文件 - Prefabs:保存着一些工具prefab - Samples:保存着若干样例场景,可点开试听空间化引擎 - Runtime:保存着引擎所需的C#源代码,其中需要Unity开发者关注的是如下文件, - PXR_Audio_Spatializer_Context.cs - PXR_Audio_Spatializer_AudioSource.cs - PXR_Audio_Spatializer_AmbisonicSource.cs - PXR_Audio_Spatializer_AudioListener.cs - 另外还有一些辅助文件,请确保他们也存在: - PXR_Audio_Spatializer_API.cs - PXR_Audio_Spatializer_Types.cs - 若你需要使用环境声学模拟引擎,请确保如下C# script都存在: - PXR_Audio_Spatializer_SceneGeometry.cs - PXR_Audio_Spatializer_SceneMaterial.cs OK!你应该已经有了所有你需要的文件了。下面我们将阐述如何在Unity中接入Pico Spatial Audio引擎。我们将从简单的空间化开始讲起,过渡到实时环境声学模拟,最后说明如何渲染ambisonic 信号。 集成 Pico Spatial Audio 引擎(free field) --------------------------------------------------------------------------------------- Free field场景即完全没有环境声学模拟的场景。在free field使用场景下,我们只需要如下3个文件即可: - PXR_Audio_Spatializer_Context.cs - PXR_Audio_Spatializer_AudioSource.cs - PXR_Audio_Spatializer_AudioListener.cs 集成步骤如下: - 1. 打开unity,创建一个空白3D工程 - 2. 安装Pico Spatial Audio渲染器插件到你的项目 a. 解压缩PicoSpatialAudio.zip b. 支持以下三种安装方法 i . 将 PicoSpatialAudio 文件夹拷贝至你的Unity工程文件夹中,放置在Assets文件夹下 ii . 将 PicoSpatialAudio 文件夹拷贝至你的Unity工程文件夹中,放置在Packages文件夹下 iii . 在 unity package manager 中添加 1. 点击窗口左上角的 + 号,从磁盘上安装 .. image:: _static/1.1.png 2. 选择 PicoSpatialAudio 文件夹下的 package.json,双击导入 c. **使用 Mac 的开发者们请注意:** i . 在 Mac 端,由于系统 Gatekeeper 机制的问题,你可能会看到这样的警告信息 .. image:: _static/1.2.1.png .. image:: _static/1.2.2.png 这是由于系统错误阻止了我们的空间音频动态库的加载;当前,在看到这样的警告时,请暂时按照如下步骤绕过这个问题: 1. 打开系统偏好设置,前往安全与隐私 2. 请注意到窗口下方,系统提示已阻止使用”libPicoSpatializer.dylib“ 或者 “libPicoAmbisonicDecoder.dylib”。点击右侧的“仍然允许”按钮 .. image:: _static/1.3.png 3. 如果还存在一开始的警告窗口,在这些窗口上点击“好” 4. 请重启你的Unity工程,如Unity 以及 Mac 系统都不再报错了,证明Pico 空间音频 SDK已成功安装。 - 3. 在场景中,创建一个空的游戏对象(game object) - 4. 在该game object上加上 PXR_Audio_Spatializer_Context.cs 组件(component) a. 在 PXR_Audio_Spatializer_Context.cs 组件上,可自行设置渲染质量,以获得最佳的质量/效率组合。 .. image:: _static/1.4.png - 5. 在场景中创建另一个game object,为了你之后视觉上看得更清楚,建议创建一个球 - 6. 在球上加上 PXR_Audio_Spatializer_AudioSource.cs 组件(component)。一个Audio Source组件将被自动加入。 a. 建议保持Unity AudioSource spatial blend的值为0;一个非0的spatial blend会导致一部分unity的空间化效果和Pico 空间音频渲染器共同作用,造成比物理现实更夸张的音量衰减和多普勒效应 .. image:: _static/1.5.png - 7. 找到场景中的audio listener存在于哪个game object上(应该在你的camera上),在该object上加上 PXR_Audio_Spatializer_AudioListener.cs 组件 .. image:: _static/1.6.png 结束了!至此你已经集成完成了Pico Spatial Audio 引擎。 现在,我们让 Pico Spatial Audio 引擎将我们的音频信号空间化 - 1. 选取你想要的测试文件,并将其导入进你的Unity 工程 - 2. 在你的声源object上,你可以看到一个Audio Source 组件。在他的AudioClip field里选取你刚刚导入Unity的音频文件 - 3. 勾选AudioSource 组件上的 “Play On Awake” 以及 “Loop” 选项 .. image:: _static/1.7.png - 4. 点击play!你应该听到你的音频文件被空间化了。 集成 Pico Spatial Audio 引擎(环境声学模拟) --------------------------------------------------------------------------------------------------- 实时环境声学模拟是Pico 空间音频渲染器的重要功能模块,可以根据使用中的实际场景,实时计算并渲染出声源的声波传播至听者处所带来的反射声和混响。下面, **我们在上一章的基础上** ,带你接入环境声学模拟功能。 步骤如下: - 1. 在你的虚拟场景中,导入/构建你的环境建模 - 2. 在你想参与模拟环境声学的环境模型对象上,加上PXR_Audio_Spatializer_SceneGeometry.cs组件。一个 PXR_Audio_Spatializer_SceneMaterial.cs 组件会被自动加上。 - 3. 在PXR_Audio_Spatializer_SceneGeometry.cs中 a. Include Children:用来设置该geometry描述的Mesh是否包含该game object的子对象 b. Ignore Static:用来设置该geometry是否忽视静态mesh c. Visualize Mesh In Editor:在editor中,用白色线框显示与这个geometry相关联的game object. 该功能仅在editor中生效,不会影响 play mode 以及 build。 - 4. 在PXR_Audio_Spatializer_SceneMaterial.cs中 a. Absorption,Element 0 ~ 3:环境材质的吸收率。从element0 到element3为4个频段,由低到高。 b. Scattering:环境材质的散射率。一个高散射率的环境,其反射声听上去会更像混响;而一个低散射率的环境,其反射声听上去会更像一个个独立的回声。 c. Transmission:环境材质的透射率。透射率越高,穿过该几何形状的声音强度越大;反之则越弱。 d. 你可以自行设计这些参数,也可以从material preset中选取我们准备好的预设,并且基于这些预设修改参数。 .. image:: _static/1.8.png 另外请注意:如果你的mesh是从外部导入Unity的话,请确认Read/Write Enabled选项被勾选了: .. image:: _static/1.9.png 集成 Pico Spatial Audio 引擎(Ambisonic 渲染) ------------------------------------------------------------------------------------------------------- 我们的引擎提供了解码一阶AmbiX格式的ambisonic信号的能力。在unity 中,使用方法如下。 - 1. 打开unity工程的project settings -> Audio - 2. 在Ambisonic Decoder Plugin选项卡处,选择Pico Ambisonic Decoder .. image:: _static/1.10.png - 3. 在工程中创建一个ambisonic渲染总线 a. 在工程中创建一个Audio Mixer。为了方便表述,我们假设mixer的名字是“Ambisonic_bus” .. image:: _static/1.11.png b. 单击Ambisonic_bus -> Master,右侧 Inspector 中出现通道条配置 .. image:: _static/1.12.png c. 单击Add Effect,添加Pico Ambisonic Renderer .. image:: _static/1.13.png - 4. 在场景中创建一个game object,挂载 PXR_Audio_Spatializer_AmbisonicSource组件;一个Unity AudioSource会被自动引入 - 5. 将 AudioSource 的 Output 设置为 Master(Ambisonic_bus) 至此,Ambisonic 声源回放配置完毕;我们来试听一下 - 1. 在PicoSpatialAudio -> Sample -> audio 文件夹中,找到 loop_FOA_48k Audio Clip - 2. 把 loop_FOA_48k 拖拽到 AudioSource 的 AudioClip上 a. 如你想使用其他AudioClip,请确保 i . 它是一阶AmbiX格式的 ii . 勾选该 AudioClip 的 “Ambisonic” 选项 .. image:: _static/1.14.png - 3. 勾选AudioSource 组件上的 “Play On Awake” 以及 “Loop” 选项 .. image:: _static/1.15.png - 4. 点击play。如果你使用的 AudioClip 是 loop_FOA_48k,你应该能听到一个电子乐声源按照如下轨迹运动着: a. 先顺时针绕着listener水平旋转一周 b. 然后先上,再下垂直转一圈 集成 Pico Spatial Audio 引擎(工具函数) ------------------------------------------------------------------------------------------------------------------ 我们在引擎中提供了一些对象的工具函数,方便你创建想要的声音场景。所有工具函数都可以实时调用。 - PXR_Audio_Spatializer_AudioSource - public void Resume() - 恢复播放该audio source - public void SetGainDB(float gainDB) - 设置这个source的增益,单位是分贝 dB - public void SetSize(float radius) - 设置这个source的半径长度,单位是米 - PXR_Audio_Spatializer_AmbisonicSource - public void Resume() - 恢复播放该audio source - PXR_Audio_Spatializer_Context - public void SetRenderingQuality(PXR_Audio.Spatializer.RenderingMode quality) - 设置引擎的渲染质量 附录1:开发技巧 ------------------------------------------------------------ 声源数量 ^^^^^^^^^^^^^^^ - 由于环境声学模拟和渲染对CPU负载较大,在使用环境声学模拟时,请确保同时发声的声源数量在20个以下。我们会持续优化性能,提升可同时发声的声源数量。 当前环境声学模拟的局限以及规避方法 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 由于游戏中的场景场景可能较为复杂,直接往复杂场景上挂 PXR_Audio_Spatializer_SceneGeometry 组件可能会导致如下问题: - 场景中,若listener身处一个闭塞的小角落,他可能会听不到场景中某些声源的环境反射声 - 场景中,若listener和source分处室内外,同时建筑的外墙形状又极其复杂,可能会使得listener听到不该听到的反射声(从室内传到室外,或者反过来) - 解决方法有如下几种: - 在想要反射声音的场景处,手动添加一些 Pico Sound Reflection Object(比如下图白色线框处) - 你可以在Pico Spatial Audio -> Prefabs 文件夹中找到 Pico Sound Reflection Object .. image:: _static/1.16.png - 把场景的mesh分组成多个gameobject,只在室内的大型墙面上挂载 PXR_Audio_Spatializer_SceneGeometry 组件,而不要在过多的细节形状上挂载(比如桌椅、柱子等等) - 在游戏流程上规避,不要让玩家可以进入到会出错的场景区域 - 我们会持续迭代我们的环境声学模拟算法,从而在未来发布的版本里简化/去除这些手工配置过程。 附录2:已知问题 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 在Mac OS上,当在Unity editor内运行 PicoSpatialAudio/Sample 文件夹内的样例场景,并按下键盘按钮时,可能会听到“滴滴滴”的Mac系统警告音效。这是一个已知的Unity bug,只能等Unity官方修复这个问题了。问题讨论可以移步此处:https://issuetracker.unity3d.com/issues/macos-funk-error-sound-plays-when-pressing-any-non-shortcut-key-in-play-mode