Heavily inspired by Steam Audio. The solution is probe-based. Unlike Steam, the probe mesh is sparse and connections are partial, making the graph much smaller and faster to traverse. Sparse probes also mean that it adapts to spaces, requiring fewer parameter tweaks and scaling to huge spaces.
There are a number of different features, including pathing if you want it, which routes sound around corners with correct attenuation and transmittance. There are participating media volumes, allowing you to mix air and water for example with support for arbitrary shapes.
Surfaces have acoustic material representation, with absorption and transmittance per-band.
When pathing is enabled - this demo runs simulation at ~1ms per frame and scaling sub-linearly in number of probes, without pathing it’s constant 0.1ms, regardless of number of probes.
When simulation is enabled for an emitter - we cast primary visibility (audibility) rays towards the listener, so we get primary occlusion even if pathing is disabled.
The leaking that you can hear outside of the walls is transmittance of the materials, allowing some of the lower frequencies through and subtly shifting others.
Pathing seems easy, but it’s not, because we have to model reflection, the sound can’t just travel between 2 probes, it depends where the sound is coming from and where it’s going to around each probe. We bake that using spherical gaussians, the end result is very convincing and takes advantage of the materials’ existing scatter/absorb properties.
The bake is fully automatic, using the same tech I developed for light probe volumes with a few minor tweaks that are audio-specific.
This scene here takes 4.8 seconds to bake with 1123 probes and 42774 edges placed. The baked mesh is fully persistent, you can save it to a file and load it later on. This mesh takes ~400Kb.
Note that there are no special tweaks here, there are probes all the way up in the air and all around the platform underneath, the bake makes no assumptions about the interaction mode.