Lab

Ænima

Oct 13, 2026

A tribute to Tool's Ænima cover. A blown-out white rectangle hums in the dark, electric fibres crawl off its edges, and a field of skulls waits behind them. Move the cursor to disturb it.

React Three FiberGLSLPost-processing

Overview

The Ænima cover is a white rectangle burning in the dark. Look long enough and skulls start showing up behind it.

I rebuilt it as one fullscreen fragment shader, then bloom, then a CRT pass. No meshes.

Skulls

The skulls come from four textures. Same layout in all of them: a 4×4 grid, sixteen skulls.

Skull atlas

Atlas. The colour, in grayscale. There's no alpha. A skull's shape is its brightness, so where the texture goes black, the skull ends. That's why they don't look like stickers on circles.

Skull height map

Height. How far each point sticks out. When two skulls overlap, the higher one wins.

Skull normal map

Normals. Which way each pixel faces. Red is left to right, green is up and down, blue is toward you, so flat is lavender. The rectangle and the cursor light the skulls through this map.

Skull occlusion map

Occlusion. What's buried. An eye socket can face the light and still be dark, and this map keeps it that way.

None of it is 3D. Four flat images, faking depth.

Albedo, height and occlusion only need one channel each, so they're packed into the red, green and blue of a single texture. Every pixel checks nine skulls, so that halves the texture reads.

The skulls sit on a staggered grid, each with a random tile, rotation and size. They're bigger than their cells, so neighbours blend into each other like on the cover. Each one drifts slowly, and once in a while one surges toward you and catches more light.

Cursor

Moving the cursor brings the skulls out of the dark. The trail lives in a small buffer that fades a little every frame and also stores how fast and which way you moved. Move slow and the skulls appear. Move fast and they shake.

A faint copy of the field trails behind the cursor, like an afterimage.

Light

Smooth noise looks like smoke, and the cover looks like dry brush. So the fibres are strokes. They grow out of the rectangle's edges, each with its own length and width, and they wear thin and break up as they go. Every stroke changes length about ten times a second, so they crackle instead of flowing.

The core is clipped to white and bloom spreads it into a cyan halo. A CRT pass adds fringing, jitter, scanlines and grain. Most of the mood comes from that last pass.