Custom Water & Liquid Shaders for Games
Water in games often looks like jelly — too smooth, without foam or realistic waves. A standard shader with parallax mapping doesn't provide the needed depth. We develop water and liquid shaders where each parameter is tuned for the target platform: from mobile to PC and consoles. Realistic water requires synchronizing multiple systems: a surface shader with Fresnel, normal map animation, foam mask, vertex displacement for waves, and a properly configured underwater effect. Each part affects performance, and balancing quality with frame budget is the core engineering challenge. Our experience: 30+ projects with water effects; we guarantee stable FPS on target devices. Investment in a custom shader pays off through optimization and unique visual identity. Get a consultation from an engineer with 7 years of experience — contact us.
Shader Parameters Affecting Performance
Key factors: number of draw calls (batching), texture resolution (normal maps, foam), use of Opaque Texture for refraction, and number of wave components in vertex displacement. For mobile platforms, the critical limits are: two scrolling normal maps (256×256, ASTC 6x6), Fresnel using NDotL approximation, foam via Depth Texture (no Opaque Texture), and one Sine wave — such a shader runs in 0.3ms on Galaxy A53.
Creating a Custom Water Shader for URP
- Choose the graph type: For mobile — Unlit with fake lighting via normal map, saving vertex shader invocations. For PC/console — Lit with PBR parameters.
- Scrolling normal maps: Two texture samples with different UV tiling and scroll directions (Time + UV offset). Use Overlay or Blend Normal to combine. Different scroll speeds eliminate pattern repetition after about 5 seconds.
- Fresnel effect: Fresnel Effect node + Lerp between two water colors (deep and shallow). Exponent 2–5 for a soft transition. For URP, use NDotL via Normal and View Direction — more accurate than the built-in Fresnel.
- Depth Fade for foam: Scene Depth minus Fragment Position gives relative depth. Smoothstep generates the foam mask near the shore. Requires Opaque Texture (additional blit pass) — for mobile, an alternative is Depth Texture.
- Vertex Displacement for waves: Sine node on UV + Time with different frequencies/amplitudes for 2–3 waves. Sum with different directions — Gerstner wave approximation. Displacement 0.1–0.5 units, otherwise z-fighting with objects.
Why a Custom Shader is Better for Stylized Graphics
In HDRP as of the latest stable Unity release, there is a Water System — a ready high-quality component with tessellation, caustics, and underwater. But it is not suitable for stylized (cartoon, cel-shading) graphics: vertex-animated foam is not supported, and Shader Graph customization is limited to Water surface nodes. A custom shader in ShaderGraph gives full control — from color to wave shape.
| Parameter | URP Custom | HDRP Water System |
|---|---|---|
| Performance | 0.3–1.0 ms (mobile) | 1.5–3.0 ms (desktop) |
| Customization | Full through ShaderGraph | Limited |
| Underwater Effect | Requires Custom Renderer Feature | Built-in |
Performance Comparison
URP custom shader is up to 5 times faster than HDRP Water System on mobile devices — critical for maintaining 60fps on mid-range hardware.What's Included in Water Shader Development?
- Source shader in ShaderGraph/Amplify/HLSL with comments
- Settings for target platforms (mobile, PC, consoles)
- Documentation on parameters (Fresnel Exponent, wave speed, color palette)
- Training for your team (1-2 hours online)
- 30-day support after deployment
Case Study: Water for a Mobile Game
A mobile 3D strategy game on Unity LTS (URP Mobile). Requirement: a sea in the background, 60fps on mid-range Android. Constraint: no more than 0.5ms for the water shader. Final shader: two scrolling normal maps (256×256, ASTC), Fresnel on NDotL, foam via Depth Texture, one Sine for waves. No reflection — only cube map on Specular. Frame cost: 0.3ms on Galaxy A53. Result: stable 60fps without drops. See Unity Documentation: Optimizing Shaders for Mobile.
Timeline and Cost
| Shader Type | Timeline | Starting Price |
|---|---|---|
| Basic (mobile, URP, no displacement) | 2–4 days | $500 |
| Medium (PC/console, URP Lit, foam and Fresnel) | 4–8 days | $1,500 |
| High-quality (HDRP or custom with tessellation) | 1–2 weeks | $3,500 |
| Underwater effect + refraction | 3–5 days extra | $1,000 |
Cost is calculated individually after analyzing your scene and platform. Order a custom water shader for your game — get a consultation from an engineer with 7 years of experience in game dev.
Advanced Technical Notes
- Refraction on mobile: Use fake refraction via normal map with UV offset on the backdrop plane — no grab pass, saving 0.5ms.
- Vertex displacement: Using Gerstner waves in the vertex shader (sum of 2–3 sines) gives realistic waves without physics. For LOD objects, use a simplified single-wave version.
- Foam: Depth fade mask is one of the cheapest methods, but for strong waves add a noise texture to break up the foam.





