Large water surfaces cost less: tiles the camera cannot see are culled entirely, and detail concentrates near the viewer instead of being spread evenly across the whole surface.
Every water surface inside a zone is drawn by one continuous mesh whose tiles come from a quadtree. Oceanology Pro can build and traverse that quadtree entirely on the GPU and issue indirect draws from it, and it can occlusion-cull water tiles two ways: hardware occlusion queries on the CPU, and hierarchical-Z plus pixel-precise raster queries inside the GPU traverse itself. The practical difference is between an ocean that costs what is on screen and one that costs what exists in the level.
On the CPU, the proxy publishes quadtree node bounds in breadth-first order as sub-primitive occlusion queries. Capping the query count therefore does not disable culling, it just makes it coarser from the top of the tree down. Bounds are expanded in XY only so a tile about to come into view is not popped, far-mesh tiles get their own queries, results are tracked per view key, and results from a proxy created on an older tree are rejected.
On the GPU, the traverse does the culling itself. In the default mode it first tests nodes against the view's hierarchical-Z buffer, then emits query boxes and indirect arguments for a depth-read-only raster pass that tests them pixel-precisely against the scene depth target; only surviving nodes reach the draws. Modes for off, HZB only and raster only are also available. Both paths report into the Oceanology Water Mesh stat group, which counts tiles drawn, tiles occlusion culled, draw calls, vertices drawn, drawn materials and occlusion queries issued.
| Oceanology NextGen | Oceanology Pro | |
|---|---|---|
| Quadtree residency | CPU-only tree, traversed on the render thread | Same CPU path, plus an optional GPU-built and GPU-traversed tree driving indirect draws |
| Tile occlusion | Tiles were culled by frustum only | CPU hardware occlusion queries on node bounds, and HZB plus pixel-precise raster queries inside the GPU traverse |
| Mesh scope | Quadtree settings authored per water body, with a fixed tile extent | A water zone owns one continuous mesh; extent, tile size and quadtree resolution are zone-level, with a sliding infinite window regenerated at runtime |
| River blending | Generic river-to-lake and river-to-ocean transition materials | Transition materials resolved per exact river/target pair, cached across rebuilds and refreshable without a rebuild |
| GPU quadtree | r.Oceanology.WaterMesh.GPUQuadTree, default 0 |
| GPU occlusion mode | r.Oceanology.WaterMesh.GPUQuadTree.OcclusionCulling, default 3 (HZB plus pixel-precise raster) |
| CPU occlusion culling | r.Oceanology.WaterMesh.OcclusionCulling, default 0 |
| CPU max occlusion queries | 256, with far-mesh queries always included by default |
| Occlusion bounds expansion | 4800 cm in XY |
| Tile size at LOD0 | 2400 cm (per water mesh component) |
| Tessellation factor | 1 to 12, default 6, giving 64 quads and 65 vertices per tile side |
| Max mesh dimension | 256 tiles per axis before the LOD count is automatically biased down |
| GPU raster quality | Supersampling 2 (1 to 8), jitter samples 4 (1 to 16), jitter footprint 1.5 px, MSAA jitter pattern |
| Quads per indirect draw tile | 8, clamped 2 to 128 and rounded up to a power of two |
| River Z bounds padding | 200 cm |
| WaterInfo render target | 512 by 512, half precision, velocity blur radius 1 |
| Ray tracing | r.RayTracing.Geometry.OceanologyWater, default 0 (water excluded) |
This is one entry on the Galidar roadmap. For what already shipped in each release, see the Changelog.