A paper collage reindeer (artwork by a young child) rebuilt as 15 thin paper layers. Tilt it, move the lamp, and watch the stacked layers cast soft shadows on each other.
Builds a test edge (the head over the background sheet), puts the lamp about 30° to the side and compares three results: the similar-triangles formula, a CPU ray-sampled light disk against the real mesh, and the pixels the GPU actually rendered.
The science
Light and shadow. Light travels in straight lines. A paper layer blocks the rays that would have reached the sheet behind it, so a shadow appears there. Real lamps are not points: every point of the lamp sends its own rays, and each of those casts a slightly shifted shadow.
Umbra and penumbra. Where all of the lamp is hidden you get the dark core (umbra). Where only part is hidden you get the fuzzy edge (penumbra). A bigger lamp, or a bigger distance between the layers, makes the fuzzy edge wider.
penumbra width w = L × (d_receiver − d_blocker) / d_blocker
Here L is the lamp size, d_blocker is the distance from the lamp to the layer that blocks the light, and d_receiver the distance to the surface that gets the shadow. This comes from similar triangles. For a flat sheet with the lamp at height H and the blocker raised by z above it: w = L · z / (H − z). The shadow also slides sideways: shift = z · offset / (H − z), where offset is how far the lamp is to the side.
Layers and parallax. Because the pieces sit at different depths, tilting your view moves near layers more than far layers. That apparent motion is parallax, the same effect that makes nearby trees slide past a car window faster than distant hills.
Relief. The thick red paint of the nose and the lace-like ridges of the antlers use a normal map: a picture whose colours store which way the surface tilts, so flat paper reacts to light as if it had bumps. We derived it from the brightness of the photo (bright = high), which is a rough guess, not a measured height.
Honest simplifications. Shadows use a shadow map with a soft-shadow filter (PCSS) that estimates the blocker distance by averaging a few samples, so complex overlaps are approximate. The lamp is a sphere of uniform brightness. Real paper also lets a little light through and scatters it; here paper is opaque. Layer gaps are exaggerated compared with real glued paper (about 0.7 mm per sheet) so the effects are easy to see. Snow is a toy model: flakes stick to the top edges of layers.
Check it yourself. Use the numeric check above: the formula and the measured penumbra should agree within a few percent for the ray test and within a few percent for the rendered image at moderate lamp angles. At very oblique lamp angles (45° or more) the soft-shadow filter underestimates the penumbra: a known limit of this technique.
Artwork: paper collage and paint made by a young child, photographed and traced into layers with Blender 5.2 (Cycles-baked relief maps), rendered with Three.js.