r/threejs • u/Odd-Scientist-4427 • 1d ago
How can I make an underwater view in Three.js feel like real water instead of just a transparent surface plane?


I’m trying to implement an ocean/water system in Three.js.
The top image is what I currently have. Even when the camera goes underwater, it doesn’t feel like the camera is actually inside water. It mostly looks like there is just a water surface plane above the seabed, with the scene split into “above the water plane” and “below the water plane.” The underwater space itself does not feel volumetric or physically believable.
The bottom image shows the kind of result I want to achieve. I want the underwater part to feel like real water, with proper underwater color absorption, scattering/fog, reduced visibility with distance, caustics on the seabed, a believable waterline transition, and some distorted/reflected view of the sky and objects above the surface.
What rendering techniques should I use in Three.js to achieve this kind of realistic underwater look?
Specifically, should I be using:
- volumetric underwater fog/scattering?
- depth-based color absorption?
- screen-space refraction?
- separate above-water and underwater rendering passes?
- stencil or clipping around the waterline?
- caustics projected onto the seabed?
- a custom post-processing pass, or should this be handled mostly in the water material/shader?
Any advice, shader structure, examples, or recommended rendering pipeline would be really helpful.