Acoustics: water -- room rays ignore it, no air/water boundary loss, no underwater listener model #953

Closed
opened 2026-10-23 02:27:01 +00:00 by sky_line · 1 comment
Owner

Current state

  • Bounce pass (reverb energy): correct. Water is in the hit mask and has its own class (ACC_WATER, absorption 0.01 / 0.01 / 0.02), so multi-bounce reverb over water is right.
  • Underwater camera: only a global rolloff factor (llvieweraudio.cpp) and the weather-audio muffle (slweatheraudio.cpp).

Problems

  1. Room rays skip water. The room mask (clean_audio_rt.comp, header comment) leaves water out, so room rays pass the surface and hit the lake / sea bed, scored as terrain (0.25 / 0.40). The room model (decay, wet, early reflections) makes a listener over a lake, pool or harbour sound deader than it should, contradicting the bounce pass.
  2. No air/water boundary loss. Occlusion rays also skip water. Physically the air/water interface transmits ~0.1 % of the energy (about -30 dB, stronger at high frequencies). A source under the surface heard from above, or the reverse, currently plays unattenuated.
  3. No underwater listener model. llcleanacoustics.cpp has no underwater state: underwater listening gets the same air-room reverb and filtering. Expected: strong high-frequency loss for sources in air, a distinct underwater reverb / filter profile, and a different propagation model (speed of sound ~1480 m/s).

Wanted

  • Room rays count water as a hit surface with the water class (reflect, never block).
  • A per-source medium check (listener and source above / below the region water height, or the water surfaces in the TLAS): crossing the boundary applies a band-dependent transmission loss through the existing occlusion / filter path. No loss while both are on the same side.
  • An underwater listener profile in the acoustics model (reverb + EQ), switched cleanly on the camera crossing the surface, without clicks.
  • Live setting(s) for the boundary loss and underwater profile, with sensible defaults; GPU / CPU cost reported in the acoustics timers.

Test

  • Stand over open water vs. over grass at the same spot height: wet / decay should be higher over water.
  • Sound source under the surface, listener above (and the reverse): heavily muffled; both on the same side: unchanged.
  • Dive the camera under and back: underwater profile engages / disengages smoothly.
## Current state - **Bounce pass (reverb energy):** correct. Water is in the hit mask and has its own class (`ACC_WATER`, absorption 0.01 / 0.01 / 0.02), so multi-bounce reverb over water is right. - **Underwater camera:** only a global rolloff factor (`llvieweraudio.cpp`) and the weather-audio muffle (`slweatheraudio.cpp`). ## Problems 1. **Room rays skip water.** The room mask (`clean_audio_rt.comp`, header comment) leaves water out, so room rays pass the surface and hit the lake / sea bed, scored as terrain (0.25 / 0.40). The room model (decay, wet, early reflections) makes a listener over a lake, pool or harbour sound deader than it should, contradicting the bounce pass. 2. **No air/water boundary loss.** Occlusion rays also skip water. Physically the air/water interface transmits ~0.1 % of the energy (about -30 dB, stronger at high frequencies). A source under the surface heard from above, or the reverse, currently plays unattenuated. 3. **No underwater listener model.** `llcleanacoustics.cpp` has no underwater state: underwater listening gets the same air-room reverb and filtering. Expected: strong high-frequency loss for sources in air, a distinct underwater reverb / filter profile, and a different propagation model (speed of sound ~1480 m/s). ## Wanted - Room rays count water as a hit surface with the water class (reflect, never block). - A per-source medium check (listener and source above / below the region water height, or the water surfaces in the TLAS): crossing the boundary applies a band-dependent transmission loss through the existing occlusion / filter path. No loss while both are on the same side. - An underwater listener profile in the acoustics model (reverb + EQ), switched cleanly on the camera crossing the surface, without clicks. - Live setting(s) for the boundary loss and underwater profile, with sensible defaults; GPU / CPU cost reported in the acoustics timers. ## Test - Stand over open water vs. over grass at the same spot height: wet / decay should be higher over water. - Sound source under the surface, listener above (and the reverse): heavily muffled; both on the same side: unchanged. - Dive the camera under and back: underwater profile engages / disengages smoothly.
sky_line added this to the Slipstream project 2026-10-23 02:27:01 +00:00
Author
Owner

Fixed in 1.5.0 Beta 1 (360e6beb36). Reopen if you still see it.

Fixed in 1.5.0 Beta 1 (360e6beb36). Reopen if you still see it.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
sky_line/Slipstream#953
No description provided.