Point Cloud Sound for irregular shaped audio sources

haeseong1 pts0 comments

Point Cloud Sound for irregular shaped audio sources - runevision

Blog

runevision<br>Rune Skovbo Johansen

Blog

Games

Articles

Tools & Tech

Graphics & Animations

About Me

Point Cloud Sound for irregular shaped audio sources

Jun 14, 2026

in

article,<br>game development

In video game development, we’re used to sound coming from single positions in space, but how do we handle sound coming from an irregular shape?

Visualization of two point cloud sounds for water streams and foliage, respectively.

One technique is to move a regular point audio source to the position inside a volume that’s the closest to the listener. This works fine for convex shapes, and I’ve used it myself in my game Eye of the Temple for the sound coming from a rumbling ceiling trap that’s lowering down, and for the lava floor in a big chamber.

But for non-convex shapes, the closest-point approach has some issues.

Imagine a heavily winding river where a single point on land is equally close to two completely different spots on the river. Here, the closest-point approach will switch abruptly from one position to another if the player moves just a tiny bit in one direction or the other.

Two points in a non-convex sound source may be equally close to the listener while being located in quite different directions.

While the volume will be the same (since the two points are equally far away), the direction will change, which can be very noticeable with any directional sound technology, from stereo sound to surround sound to HRTF sound.

Another approach is to just place a lot of audio sources inside the volume of (or on the surface of) the sound emitting shape. This does not have the direction problem of the closest-point approach, but it can require a lot of processing to have a ton of audio sources active at the same time.

I’ve come up with a different approach I call the Point Cloud Sound technique, and since it’s turned out to be highly useful and effective for me for multiple use cases, I thought I’d describe here how it works.

You can see a demonstration of the point cloud sound technique being used for water in this video, at the 4:02 mark (running until 4:48). I recommend using headphones:

This article does not cover every implementation detail. The code snippets cover central aspects of the technique, but are incomplete and require additional implementation to compile and function. My own implementation is tailored to my game and depends on third-party libraries (including a paid one) for various non-central functionality. Since I didn’t want to implement an entire second working implementation, I’ll leave this as an exercise for the reader.

Applicable use cases

Here’s the use cases I’m using it for so far:

The sound of running water in water streams, at multiple intensities.

The sound of rustling leaves from thousands of trees and bushes.

The sound of the player "colliding with" (moving through) the foliage of said trees and bushes.

(Foliage collision sounds work a bit differently from the others, and is something I’ll cover at the end of the post. You can see a short video demonstration of it in my Mastodon post here.)

In all these cases, I don’t really need multiple sounds playing independently.

For example, for rustling leaves I can use a single looping rustling leaves sound no matter if there’s one or thirty trees within hearing range, as long as it feels like it’s coming from the right position(s) in space.

For the water, I need different sounds for different intensities, but again, not merely for different positions in space.

The point cloud sound technique takes heavily advantage of this, using as little as one audio source shared for up to many thousands of points in space. This means the technique is applicable to use cases where there are no individually distinguishable instances, but rather just a general sound of the whole.

Calculating volume manually

With the point cloud sound technique we’ll be defining a set of point samples in 3D space that we’ll be using roughly as if they were individual audio sources.

struct SoundPointSample {<br>public Vector3 point;

List samples;

public void AddSoundPointSample(Vector3 point) {<br>SoundPointSample sample = new() {<br>point = point<br>};<br>samples.Add(sample);

But instead of making individual audio source objects for the engine to handle, we calculate a combined volume, direction, and spread each frame, and set those properties on a single audio source object.

Of those properties, volume is the most straightforward, although we need to clear up some things first. I don’t know if some better terms exist, but here I’ll use the term source volume to refer to the inherent volume of some sound source, independent of a listener, and the term attenuated volume to refer to how loudly it’s heard by the listener, taking distance attenuation into account.

Attenuated sound volume, as understood in audio engine term, attenuates according to the inverse distance 1/d. There is...

sound point audio volume cloud from

Related Articles