glslop
[ CC0 shader vibe commons · everything here is public domain ]
experimental backend WebGL2 · not opted in
Enable WebGPU controls in settings. WebGL2 remains unchanged.
preview clip · live controls are optional this browser needs the main-thread fallback, which may freeze the page.
params (38)
3.00
1.45
0.00
0.00
1.00
0.50
1.00
4.00
0.72
0.35
0.30
3.05
2.44
0.72
1.00
0.35
0.65
0.55
0.03
0.00
3.00
1.00
0.55
0.55
0.45
0.30
0.80
0.75
0.85
0.50
0.45
0.35
1.00
0.55
0.35
0.35
0.28
0.50
.fs source · isf not running

Back The Way You Came

#36v1cyvi
⑂ fork it{ } json

An endless liminal office, generated rather than modelled. There is no level file and no mesh: every partition, every ceiling tile and every dead fluorescent tube is decided by hashing an integer cell index, so the building is unbounded in all four directions and identical for everyone who runs it. The geometry is a 2D problem wearing a 3D coat - partitions run floor to ceiling without exception, so the whole maze is a plane figure extruded and the scene distance is nothing more than min(floor, ceiling, footprint), where footprint is a 2D box SDF evaluated over the 3x3 cells around the sample. That is why a 128-step march through an infinite building costs about what a single sphere costs: the expensive dimension was never there. One cell holds one partition, with its orientation, length, lateral offset and slide read off a four-component hash of the cell id and a small chance of a square pillar instead; doorways are punched by subtracting a second, shorter box, and because that hole is height-dependent the subtraction is the only place the third dimension enters the maze at all. The camera has to be able to GO somewhere, which a hash alone will not guarantee, so one lane of cells is forced empty - a cell is skipped when its centre lies within about a cell of a smooth wandering curve x = path(z) - and the camera walks that same curve. The corridor is therefore carved by the very function that drives the walk and can never be walled off; turn wander to zero and it straightens into a single long hallway. Light is the whole subject. Troffers sit on their own lattice, 2x4 panels with a quarter of them dead and a few of them dying, and every surface gathers from the nine nearest treating each as a RECTANGLE rather than a point: the closest point on the panel is clamped to its extents, so a wall a metre below a tube gets the long soft falloff a real one does instead of a hotspot. A shadow ray is fired only at the strongest of the nine and the other eight are carried by ambient occlusion, which is what keeps a nine-light scene at the cost of a one-light scene. A second, coarse march then accumulates in-scattering from those same panels into the fog, and that is what puts the hazy halo around every fixture and the shafts down the far end of the corridor - the glow is integrated along the ray rather than smeared on afterwards, so it sits correctly in front of and behind the geometry. The surfaces are procedural too: wallpaper as a half-drop repeat of one of four motifs (a chevron stack, a damask lily, a sparse dot and a striped bead), drop-ceiling tile as a two-octave stipple with water rings, discoloured panels and the occasional missing one, and carpet as two octaves of value noise at loop-pile frequency with traffic wear and damp. None of that survives contact with a horizon unless something stands in for a mip chain, and fading by DISTANCE alone is not enough - a wall seen edge-on packs a hundred tiles into ten pixels while still an arm's length away. So each surface is told how many metres of itself one pixel covers, which is the pixel's world size at the hit distance divided by the grazing cosine, and each texture fades toward its own average as that footprint approaches its feature size. Without the cosine term the chevrons alias into broad moire arcs across every oblique wall; with it they simply go quiet. The same care is why the shadow ray is aimed along the WEIGHTED MEAN of the nine panel directions rather than at the strongest of them: the strongest one changes as you slide along a wall, the loci where two panels tie are smooth curves, and the shadow term steps across them - which paints the wall in concentric arcs. A mean moves continuously and has no seams. Then it is put on tape: the ray direction is bent by a barrel term and shoved sideways per scanline BEFORE it is ever traced, so the tracking error lives in the optics rather than being painted over them, and the frame picks up scanlines, head-switching hash along the bottom edge, dropouts, grain, edge tint and a lifted black. Where the lights have failed is decided by a slowly varying field over the plan rather than one tube at a time, so the dead ones clump: a flat per-panel probability scatters them evenly and every distance ends up equally lit, whereas clumping puts a genuinely dark room at the end of a corridor. That same field dims the ambient and the fog, so a dark zone is dark the whole way through instead of merely missing its highlights. The troffers land in the tile grid rather than across it: the tile size is a quarter of the light spacing, so a panel centred at (lid + 0.5)*LG sits on an exact multiple of the tile - a T-bar - and every fixture straddles a grid line by half a tile until x is offset by half a tile and the panel's size is taken from the spacing instead of from fixed metres, which keeps it exactly one tile by two at any setting. And sometimes there is a figure standing down the corridor - pale, featureless, its legs dissolving before they reach the floor, built to real proportions out of ten pieces with an egg-shaped head, a short neck, sloped shoulders, a chest narrowing to a waist, arms with an elbow and legs with a knee. A neck is a width pinch rather than a gap, and a capsule ending at the shoulders puts a hemispherical cap a full radius ABOVE its endpoint, so a chest of radius 0.15 ending at 1.50 bulges to the underside of the head and swallows the neck whole; stopping the chest lower and giving the shoulders their own sloped piece takes the silhouette from 0.43 m wide at the shoulders to 0.10 m at the neck to 0.18 m at the head inside twenty centimetres, and that contrast is the neck. A torso is also not round - a circular capsule as wide as a chest is equally deep and reads as a barrel, so z is squashed by 1.45 before the trunk is evaluated. Both of those lean on the same freedom: the tapered capsule is not a valid distance field wherever its radii differ, and the squash breaks the metric outright, and neither matters because the field is only ever sampled. It is never marched as a surface; the distance field does not know about it. It is integrated as a soft volume along the primary ray inside its own bounding sphere - which is also what makes it cheap to break: the sample position can simply be warped before the figure is evaluated, so horizontal slices tear sideways, a slow boil runs underneath, a scanline sweeps down it and the whole thing drops out for the odd beat, all of it updating on an 11 Hz beat rather than continuously, because a value that holds for ninety milliseconds and then jumps reads as a recording fault where a smooth wobble would only read as motion; a second, x-offset density accumulated in the same loop drives the blue channel, giving a real spatial separation rather than a coloured fringe - which is the whole difference between something you can see through and a white statue, and it costs eighteen samples over a few per cent of the frame. The walls occlude it for nothing, because the integration simply stops at whatever the marcher already hit. Rather more than half of the doorway openings are still hung with a leaf, which is a second thin box in the same footprint as the opening - one more box and no extra hash, since fract(g.z*13.7) is decorrelated enough from the g.z that already decided whether there is an opening at all. Thirty-six controls: walk speed, focal length, yaw and pitch, how much the corridor wanders and how sharply it turns, handheld sway, cell size, wall density, doorway frequency, ceiling height, light spacing, what fraction of the tubes still work, brightness, flicker, how much the outages clump into dark zones, haze, fog, a palette that crossfades classic yellow into sickly green, institutional grey and sepia dusk, the wallpaper motif and its scale, baseboard, grime, damp, blood, carpet pile, ambient occlusion, shadow, the figure, how many of them and how badly they glitch, and five tape controls for the analogue damage.

#backroom#backrooms#leaving#exiting#room#office#building#ghostgeneratorraymarchliminalbackroomshorrorarchitectureproceduralvhs3d
by ksinwitnessed_generationmade with ClaudeCC0-1.0credit: CC0activecreated 2026-09-03 22:00Z125 views1 forks38 paramsClaude-Opus-5
lineage
export clip · render a video in your browser

Renders to video in your browser (no upload), stepping the real renderer frame by frame so multipass + feedback come out right. motion auto-animates the shader's own knobs — each export rolls a fresh take (🎲 re-roll, 🔒 to pin one you like). GIF is slower with a tighter length cap; MP4/WebM are faster. Some devices record in real time (noted below if so) — keep the tab visible.

caps: ≤1920 per side, ≤60fps, ≤18000 frames (GIF ≤300)
embed · drop this shader into any page
preview ↗

Renders client-side in the reader's browser (CC0 — no attribution required, but the backlink is appreciated).