A wind-driven ocean synthesised from up to 128 Gerstner components, steered by a single Beaufort dial, with Jacobian foam and a matching CPU evaluator for physics.
Spectral Gerstner is the wave source you pick when you want an ocean that answers to weather instead of to a list of hand-typed waves. It sits on the water actor as one of three selectable Water Waves Sources, alongside classic Gerstner and FFT, and synthesises a whole sea state from a wind vector and a Beaufort number. The same synthesis runs three times over: in the material for every water body, in a compute shader when you bake it to a flipbook, and in C++ for buoyancy and water queries. All three share one set of constants, so what floats matches what you see.
Beaufort is normalised to a 0 to 1 value and drives two factors: a height factor of 1.85b plus 0.15 that scales the whole amplitude range, and a length factor of 1.10b plus 0.40 that scales the whole wavelength range. The same value widens the small-wave cutoff and fades out the low-wind detail boost. Dragging Beaufort from 0 to 12 is therefore a full weather sweep rather than one isolated slider. A Blueprint helper interpolates every field of the settings struct between two configurations, and the effective settings are a push-model replicated property that only the authority can set, so a server-driven storm arrives at clients intact.
Normals are the cross product of the tangent and binormal built from the derivatives of the full displacement field, not from height alone, so horizontal chop shows up in the shading. Foam comes from the Jacobian determinant of the horizontal displacement: where the determinant goes negative the surface is folding, and foam is the negated determinant plus Foam Bias, scaled by Foam Gain. This is the same formula the FFT path uses, which is why foam reads consistently if you swap wave sources on an existing water body.
Wave Mode on the water actor selects None, Runtime or Baked. Runtime evaluates the loop in the material every frame. Baked replaces it with a flipbook atlas pair, displacement plus gradient and folding, produced by a GPU baker that also rounds temporal and spatial frequencies to whole cycles so the loop is seamless. The bake computes normals by finite difference, five evaluations per texel, and adds temporal foam decay that the runtime path does not have. On the CPU, the same synthesis backs wave height queries and the physics snapshot, and can apply the same bake quantisation so physics tracks the baked surface exactly. Maximum wave height is estimated analytically as four times the standard deviation of the spectrum.
| Before | Oceanology Pro | |
|---|---|---|
| Wave count | A base offset plus four optional wave sets, each expanded into four sub-waves: twenty components at most | Up to 128 components, count set by one slider |
| Sea-state authoring | Amplitude, steepness, speed, wavelength and direction typed per wave set | One Beaufort dial rescales every component's amplitude and wavelength range |
| Directional spread | A direction scalar per wave set plus shared direction offsets | Random spread around a wind vector, width set by Directional Variance |
| Spectrum shape | Implicit in whatever numbers were typed | Energy Distribution and Small Wave Threshold reshape falloff across the whole set |
| High-frequency detail | Only what the four wave sets carry | A second band per component at five times frequency, boosted in calm air |
| Wave Component Count | 4 to 128, default 128 |
| Beaufort Scale | up to 12, default 5 |
| Directional Variance | 3 to 90, default 30 |
| Wave Energy Distribution | up to 10, default 1 |
| Wave Spectrum Resolution | 0.5 to 1.0, default 1.0 |
| Wavelength range | Min 128 cm, Max 13312 cm by default, both scaled by Beaufort |
| Amplitude range | Min 0.25, Max 13.7 by default, doubled and scaled by Beaufort |
| Foam Bias / Foam Gain | default 0.3 and 1.0; ranges -1 to 2 and 0 to 5 |
| Detail band | 5x frequency, 0.1x amplitude, boost 1.6 at calm falling to 1.0 at force 12 |
| Bake atlas | 16 to 256 frames, 256 to 2048 per frame, 4 to 60 second loop, patch 1024 to 131072 cm |
This is one entry on the Galidar roadmap. For what already shipped in each release, see the Changelog.