Every tree in this forest exists as several things at once: a mesh of half a million triangles, a ladder of thirteen Gaussian splat sets from 8 splats to 160,000, a ray-marched volume, and, beyond three kilometres, a part of one continuous canopy surface. Each frame, the GPU picks one for every tree it can see, by how many pixels the tree covers, and fades between them so the change doesn't show.
The left half is the frame as rendered. The right half is the same frame with each tree tinted by its representation, its shading kept as grey. Here volumes are switched on beyond 900 metres; in the shipped settings they are off, and splats run all the way to the canopy surface.
RenderedBy representation
The same American beech at the clearing's edge with every other tree hidden, rendered as a mesh, as the splats the renderer picks for it at this size, and as a volume. It is lit as if it stood alone.
The splats are not merged from finer splats. Each level is sampled directly from the mesh at its own scale: surface area, position and normal moments, and material averages are accumulated in an octree, and each splat is built from its cell, widened enough that an opaque surface stays opaque. A level is used where its splats come out about 1.5 to 2 pixels across. Below, the same tree with every tree forced to one level, from fine to coarse. The four finest levels, 20,000 to 160,000 splats, are only ever used for the nearest splat trees; forced on every tree in view they would exceed the frame's budget of 16 million splats.
Each row is one thing seen from further and further off, every frame zoomed so it stays the same size. What changes is what the renderer draws for it at that distance in a normal view, shown at a scale where you can see it. Every other tree is hidden.
Distances are from the camera to the edge of a tree's crown, on a log scale. Around each hand-over a tree is drawn both ways for a moment, each keeping complementary pixels of a blue-noise mask that turns every frame, and the anti-aliasing averages the two into a blend.
RenderedBy representation
Each kind is grown once from a seed, then converted. The numbers are read from the running app.
A skeleton by space colonization (broadleaves) or by whorls of limbs on a straight stem (conifers), with leaves on sprays.
Bark tubes welded at the junctions, twig ribbons, one quad per leaf cut to its outline in the shader. Never decimated.
A WebGPU path tracer bakes the indirect light into every vertex, and the sun's visibility inside the crown for eight orientations.
Thirteen levels sampled from the mesh, each chosen by its measured error against renders of the mesh, lit with the same baked light.
One splat level deposited into a 0.3 m grid: extinction, colour, indirect light and sun visibility per voxel, four mip levels, a distance field for skipping air.
| Asset | Near | Middle | Far |
|---|---|---|---|
| Leaf litter | Individual leaf meshes | Splats baked from a litter tile | A baked texture on the terrain |
| Meadow grass | Blades, to 48 m | A ray-marched layer of tussocks, lit by a sward model | |
| Rocks, logs, stumps | A fine mesh | A coarser mesh, handed over at 25, 12 or 7 m | Faded out at the kind's range, 120–300 m |
| Brook | A water surface drawn over the bed: refraction, screen-space reflection, flow around each stone | ||
Rendered offline from the same renderer, each frame 12 samples through its anti-aliasing. The sound is synthesized along the same path: wind in the leaves, the brook, birds, footsteps.