Changelog
v2.0.0
Requires Unity 6 (6000.0+) with URP 17 · Previous release: v1.0
Tidal 2 is a near-complete rebuild of Tidal's rendering, simulation, and interaction stack. The FFT ocean core remains, but almost everything around it - how the water is meshed, shaded, interacted with, queried, and edited - is new or rewritten. Projects upgrading from v1.0 should read the Upgrade from v1.0 guide.
Underwater Cut-Aways & Performance (final 2.0 additions)
- Pixel-exact water cross-sections. Volumes with ClipVisual set to Underwater Mask (aquarium walls, submarine windows, pool cut-aways) are resolved by a closed-form fullscreen ray-intersection pass instead of proxy meshes - the cut face fits the water edge exactly, at any shape, scale, feather, or LOD, including while the volume moves.
- Underwater quality settings, per renderer asset. The Tidal Render Feature carries per-renderer defaults for Volume Masks, God Rays, Volumetric Lights, and the Volumetrics Resolution budget; every TidalBody has a matching Underwater foldout where each setting can follow the renderer default or be overridden per body. The volumetric light buffer renders at a fixed budget (default 960) instead of scaling with the display - same cost at 1080p and 4K.
- Noise-free volumetric lighting. Underwater point/spot scatter uses deterministic equi-angular sampling with dry-void excision - smooth cones and god rays with no dither grain or temporal noise.
- Cross-sections on every body at once. Each body renders its own volume masks against its own waterline - an aquarium on a raised lake and a void in the ocean draw in the same frame. Overlapping masks resolve by depth: a dedicated entry-resolve pass walks each pixel's cut-face candidates nearest-first and keeps the first that is genuinely water, so a volume's above-water silhouette can never punch a hole through a mask behind it.
- Caustics ride the current. The baked caustic tile is advected by the local flow field (zone currents, whirlpools), above and below water, at effectively zero extra cost when there is no flow.
- Trimmed per-frame waste. From-below surface passes and the volumetric chain skip entirely for bodies with underwater disabled; planar reflections pause while the camera is submerged and their Update Hz now genuinely throttles the mirror render (it previously only staled the pose while paying the full render every frame); mask volumes are frustum-culled before any mask pass records; the FFT's initial-spectrum precompute re-runs only when a profile parameter changes; an idle flow layer stops dispatching; and several unused full-screen clears and allocations were removed.
- Editor lifecycle hardening. Planar reflections mirror the Scene view camera while out of play mode; saving a scene or the project can no longer unbind the FFT/canvas/zone textures from the surface material (a post-save rebind heals it automatically); and assigning a Surface Material to a freshly created body with Run-In-Editor on initializes cleanly instead of erroring.
- Editor niceties. Body Size (formerly Ocean Size) resizes via the normal scale gizmo while the transform scale stays (1,1,1); inspector warnings flag volumes whose Underwater Mask is disabled by a body override or renderer default; Tidal inspectors no longer force constant repaints.
- Tidal 2 branding. The asset installs to
Assets/Tidal 2, and all menus live under GameObject → Tidal 2, Window → Tidal 2, Tools → Tidal 2, and Create → Tidal 2. - Wake foam moved next to its layer. The Wake Produce Foam toggle now sits in Interaction → Layers beside the foam and wake layers it couples.
- Buoyancy hardening.
TidalBuoyancyignores invalid water-height samples and self-recovers from non-finite rigidbody poses instead of spiraling into "Invalid worldAABB" errors. Multi-body scenes are safe: volumes and zones scope strictly to the bodies they affect (a non-empty Affected Bodies list is exclusive), so a lake's contained-water volume can no longer invalidate the neighbouring ocean's height queries.
Platform & Pipeline
- Unity 6 only. The project moved to Unity 6 (6000.0+); Unity 2022/2021 are no longer supported. Rendering is built on URP 17's RenderGraph API.
- All water rendering runs through a single
TidalRenderFeature(one renderer feature instead of separate underwater/effect features). It drives the surface, underwater, and meniscus passes and assigns per-body rendering layers automatically. - Graphics APIs: D3D11 and D3D12 are tested and supported. Vulkan is not supported in 2.0 - several fullscreen passes rely on quad-topology procedural draws that Vulkan does not accept; a conversion to fullscreen triangles is planned for a follow-up release. WebGL remains unsupported (compute shaders required).
- The interaction canvas and FFT simulation run on compute shaders.
New: Interaction Canvas System
World-anchored clipmap canvases that follow the camera and points of interest, storing dynamic water state independent of the FFT:
- Foam layer - persistent foam injected, decaying over time, and advected by the flow field (foam drifts with currents). Sources: foam emitters, breaking wakes, scripted injection.
- Wake layer - a real 2D wave-equation simulation in world units; Wake Emitters displace the surface, wakes ripple/reflect, and breaking fronts shed foam into the foam layer.
- Flow layer - a composited flow/current field from Flow Emitters and baked Flow Zones; consumed by rendering, foam transport, wake advection, and C# queries.
- Per-layer enable toggles on the body's Interaction foldout - disabled layers cost nothing.
- Layers simulate in one dependency-ordered CommandBuffer (flow → wake → foam) with slot-based tile allocation, dirty-region tracking, and zero per-frame GC pressure (
GraphicsBufferRingupload rings). - Emitter components: Foam Emitter, Wake Emitter, Whirlpool Flow Emitter.
New: Quadtree Ocean Mesh Generator
- Tiles split recursively around the camera and any number of Points of Interest (one shared POI list drives mesh detail, the interaction clipmaps, and the physics field).
- Bounded or infinite water from the same generator: finite bodies get pixel-accurate rectangular clipping; boundary tiles stretch to fill the bounds exactly without gaps.
- Quadtree balancing + seam stitching eliminate T-junction cracks; mesh caching avoids rebuild hitches; layout only rebuilds when a POI moves.
- Three LOD materials (close/mid/far) with automatic keyword setup, driven from one source material.
New: Deferred-Style Water Shading
Water shading moved to a GBuffer + fullscreen composite - see Shading & Caustics.
- Geometry tiles write a compact water GBuffer; a single fullscreen pass shades the surface once per pixel - overdraw-proof and consistent at every distance.
- Energy-conserving PBR composite (Fresnel-weighted reflection vs transmission), physically-gated underwater light transport ((1−F) transmission on entry and exit), and an SSS rework (
TidalSSS.hlsl). - Foam is lit once and composited WYSIWYG - identical in editor and player, correct at night, with foam texture array sampling and new procedural sea-foam textures.
- Ambient/lightmap data is bound globally for the fullscreen pass (fixes black water/foam in player builds); planar and environment reflections blend from zero strength, and planar reflection is per-body.
New: Baked Zone System (per-body)
- All zones affecting a body bake into two world-anchored rings (near + far) the moment a zone changes - runtime cost is a single texture tap regardless of zone count.
- Zone textures are evaluated with a C2 cubic B-spline and analytic gradients - smooth normals at any zone scale.
- Per-body zones:
Affected Bodies/ layer-mask scoping works correctly with multiple TidalBodies. - Zone types: Damping, Height Modify (experimental), Flow Current. In-scene zone painter improved; Height Map Generator editor window added.
New: Dynamic Caustics
- A baked caustic tile - each frame a grid of sun rays refracts through the actual FFT wave derivatives over one wave period; ray landing density forms the pattern, repeated to the horizon at near-zero cost.
- Three depth slices (R/G/B) for chromatic depth separation; separable blur with per-slice radii; resolution and blur-quality dropdowns on the material.
- Additive-only compositing, depth fade, shadow gating, an "ignore sun" mode, and depth-parallax drift. Visible above (through refraction) and below water.
New: Underwater Rendering Rework
- The underwater post effect now owns all underwater fog - the from-below surface renders raw into a dedicated buffer and is fogged consistently (no double-fog or flicker).
- Meniscus water-line pass with color/thickness/strength controls; analytic near-plane submergence renders partial submergence correctly.
- Volumetric god rays and point/spot scatter - both marches are shadow-aware; point/spot scatter runs at half resolution with a smoothing blur (smooth noise-free glow at roughly a quarter of full-resolution cost).
- Underwater SSS, absorption, and fog density are tuned by the same material the surface uses.
New: GPU Physics Field & Water Queries
TidalPhysicsFieldSubSystembakes water height + normal (FFT + zones + wake) around each POI on the GPU and reads it back asynchronously - fast, allocation-free CPU queries including wake displacement. See Water Queries & API.- Flow sampling API for C# access to the composited flow field.
- FFT resolution (
Size) can be changed live at runtime - all GPU resources rebuild and consumers rebind automatically.
New: Buoyancy & Floating Objects
TidalBuoyancy- generic float-point buoyancy for any Rigidbody: per-point uplift, air/water drag switching, current push from the flow field, wave slide on steep waves, and roll/pitch stabilisation. Auto-binds to the first water body if none is assigned.- The demo BoatController handles only engine, steering, and camera on top of
TidalBuoyancy, and auto-migrates old v1.x boat tuning.
New: Underwater Particles
- An Underwater Particles subsystem on every Tidal Body (its own foldout): suspended "marine snow" motes + rising, wobbling bubbles around the viewer camera while submerged.
- Fully procedural (no texture/prefab assets); every particle is culled at the water surface (one camera-anchored CPU height query per frame). Density, size, colour, drift, and rise speed are tunable; one Enable toggle skips it entirely.
New: Water Cross-Sections & Dry Cavities (volumes)
- A Water cross-section clip visual on Tidal Volumes: below-water cut faces render the real underwater fog/scatter (clipped wells, cut-outs, moon pools). Implemented as an entry-depth mask consumed by the underwater post effect itself.
- Dry cavities: a camera inside a carved void below the waterline stays dry (no fog pop) while surrounding water shows through the cut faces - submarine / underwater-room interiors.
- Per-volume Cross Section Scale; feather-aware cut faces; works for both Exclude and Include modes. The mask waterline follows the rendered mesh at every LOD. See Tidal Volume.
New: Sea Foam Texture Generator
- A bundled editor tool (Tools → Tidal 2 → Sea Foam Generator) authors tileable grayscale foam textures: warp/scale/threshold/vein controls, live single-tile and 3×3 previews, one-click PNG export with correct import settings.
- The material inspector's Foam Texture row has a Generate button that opens the tool.
New: Editor Experience
- Run-In-Editor preview (default on) runs the complete water in edit mode without entering play mode.
- TidalBody inspector rework with clean foldout sections; compute shader references auto-assigned and hidden; one Points-of-Interest list for everything.
- Show Material LODs debug view rebuilt for the deferred pipeline; validation improvements (bake shaders, URP depth/opaque, render-feature setup) with interval-cached scans.
- New emitter menu items, editor icons, a welcome window, and versioned Doc buttons throughout. See Editor Tools.
Demo Content
- New Asset Store demo scene plus Demo Island with baked lighting and reflection probes.
- Boat waypoint follower demo script; the boat controller rides the physics field and responds to flow currents.
- Foam textures, updated damping maps, and refreshed materials across all demo scenes.
Fixes (highlights)
- Horizon artifacts eliminated: water pixel positions are reconstructed from true geometry depth (the old ray-plane solve was singular at eye level), and fullscreen GBuffer taps are point-sampled.
- Multiple TidalComputes across multiple bodies work when bodies share one surface material (per-body material isolation in play mode).
- Foam renders correctly in player builds (ambient probe binding) and at night; SDF clipping fixed; wake works in the underwater fullscreen view.
- Quadtree gap/seam fixes; underwater water-line matches the rendered surface at every vertex density.
- Fixed multiple TidalBodies fighting over global bindings; fixed editor slowdowns with a TidalCompute/validation inspector open; stale material state can no longer disable zones or damp the ocean at startup.
- Numerous stability fixes around domain reload, editor preview re-enable, undo/save round-trips, and runtime resolution changes.
Removed
GetWaterHeightSlowand the TidalCompute GPU height cache - the physics-field clipmap (FFT + wake + zone + damping in one tap, coarse outer LODs covering the whole play area) is now the single CPU height source. Scripts should useGetWaterHeight/TryGetWaterSurfaceand treat thefloat.MinValuesentinel as "no water here". The Physics Field's tuning (enabled, size, LOD count, resolution, update Hz) now has its own foldout on the TidalBody inspector.- Lake mesh generator - superseded by the quadtree generator's bounded mode.
- UnderwaterEffectFeature - superseded by
TidalRenderFeature. - Legacy per-pixel zone loop and its global-only bindings.
- Shoreline waves - the experimental shoreline breaking-wave zones were withdrawn; returning in a future update.
- Retired material properties - do-nothing/superseded sliders were removed from
Tidal/Tidaland their tuned values baked in. (Wake Normal Strength has since returned as a new Surface → Advanced slider; 1 = physically correct.) - Experimental VR/XR integration - withdrawn from this release; returning later as a separate, opt-in package configuration.
See the Upgrade from v1.0 guide for the full breaking-changes checklist.
v1.0.0
- v1.0.0 - Documentation expansion, tooling polish.
- v1.0.0 - Initial release.