Water & Transparency Support
intermediate conceptsWater & Transparency Support
Out of the box, Shiny SSR sees only the opaque scene. Transparent surfaces (water, glass, sprites, foliage decals) skip URP's depth and DepthNormals passes, so SSR has no data for them and ignores them entirely. Since 32.3, the Shiny SSR Renderer Feature exposes two opt-in toggles that let SSR ray-march against transparents and read smooth normals from them, plus a ShinyTansparentSupport component for per-renderer control.
This page walks through:
- The Render Feature toggles dedicated to transparent objects.
- The Volume parameter that controls reflection sharpness on transparent pixels.
- The optional
ShinyTansparentSupportcomponent for per-object control. - How to integrate with custom water shaders, with a dedicated section for Crest.
Render Feature Options
Open the Universal Renderer asset, find the Shiny SSR renderer feature, and look at the inspector. The transparency-related fields are in two groups.
Depth Prepass
| Enable Depth Prepass | Master toggle. Renders the depth of selected transparent objects so SSR rays can hit them during ray-marching. Disabled by default. Works the same in forward and deferred. |
| Layer Mask | Which layers to include in the prepass. Pick the layer your transparent objects live on (typically Water or a dedicated Transparent layer). |
Enable Depth Prepass when reflective surfaces need to reflect other transparents (e.g. a puddle reflecting a glass window, calm water reflecting a waterfall in front of it). Skip it when reflective surfaces only reflect opaque scenery (sky, terrain, buildings) - it saves an extra renderer pass.
Screen Space Normals
| Enable Screen Space Normals | Master toggle. When OFF, the sub-options below are disabled. |
| Opaques | Forward only. Requests URP to generate the _CameraNormalsTexture from opaque geometry so SSR uses smooth opaque normals. In deferred, opaque normals come from the GBuffer for free, so this row is greyed out. |
| Transparents | Renders selected transparent objects using their DepthNormals pass into a custom side buffer so SSR reads smooth normals at transparent pixels. Required for water/glass shaders that need bent reflections (Crest, KWS, Stylized Water). Works in forward and deferred (replaces the previous deferred-only Normal Prepass). |
| Layer Mask | Which layers to include in the transparent normals buffer. Independent from the Depth Prepass layer mask: you can include water in normals but not in depth, or vice versa. |
The transparent material must declare a DepthNormals (or DepthNormalsOnly) pass for the Transparents toggle to produce results. Most modern URP water/glass shaders ship with this pass; if you wrote a custom shader, add the pass and remember to compute and output the world-space normal.
Volume Options
The Volume override carries one transparency-related parameter:
| Transparent Smoothness | Smoothness applied to reflections at transparent pixels driven by the Render Feature's Screen Space Normals -> Transparents toggle. 1.0 = mirror, lower values give blurrier reflections. Use this to fine-tune the look without recompiling materials. |
Per-Renderer Control: ShinyTansparentSupport
When you only need transparency support on a few specific renderers (a single ocean tile, a hero glass mesh) and want to skip the layer-mask approach, attach a ShinyTansparentSupport component to the GameObject. The component registers the renderer with Shiny and is included in the Render Feature's depth prepass alongside any layer-mask matches.
| Include Children | Walks GetComponentsInChildren<Renderer>. Useful for prefabs that bundle several meshes (e.g. a water tile with a foam strip child renderer). |
| Use Own Depth Pass | Required for shaders with vertex displacement (waves, animated water). Draws depth using the renderer's own shader pass instead of Shiny's default depth-only material, so the displaced vertices appear at the right place. |
| Depth Pass Name | Name of the shader pass used when Use Own Depth Pass is on. Defaults to DepthOnly; change it if your shader uses a different pass name. |
The component does not replace the Render Feature toggles - you still need Depth Prepass enabled on the feature for the registered renderers to be included.
Integrating with Water Shaders
The exact toggles you need depend on what the water shader writes to URP's render targets.
| Water shader behaviour | What to enable |
|---|---|
Writes to camera depth + has a DepthNormals pass | Screen Space Normals -> Transparents only. The shader already contributes depth, so Depth Prepass is redundant. |
Does not write depth, no DepthNormals pass | Depth Prepass. Without it, SSR rays pass through the water as if it were not there. Add a DepthNormals pass to the shader if you also want smooth normals. |
| Vertex-displaced waves (custom or stylised) | Depth Prepass with the layer mask AND a ShinyTansparentSupport component on the renderer with Use Own Depth Pass enabled. Shiny's default override would draw the un-displaced silhouette and reflections would float above the waves. |
| Distorted refractions / grab pass | Depth Prepass only. SSR cannot see what is behind a grab-pass distortion - reflections happen at the water surface, refraction underneath is the shader's job. |
Crest Water Integration
Shiny SSR 2 includes built-in support for the Crest ocean renderer. Crest does not write smoothness or normals to the URP g-buffer, so SSR needs the Screen Space Normals -> Transparents toggle on the Render Feature to read smooth water normals from a side buffer. Works in both forward and deferred since 32.3.
Setup
- Place the Crest ocean tiles on the Water layer (or any layer dedicated to water).
- On the Shiny SSR Renderer Feature:
- Enable Screen Space Normals (master toggle).
- Inside, enable the Transparents sub-option and set its Layer Mask to the Water layer.
- Crest writes to the camera depth texture automatically so Depth Prepass can stay off; enable it only if you also need depth from other transparent objects (glass, particles, custom water) that do not write to depth.
- On the Volume with the Shiny SSR override, adjust Transparent Smoothness to taste (1.0 = mirror, lower values give blurrier reflections).
Notes
- The Crest material must include a
DepthNormals(orDepthNormalsOnly) pass. Recent Crest URP versions ship with this pass. - If the water surface still receives reflections from the underlying geometry (sea floor) instead of the sky, check that the Water layer is included in the Transparents Layer Mask and that the Volume override is being applied to the active camera.
- Projects upgrading from 32.2 or earlier: the previous Volume-side Transparency Support toggles are deprecated. Reconfigure transparency from the Render Feature inspector.
Debugging
The Volume override exposes a Show mode for inspecting intermediate buffers. Set it to Transparent Normals to visualise the contents of the transparent normals buffer - black means "no transparent renderer reached this pixel", coloured normals mean the buffer is populated. Use Depth to verify the depth prepass output, and Deferred Normals in deferred mode to compare with the GBuffer.
Suggest an improvement
Help us improve this documentation page.