An ocean you can see into, sail on, and swim under.

Most Godot water is a surface: waves, a fresnel, a colour. Tidewater models the water column — how far a view ray travels through water before it hits something, and what that does to the light coming back. Turquoise shallows, a visible seabed, a shoreline that dissolves instead of cutting: all of it falls out of that one idea, and none of it is a painted gradient.

New — Firmament: a volumetric sky for Godot 4 with a day-night cycle, a weather dial, and a rig that lights your scene to match. Sold separately.

The demo above is the thing you are buying, exported to the browser. Fly with WASD, F to follow the galleon, U to dive, T to switch the depth path off and back on, S for heavy weather, [ and ] to move the sun.

EngineGodot 4.4+ — built and tested on 4.7
RenderersCompatibility, Forward+ and Mobile, from one shader
Ships toWindows, macOS, Linux, Android, iOS — and the web
NeedsNo compute shaders, no Vulkan requirement, no GDExtension, no C#
You getThe addon, the demo project, and every model and texture in it
LicenceUnlimited commercial projects, no royalty, no attribution

The demo's assets come with it, under the same licence — the galleon, the orca, a twelve-piece reef kit, the buoys and four seamless foam sheets. Enough to have something on the water on day one. They are in the fourth screenshot.


🌐  It runs where your game runs — no compute shaders

The fast way to do an ocean is a compute shader running an FFT. It looks superb, and it costs you the web, the Compatibility renderer, older GPUs and every phone that is not current. Tidewater is built the other way round: no compute, one shader, three renderers, with the differences resolved at compile time so neither branch pays for the other's code.

That is why there is a playable demo at the top of this page instead of a video. Two shading extras are renderer-specific — refraction blur wants Forward+ or Mobile, underwater light shafts want Forward+ — and everything else runs on all three.

 

💧  What the depth buffer buys — six things you see
You seeBecause
Turquoise shallows grading to deep blueRed light is absorbed about ten times faster than blue, so the hue shifts with depth on its own
Sand, reef and hulls below the waterlineThe surface composites what is actually behind it
Shorelines that dissolve instead of cuttingAt zero depth the water resolves to exactly the beach behind it — there is no seam to hide
Caustics on the seabedProjected in world space at the point the ray lands, fading out with depth
A crisp waterline on hulls, pilings and rocksContact foam measured from the depth buffer, not from a hand-placed shoreline
Detail that softens with depth, not just colourRefraction blurs per metre of water, the way scattering really behaves

 

🌊  Waves, and a coast to break on — nine features

The sea itself

  • A wave spectrum, not a sine wave. Twelve Gerstner components, each travelling at the speed its wavelength demands, fanned across 150°. The steepness budget is shared across the spectrum, so the surface cannot fold through itself at any sea state.
  • A sea state that means something. wave_height is significant wave height, the measure forecasts use; fetch is how far the wind has blown. Sea states are Resources, so they are assets you can author, swap and tween.

Where it meets the land

  • Shoaling and surf. Hand the ocean a depth map and waves grow as they feel the bottom, then break where they can no longer stand. The surf is a band at the break line, with a breaker train that wraps headlands on its own.
  • Foam that outlives the crest that made it. An optional field remembers where the sea broke, so foam is born on the compressing face of a wave, carried over the crest, and left flattening in the trough behind.

Things on it, and under it

  • Wakes that part the water. A tracked body leaves a Kelvin wake with real vertical displacement, not a foam decal.
  • Buoyancy that matches the picture. The same wave field on the CPU, and a four-probe component reading the hull's own footprint — so a long hull leans less than a short one on the same swell.
  • Underwater that is a place, not a tint. A fogged ceiling, fog that changes with it, and a screen pass that bends the frame and lays caustics over it — on every renderer, including the web.
  • A sea that follows the camera. Point follow at your camera and the surface slides under the waves to stay beneath it. Sail in one direction for an hour; the water is still there.
  • Four quality tiers, none of which change the wave geometry — so buoyancy and gameplay never depend on a graphics setting.

 

📦  The models and textures in the box — all of them yours

The demo is not a turntable and its contents are not locked to it. Everything in the scene was built for this pack and ships under the same licence, so you can put a boat on your water the day you buy it.

Galleon8,484 tris, 11 flat-colour materials, 264 kB. Origin on the waterline, so it floats where you put it
Orca105,210 tris, four materials. Swims on the wave field and cannot be flown out of the sea
Reef kit12 props — kelp, staghorn, brain, table and fan corals, barrel sponge, anemone, seagrass, three rocks — one object per prop, origins at the base
Foam sheetsFour seamless 1024² grayscale sheets. White is foam, so a photograph of the real thing drops straight in
Built in codeThe sloop, the buoys, the island and seabed, and the sky with its cloud deck — parameters rather than meshes, so they are yours to reshape

 

⚡  Thirty seconds to water — three lines of code

var ocean := TidewaterOcean.new()
ocean.spectrum = TidewaterSpectrum.moderate()
add_child(ocean)

Then ask it about the sea, anywhere, at any time — this is the same surface that is being drawn, not an approximation of it:

var y := ocean.height_at(Vector2(boat.position.x, boat.position.z))

Float something on it:

var buoyancy := TidewaterBuoyancy.new()
buoyancy.hull_size = Vector2(3.6, 12.0) # beam, length
boat.add_child(buoyancy)

Also surface_at() (height and both slopes at once), normal_at(), pinch_at() for where the sea is roughest, and is_underwater(), which tests the live surface so a passing crest counts. The clock is assignable, so networked clients can run off one authoritative time.

 

🎮  The demo is a worked example — and what is in it
  • A galleon under sail, floating on the four-probe buoyancy component and leaving a wake you can see. Her rig is trimmed to the same wind that drives the spectrum, so the sails fill on the correct side as she comes round. An anchored sloop lies nearby.
  • An orca you can pilot. Press P and WASD steers the animal instead of the camera. You can dive it and breach it.
  • A reef, a seabed and a shoreline to see through, so absorption, caustics, contact foam and the surf line all have something to act on.
  • A full daylight cycle on [ and ], sky and water together.
  • A control panel with every dial live, so you can find the sea you want before writing a line of code. H hides it.

It builds itself in code, top to bottom in one file, so the integration is something you read rather than click through. It also checks itself: the CPU and GPU wave fields are verified against each other at startup, and the addon ships headless tests of both renderer branches.

 

⚠️  What it is not, and what it costs — the edges

What it is not

  • It is not an FFT ocean. No compute shaders, by choice — that is the constraint that lets it ship to the web and to a decade-old GPU.
  • Buoyancy is a four-probe plane fit on a hull footprint, not a fluid simulation. It floats boats, buoys and crates convincingly; it will not model a capsize.
  • Shoaling and surf need a depth map of your coast. One call bakes it from any height function, but water with no bottom described to it stays open ocean.
  • The wake and foam buffers are fixed squares of world, sized by you. They do not scroll with the camera; the surface itself does.

What it costs

Transparency costs a backbuffer copy plus depth samples per water pixel — the most expensive thing here, and off at the Low tier, which still gets waves, foam, wakes and buoyancy. quad_size is the main dial, and the ocean warns when the mesh is too coarse for the sea state you asked for.

 

📥  What you download, and the licence — two zips

Two downloads

tidewater-godot-ocean.zipThe whole project — addon, demo, models, documentation. Open it in Godot and press play
tidewater-addon.zipaddons/tidewater/ alone, for dropping into a project you already have

Install is a folder copy and a tick box. Every public class is prefixed Tidewater, so nothing collides with what you already have.

The licence

Use it in an unlimited number of projects, commercial or personal, and sell them: no revenue cap, no royalty, no attribution required. Modify anything, ship it on any platform, web included. The licence covers the project rather than the seat.

The one thing you can't do is resell Tidewater itself — as an addon, a plugin, a shader pack or a code sample. Ship it in your game; don't ship it as your product. Full terms in LICENSE.txt, in plain language, the same licence every pack from this studio carries.

Updated 13 hours ago
Published 2 days ago
StatusReleased
CategoryAssets
AuthorOut of Tokens Studio
Made withGodot
Tags3D, Asset Pack, Godot, Materials, Physics, Pirates, Procedural Generation, Sailing, Shaders, underwater
Average sessionA few minutes
LanguagesEnglish
AI DisclosureAI Assisted, Code, Text

Purchase

Buy Now$9.99 USD or more

In order to download this asset pack you must purchase it at or above the minimum price of $9.99 USD. You will get access to the following files:

tidewater-godot-ocean.zip 4.6 MB
tidewater-addon.zip 2.9 MB

Leave a comment

Log in with itch.io to leave a comment.