Underwater Rendering
Reworked fog ownership, meniscus, god rays, volumetric lights, and submergence.
The underwater post effect now owns all underwater fog. The from-below surface renders raw into a dedicated buffer and is fogged consistently with the scene - no more double-fog or flicker between the surface and the fog volume. Underwater SSS, absorption, and fog density are tuned by the same material the surface uses, so one material drives both sides of the water.
The underwater stack
- Fog ownership - the post effect fogs the from-below surface and the scene together, in one place.
- Meniscus water-line pass - the thin film band where the camera crosses the surface, with color, thickness, and strength controls. Drawn last so it sits on top of the fog.
- Analytic near-plane submergence - partial submergence (camera half in the water) renders correctly.
- Volumetric god rays - sun shafts underwater with strength / phase / focus / length controls.
- Volumetric point/spot scatter - underwater light cones from additional lights. Both marches are shadow-aware (geometry between a light and the water blocks its shafts).
- Half-res, noise-free volumetrics - point/spot scatter is computed at half resolution with a smoothing blur and deterministic equi-angular sampling: smooth cones and god rays with no dither grain or temporal noise, at roughly a quarter of the full-resolution march cost.
Per-body Underwater settings
These fields live on each TidalBody's Underwater foldout. Every quality setting can follow the Render Feature default or be overridden per body, so quality tiers can live on the renderer assets and switch automatically.
| Field | Type · Default | Description |
|---|---|---|
| Has Underwater | bool · on | Master toggle for the entire submerged stack (from-below surface, fog, meniscus, volumetrics, cross-sections). Off = zero underwater cost, including the from-below geometry passes. |
| Volume Masks | enum · Use Render Feature | The cross-section mask pass. Use Render Feature Setting / On / Off. Warnings appear on the body and the volume when a volume requests a mask this setting disables. |
| God Rays | enum · Use Render Feature | Sun shafts underwater. Use Render Feature Setting / On / Off. The material's God Ray Strength still shapes the look (strength 0 = off regardless). |
| Volumetric Lights | enum · Use Render Feature | Point/spot light scatter underwater. Use Render Feature Setting / On / Off. |
| Volumetrics Resolution | enum · Use Render Feature | Resolution budget of the volumetric light buffer (longest side): Use Render Feature Setting / Half Screen / Fixed 1440 / 960 / 720 / 480. Fixed budgets cost the same at any display resolution; the buffer never exceeds half-screen. |
- Underwater SSS, absorption, and fog density are tuned by the same material the surface uses - one material drives above and below the water.
Dry cavities & water cross-sections
Volumes can carve the water into dry interiors or contain it in tanks, and cut faces below the waterline can render the real underwater fog - the foundation for submarine interiors, moon pools, and aquariums.
- Dry cavities - a camera inside an EXCLUDE volume's carved void below the waterline stays dry (no underwater-fog pop), while surrounding water shows through the cavity's cut faces.
- Water cross-sections - a volume's below-water cut faces render the real underwater fog/scatter, looking straight into the water volume. Since v2.0 the mask is pixel-exact: analytic volumes are resolved by a closed-form fullscreen ray-intersection, matching the surface clip at any LOD, scale, feather, or while moving (up to 8 analytic mask volumes on screen).
- Works for both volume modes: Exclude (submarines, moon pools) and Include (tanks, aquariums, with the fog capped at the volume's ceiling where it sits below the waterline).
See Tidal Volumes for setting up EXCLUDE/INCLUDE volumes and the Underwater Mask clip visual.
Underwater particles
Every TidalBody carries an TidalUnderwaterParticlesSubSystem (its own inspector foldout):
ambient suspended "marine snow" motes plus rising, wobbling bubbles
around the viewer camera while submerged. Fully procedural (no texture or prefab assets) with
deterministic positions. Every particle is culled at the water surface via one camera-anchored CPU
height query per frame - bubbles pop as they reach it and nothing floats above the waves.
| Field | Type · Default | Description |
|---|---|---|
| Enable Particles | bool · on | Master toggle. Off skips the subsystem entirely. |
| Radius | 2-40 · 12 | Half-size of the particle box around the camera. |
| Mote Count | 0-2000 · 500 | Number of suspended marine-snow motes. |
| Mote Color | Color | Mote tint; alpha controls visibility. |
| Mote Size | m · 0.015-0.05 | Per-mote world size range. |
| Mote Drift | 0-1 m · 0 | Drift amplitude of the motes. |
| Bubble Count | 0-500 · 90 | Number of rising bubbles. |
| Bubble Color | Color | Bubble tint. |
| Bubble Size | m · 0.008-0.03 | Per-bubble world size range. |
| Bubble Rise Speed | m/s · 0.25-0.6 | How fast bubbles rise toward the surface, where they pop. |
Particles dim with the sun (via Darkens With Sun on the material) except where point/spot lights reach.
- The underwater stack skips itself entirely when the camera is safely above water with no cut-away in view; the from-below surface passes skip with it.
- Planar reflections pause while the camera is submerged (nothing samples them there).
- Bodies with Has Underwater off never pay any from-below cost.
Underwater rendering is installed by TidalRenderFeature. The old
UnderwaterEffectFeature was removed - see the
upgrade guide. Caustics are visible underwater as a post effect;
see Shading & Caustics.