Water waves and materials
This chapter covers wave assets, interactive ripples, surface materials, and how Quality Tier gates GPU features.
.waterwaves assets
Wave spectra live in Gems/Water/Assets/Waves/ (extension .waterwaves). Assign via the body’s Waves field. Empty = still water (detail normals / flow only).
| Preset | Mode | Typical use |
|---|---|---|
Waves_CalmLake | Gerstner | Lakes |
Waves_RiverRipple | Gerstner | Rivers |
Waves_OceanModerate / OceanStorm | Gerstner | Open sea |
Waves_OceanSpectrumModerate | Spectrum (JONSWAP ?FFT) | High-quality ocean |
Waves_GoldenCapture | Gerstner | Screenshot / CI phase pin |
Gerstner mode
Up to 16 components (Registry MaxGerstnerComponents can only lower the cap):
| Field | Meaning |
|---|---|
| Wavelength | Meters |
| Amplitude | Meters |
| Direction | Degrees relative to asset wind direction |
| Steepness | Horizontal sharpening q in [0, 1] |
| Phase Offset | Radians |
Asset load validates steepness sum and quantizes angular frequencies so waterTime can wrap every 3600 s without phase pops.
Spectrum mode (FFT)
Analytic Phillips / JONSWAP parameters drive a GPU IFFT cascade (default sizes 512 / 64 / 8 m). Inspector fields:
| Field | Meaning |
|---|---|
| Spectrum Type | Phillips or JONSWAP |
| Wind Speed | U10, m/s |
| Fetch | JONSWAP fetch length, km |
| Directional Spread | cos^N exponent |
| Amplitude Scale / Choppiness | Global amplitude; horizontal FFT displacement |
| Min / Max Wavelength | Band limits, m |
| Seed | Deterministic realization seed |
Buoyancy and CPU queries use a ?6-component Gerstner approximation sampled at load time (same WaveEvaluator API). Only one Spectrum ocean drives the FFT chain; additional Spectrum oceans fall back to the CPU approx for rendering displacement.
Registry (/O3DE/Gems/Water/Fft/):
| Key | Default |
|---|---|
Enabled | true |
Resolution | 256 (tier may lower) |
CascadeSizes | [512, 64, 8] |
Interactive ripples
When ripples and FFT are enabled, body-enter events inject particles into the finest FFT cascade slice. Registry /O3DE/Gems/Water/Ripples/:
| Key | Default | Purpose |
|---|---|---|
Enabled | true | Master gate |
MaxParticles | 16 | Pool size |
SpawnMinSpeed | 2.0 | Min enter speed, m/s |
LifetimeSeconds | 3.0 | Particle lifetime |
AmplitudeScale | 0.02 | Injection amplitude |
Low tier / Gerstner-only paths disable ripple injection with the FFT chain.
Materials
Material type: Gems/Water/Assets/Materials/Types/WaterSurface.materialtype.
| Preset | Look |
|---|---|
WaterSurface_StreamClear | High transparency, shallow tint |
WaterSurface_LakeGreen | Green absorption, deep cyan |
WaterSurface_OceanDeep | Deep blue absorption, foam-ready |
Assign via the body’s material path (empty ?type default). User-facing groups include:
| Group | Examples |
|---|---|
| Shading | Shallow / Deep Color, Absorption, Roughness, detail normals |
| Reflection | Mode (Planar / SSR / IBL), SSR distance / thickness / edge fade |
| Refraction | Strength, depth fade |
| Foam | Texture, shore foam depth, crest Jacobian threshold |
| Flow | Flow map bind, U scale, max speed |
| Underwater | Fog color / density, waterline width / refraction, DoF focus |
| Caustics | Intensity / scale (also gated by Registry + tier) |
Reflection preference: planar (High tier) > SSR > IBL. Scene-color refraction uses a half-resolution copy by default (SceneColorCopyFullRes can force full res).
Quality tiers
/O3DE/Gems/Water/QualityTier: High / Medium / Low.
| Tier | Gerstner GPU | Ocean LOD | FFT | Caustics | Planar reflection |
|---|---|---|---|---|---|
| High | 16 | 6 | 256² | on | on |
| Medium | 8 | 5 | 128² | on | off |
| Low | 4 | 4 | off | off | off |
CPU buoyancy always samples the full validated wave table; the tier only trims GPU upload. Related Registry gates: CausticsEnabled, PlanarReflectionEnabled, UnderwaterDoF/Enabled.
Rendering features (user view)
TransparentPass
└── WaterParent
├── SceneColorCopy (refraction source)
├── WaterSurface (+ optional FFT / InfoMap / ripples)
├── PlanarReflection (High)
└── Caustics (fullscreen additive)
- WaterInfoMap: top-down still-water height / depth / flow for shore foam and underwater split fog.
- Motion vectors: Gerstner prev-time displacement for TAA (DrawList
motion). - Underwater: camera hysteresis (~0.05 m) + DeferredFog parameter override; half-immersed cameras can split fog per pixel when InfoMap is available.
Next steps
- Buoyancy and gameplay ?how floaters sample the same waves.
- Authoring ?bake flow maps that materials consume.
- Debugging ?tier readout on the diagnostics overlay.