Water RND #1


Water surfaces are an essential part of game projects. The approaches to implementing them are constantly evolving, where visual quality and performance are still in conflict. I’d like to share a bit about my experiments and thoughts on this topic.

Trochoidal wave

The shape of a trochoid is the key to understanding the mechanics of a water surface.


A trochoidal wave is a model of a surface water wave where the water particles move in nearly circular or elliptical paths, creating waves that have rounded troughs and sharper crests. It’s a more realistic representation of ocean waves compared to a simple sine wave.
In simple terms: The wave shape is smoother and more natural-looking, with sharper peaks and flatter bottoms. Water particles don’t travel far; instead, they move in looping paths — mostly in place. This kind of wave better represents how waves behave on the ocean surface under light to moderate wind conditions.

Prebaked spectral waves 

My prebaked solution uses spectral waves baked into an 8-bit per channel 2K texture. I implemented a customizable setup where I can bake events and layer them in real time. I can also blend procedural simulation from an RVT or a compute shader:


The main advantage of this solution is its high performance. It can run on both mobile and VR.
This is what the LOD setup looks like for a Hierarchical Instanced Static Mesh — there are no mismatched vertices at the edges!


This geometry with LODs is suitable for both baked water and procedurally simulated water. It provides reliable resource savings without compromising quality.

FFT Ocean (Real-Time)


Of course, a real-time spectral ocean looks cool and large-scale. But it naturally requires additional resources to compute everything needed. These costs will increase as more features are added, such as buoyancy and waterline post-process effects.

Below, I’ve compiled a list of technologies that can be used in one way or another to solve water-related tasks:

NAME

TYPE

DESCRIPTION

USE IN GAMES

Gerstner Waves

Analytical model

Uses sine-based equations to simulate realistic wave motion with directional control. Supports multiple octaves for complex surfaces.

Very efficient for real-time rendering. Common in stylized or moderately realistic water.

Trochoidal Wave

Analytical model

Describes realistic particle paths (trochoids). Basis for Gerstner waves.

Theoretical basis for Gerstner; not used directly but informs accurate motion in simulations.

Stokes Waves

Analytical model

Nonlinear model with asymmetric crests and troughs. More realistic than sine.

Rare in games directly; can enhance realism in stylized or cinematic water.

Tessendorf Waves

Spectral / FFT-based

Uses inverse FFT to generate an ocean surface based on a frequency spectrum (e.g., Phillips or JONSWAP). Produces detailed, realistic ocean surfaces.

Used in AAA titles for large-scale oceans. Requires more GPU power but still feasible in real-time.

JONSWAP Spectrum

Oceanographic spectrum

Describes the energy distribution in sea states, particularly in fetch-limited conditions. Enhances the realism of wave peaks over time.

Feeds into spectral models like Tessendorf to simulate stormy seas more accurately.

Phillips Spectrum

Physical spectrum model

Based on wind direction and strength, defines wave energy per frequency and direction. Prone to instability near zero-frequency waves.

Base input for realistic wave generation in Tessendorf-style simulations.

Directional Spectrum

Spectral Input

2D spectrum with energy per direction. For realistic ocean behavior.

Enables more control in FFT-based oceans. Useful for tuning wind/wave direction in games.

Boussinesq Waves

Simulation

Shallow water model with dispersion. Better near coastlines.

More accurate than SWE near shores. Great for realistic coastlines or flooding effects.

Solitary Waves (Solitons)

Simulation

Stable, isolated wave pulses. Used for tsunamis or stylized FX.

Used in tsunami or special effects. Visually striking and stable shape.

SPH (Smoothed Particle Hydrodynamics)

Particle-based simulation

Simulates water as particles that interact physically. Realistic but expensive.

Typically used in localized effects — splashes, fountains, or destruction moments.

Shallow Water Equations (SWE)

Fluid simulation

Numerically solves equations for water behavior in shallow areas. Includes wave reflection, refraction, and interference.

Great for shores, rivers, and gameplay-driven wave interaction (boats, characters).

Choppy Waves

Post-Processing Modifier

Adds crest sharpness to smooth FFT waves. Fake detail.

Adds visual detail to ocean waves. Often used as a modifier in FFT systems.

Encino Waves

Proprietary hybrid

Likely a hybrid method (spectral + simulation) developed by Weta/Encino for cinematic water.

Rarely used directly, but techniques can inspire high-fidelity offline-to-real-time baking workflows.

Capillary Waves

Surface tension waves

Tiny ripples caused by surface tension, not wind. Physically small, high-frequency waves.

Often faked or blended with normal maps to enhance detail close to the camera.

FFT Ocean (Real-Time)

GPU-optimized spectral model

Real-time adaptation of Tessendorf using GPU shaders and compute buffers.

High-end games (e.g., Sea of Thieves) for dynamic oceans with performance in mind.

Hybrid Models (e.g., Gerstner + Flow Maps)

Mixed techniques

Combines simple waveforms (Gerstner) with flow maps, deformation textures, or simulation data.

Balances performance and realism. Useful for game worlds with mixed water types (rivers, lakes, oceans).

Wave Particles / Ripple Sim

Procedural Simulation

Ripples and interactions via spreading wave particles.

Used for localized ripple effects (footsteps, objects in water). Lightweight simulation.

Capillary Waves

Detail Layer

Tiny surface-tension waves. Adds fine detail in normal maps.

Not simulated in real-time, but adds realism via detail textures or normals.

Wave Particles / Ripple Sim

Procedural Simulation

Ripples and interactions via spreading wave particles.

Used for localized ripple effects (footsteps, objects in water). Lightweight simulation.

Vertex Animation Textures (VAT)

Baked Animation

Pre-baked wave motion played via texture. Very efficient.

Used in mobile/VR or stylized games where real simulation is too heavy.


It’s preferable to bake all waves so that the textures they are baked into can be streamed, specifically in a standard 2K format with a typical 8-bit depth. Experience has shown that 8-bit depth is quite sufficient for fairly large waves. Real-time calculations should only be left for the editor or for instances where they are truly necessary, where a high level of visual fidelity is required and the absence of a cycle.