Lab · Aug 2026

The Underground

The Ridge looks at the grass. This is the same ground from the side, cut open six metres down to rock. Scroll and the roots grow with you.

A real soil profile has five horizons, and only the top one is ever visible. The rest is ordinary, universal and completely hidden, which seemed worth six metres of scroll.

Bedrock. Nothing grows through that.

The profile

Nothing here is stylised. The colour arc is real reflectance: dry topsoil sits near 0.10 to 0.15 albedo, and mineral horizons get paler with depth because they carry less organic matter. An early pass used 0.06 for topsoil and the whole face went to mud.

  1. OLitter0 to 6 cmLeaf duff, not yet soil. The only horizon you ever see.
  2. ATopsoil6 to 56 cmDark umber. Organic matter mixed down into mineral grain.
  3. BSubsoil56 cm to 2.3 mRed clay. Everything washed out of A has accumulated here.
  4. CRegolith2.3 to 4.7 mPale ochre. Parent rock, broken but not yet moved.
  5. RBedrockbelow 4.7 mCool grey. Roots stop at 2.7 m, well short of it.

Growth without a video

Roots are not a frame sequence. Each root layer ships as a colour plate plus a data plate whose red channel holds the time that pixel was born, baked out of the growth simulation. The shader draws everything born before the current scroll depth and feathers the edge, so growth is continuous at any scroll speed, has no loop to seam, and costs two images instead of a film.

The data plate has to be read raw. It is written as non colour data, so the byte is the value. Letting the browser apply an sRGB decode bent the timeline badly enough that half the growth landed in the first fifth of the scroll.

The lag is the trick

Driving growth straight off scroll position pins the growing front to one line of the screen, because birth time is depth and the wall scrolls exactly one metre per tile. Nothing ever changes where you are looking. Chasing the target instead of matching it means every scroll leaves the tips behind and you watch them catch up.

What moves, and what does not

There are no worms. Roots, mycelium, water and rock only, which leaves very little honest movement in a static face. Roots growing works because roots grow. Loose crumbs work because you are the disturbance: they spawn against scroll distance, live in document coordinates so they fall down the wall they came out of, and land under real gravity.

Moisture does not move, deliberately. Four attempts at animating the damp patches, drifting sheen, per patch pulse, specular glint, all read as a film laid over the wall rather than as wet ground, and none of them were perceptible to the person looking. A ten second moisture pulse was invented. The patches are baked into the plates and stay put.

Light

One number does the lighting. The cut is a slot 1.6 m wide with camera invisible blockers, so the open sky above is the only source. Sky visibility falls with the width of that opening, which is what makes the descent go dark on its own, and 1.6 m puts the shadow line about a third of the way down.

Still open

Roots stop at 2.7 m, so the bottom two tiles carry nothing but rock and are the least interesting scroll on the page. Mycelium is one tile where it should probably be three. The wall is a single column, so a wide monitor gets a tall thin strip of soil with a lot of paper either side.

Back to Lab