A new version of the C# raytraced audio SDK will be available for testing soon.
This version is a major upgrade from previous versions, offering more flexibility, new ray types and improved performance. It has also been rebranded to Vercidium Audio to clear up confusion with other raytraced audio products.
This is the final pre-release version. After this, the C# SDK will be available for purchase and use in your games. I would like to thank the 47 developers who have tested the SDK so far, your feedback has been incredibly valuable.
Testing is still open for the C# and Godot plugins. If you'd like to sign up for last-minute testing, please fill out this form. Testing is now closed as we prepare for launch.
Overview
v1.1 reworks many features and systems:
The listener/voice system has been replaced with Emitters
New ray types - Ambient Permeation and Visualisation
More flexible settings - different ray and bounce counts for each ray type
New threading approach - all heavy logic moved to background threads
New material scattering
Vercidium Audio also has a new logo! Full brand files and logo animations will be shared separately.
Emitters
Previously the SDK allowed only 1 listener and multiple voices. The listener could cast any type of ray, and voices could only cast reverb rays.
This restriction has been removed, with the introduction of Emitters.
Emitters represent a 3D position that can cast rays for:
Reverb - rays find line-of-sight back to the emitter
Ambient Permeation - rays measure the thickness of the surrounding geometry
Visualisation - rays paint surfaces around the emitter
Occlusion - rays find line-of-sight with other emitters
Permeation - rays measure the thickness of geometry between emitters
Emitter can cast occlusion and permeation rays to any other emitter. This allows for per-emitter muffling, which could be useful in games with stealth systems, where sounds are heard differently by each NPC.
This video shows occlusion rays between two pairs of emitters:
Ambient Permeation
Previously rain and wind sounds were muffled based on the amount of rays that reached the edge of the world. Since a thin wooden shack and a concrete bunker both block occlusion rays equally, ambient sounds were incorrectly muffled equally in both scenarios.
To solve this, v1.1 adds support for Ambient Permeation rays. These rays travel outwards towards the skybox, passing through geometry and measuring how much energy is lost along the way. Low-frequency and high-frequency energy are measured separately, meaning a low pass filter can easily be applied to ambient sounds.
Visualisation
v1.1 also adds support for Visualisation rays, which paint the location of each ray bounce on the 3D environment.
While other ray types share a common trail and are cast in the same direction each frame, visualisation rays must be cast in random directions.
Without random directions, surfaces are painted the same each time:
With random directions, dots are painted over a wider surface area over time:
To prevent clutter, developers can control:
the number of visualisation rays and bounces
how often these rays are cast
The visualisation results are exposed as an array of position and normal vectors, which can be copied into an instance buffer for rendering.
Please note the SDK does not handle rendering for you - it is up to you to copy the position / normal vectors to your game (e.g. into a particle system)
Architecture, Reverb and Mesh Performance
I've been testing raytraced audio in more complex environments with the help of my architect friend Joel. We're using Rhino 8, which is a 3D modelling tool used by architects.
We created a Rhino plugin that extracts boxes, cylinders and meshes from the above file, and then adds them to our raytraced audio simulation.
Along the way we fixed many issues with permeation, reverb, meshes and performance. We're currently re-creating the Villa Savoye building by Le Corbusier, which is showcased in the video at the start of this post.
One issue was related to reverb. To calculate reverb strength, rays check for line-of-sight back to the emitter on each bounce. The amount of rays with line-of-sight (returning rays) determines the reverb strength.
For example if a ray bounced 8 times and returned on 4 of them, that meant 50% of energy returned back to the emitter.
However, these statistics become skewed with more bounces. In the example below, the first 3 bounces return to the emitter (strong reverb), but the later bounces don't have line-of-sight, which brings the percentage down:
This incorrectly lowers the percentage of returning energy. This is because all bounces were contributing equally to the percentage, whereas really rays lose energy based on:
distance travelled
type of material hit (absorption, scattering, etc)
So rather than counting the total number of returning rays, we'll accumulate the total energy across all returning rays. Earlier bounces have the most energy, and later bounces have less.
However, we can't convert this 'total energy' into a meaningful percentage, as we don't know the maximum energy that can return back to us without doing a complex analysis of the environment ahead-of-time.
To solve this, an energy cap is introduced. This is customisable setting that controls how much energy is required for reverb to be at 100% strength. Developers can adjust this setting based on how much reverb they want to hear.
An energy cap is also used for occlusion and permeation, which you can read about here.
Scattering
Materials have absorption and scattering propertiesthat control how much energy a ray loses when it bounces off a surface.
Absorption reduces energy on every bounce by a flat percentage, and scattering reduces energy based on the sharpness of the ray's bounce. However sharp bounces are very common in a raytracing simulation like this, and this sharpness check was further reducing the energy in each ray.
This sharpness reduction is accurate in more realistic simulations where sound bends and warps around geometry, however this raytracing simulation is only an approximation. As a result, I've removed this sharpness logic from v1.1.
Reverb now sounds more accurate as rays are no longer incorrectly losing more energy than they should. However now absorption and scattering perform the same role:
To simplify this I've combined ScatteringLF and ScatteringHF into one Scattering field. This field no longer affects energy loss - instead it randomises the direction rays are reflected in:
0.0 means no scattering
1.0 means full scattering (90 degree angle change)
This helps break up the uniformity of rays and helps them cover a wider area, especially in complex indoor environments. Developers can customise the absorption and scattering values of materials to their liking.
Next Steps
First I will be updating the Godot Raytraced Audio plugin to use the new C# SDK, as it's still on the old v1.0.6 version.
Then I will send the new v1.1 SDK to those that have signed up for C# or Godot testing. If you would like to test the SDK before it's released, now is your chance! Fill out this form to sign up for testing.
Documentation will be updated soon, with separate docs for v1.0.6 and v1.1.0.
That's all for now - thanks for reading!