Occlusion core functionality

One of the challenges of creating immersive audio propagation is handling occlusion – when the path from an emitter to a listener is blocked. Occlusion can add realism and depth to soundscapes, but it can also be computationally expensive at scale.

This scalable audio propagation system aims to be a flexible solution for occlusion, allowing a developer to increase or reduce the quality, and by extension the computational cost, of occlusion simulation on a per-emitter basis.

Points from which the occlusion lines are cast are calculated in real-time to remain perpendicular to the direction vector from emitter to player. This allows infinite flexibility for features such as “Occlusion Spread” (the spread of points) and occlusion update frequency, enabling developers to tailor settings to their needs and even change such parameters at runtime, if desired. This multipoint style of occlusion system was originally inspired by a similar system designed by Scott as part of his FMOD and Unity audio implementation tutorial series (Scott, 2022).

The above images show the occlusion system being used in its “Ultra” quality preset, with an update frequency of 0.1 seconds. This is an example of the highest quality occlusion the system can offer, and would likely be reserved for audio sources essential to gameplay and/or immersion. Higher qualities of occlusion quality would be desirable when a smoother transition between occlusion states is required; a greater number of traces allows for a more gradual occlusion change, which is particularly noticeable at low listener movement speeds.

At present, occlusion is available in Low, Medium, High, and Ultra qualities, changing the number of lines cast from emitter to player.

With a low number of instances, all quality settings have a negligible impact on performance; however, the quality options become exponentially important as the density of audio sources increases, ensuring scalability and low overhead.

Currently, all line casts are given equal weighting when calculating an occlusion value. This presents an issue in situations where a significant amount of perpendicular and vertical line casts are occluded, but the direct line of sight is not, resulting in an incorrect level of occlusion filtering. A solution to this would be to give greater weighting to priority line casts, such as line of sight; however, as this issue is almost entirely mitigated by the use of obstruction calculation, and less obvious with the lower occlusion quality presets, it will not be addressed for this prototype.