Optically Realistic Water
A Unity port of Martins Upitis' fantastic ocean water shader, which was originally coded in GLSL for Blender.
Contents
The shader actually consists of two parts:
- WaterSurface.shader
- WaterUnder.shader
WaterSurface.shader is intended to be used with the water plane and renders reflections, subsurface scattering, etc.
WaterUnder.shader must be applied to any renderers which could potentially be submerged in the water (such as the terrain, etc.).
Water.cs should be attached to the water plane and handles planar reflections and all shader parameters. It is mostly self-explanatory if you are at all familiar with Unity's existing water shader.
Just like in Martins' project, you can click and drag the sun into any position you like.
Features
- Reflection with accurate fresnel reflectance model
- Refraction with chromatic aberration
- Projected caustics on geometry from the water surface based on normals
- Seamless transition to underwater (no post effects used)
- Accurate water volume with light scattering
- View and light ray color extinction based on water color and sunlight
Additional features/changes
- Refraction is masked based on depth to prevent foreground distortion artefacts
- Normal map intensity fades out with distance to prevent excessive distortion artefacts
- Clip plane offset depends on camera distance from water plane, which reduces artefacts when close to surface
- Some shader calculations moved into scripts (sun colour, for example)
- Some optimisations (much more could be done here)
Removed/unported features
- Simple coastline detection (I didn't want this shader to rely on baked shoreline maps)
- "Caustic fringe" effect
- Above/below water transition droplet post effect
- Underwater distortion (it's not a real physical phenomenon so I chose to remove it)
- "Glitter" post effect
Limitations
Due to the required underwater shader, you may find it very difficult to adapt this to an existing project and thus it should be considered more of a prototype or proof of concept. This is also a limitation of Martins' original shader.
The shader uses forward rendering and has not been tested in deferred.