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 about 29s to compile on a fast gpu; slower hardware can take longer. this browser needs the main-thread fallback, which may freeze the page.
params (47)
2.00
1.40
0.00
0.08
1.00
0.45
1.00
5.50
0.58
0.22
0.70
0.70
4.20
2.00
0.55
0.70
0.26
0.42
1.00
1.00
0.85
0.55
5.50
0.85
2.40
0.11
4000.00
1.00
0.35
0.70
0.70
0.75
0.04
0.00
1.00
0.70
0.35
0.40
0.75
0.80
0.80
0.90
0.85
0.30
0.22
0.20
0.45
.fs source · isf not running

goth poolrooms

#n0litkhj
⑂ fork it{ } json

THE CATHEDRAL POOLROOMS. An endless flooded cathedral in ankle-deep water, generated rather than modelled: no level file and no mesh, every pier and every arcade opening decided by hashing an integer cell index, so the building is unbounded and identical for everyone who runs it. The plan is still the backrooms trick - a 2D box SDF over the 3x3 cells around the sample, extruded from the floor to the impost line - but the lid is gone. THE CEILING IS THE WORK. A drop ceiling is a plane and costs nothing; a vault is a shape, and the only vault that can tile an infinite building is one written as a single folded cell, so p.xz is folded into one bay and the vault is drawn ONCE, everywhere. Two things fall straight out of that: no arch can ever collide with a neighbour, because there is only ever one arch; and the cost of an infinite cathedral is the cost of one bay. The cell is a groin vault, which is the UNION of two barrel vaults and not their intersection - the intersection is a cloister vault, it closes to a point at the crown, and that is a dome and not a cathedral. Each barrel is a POINTED arch, built as a circle whose centre is pushed outward past the springing by uPoint, so the two arcs meet at an angle instead of a tangent; the crown then rises as sqrt(1 + 2*uPoint) times the half-bay, which is the entire reason the pointed arch was invented and the reason the ceiling here stands three times the height of the walls carrying it. It is not a height field. The obvious way to arch a ceiling is to make its height a function of x and z and subtract that, and such a profile is VERTICAL at the springing, so its gradient is unbounded exactly where the geometry is most delicate and a sphere tracer walks straight through the haunch. A barrel written as a radius about an axis has gradient one everywhere. Folding has one failure and it is instructive: below the springing line the barrel field degenerates to a slab, and the max of two slabs is a square shaft that would wall off every bay at floor level. So the void is unioned with the whole half-space beneath the springing - which is exact rather than a fudge, because every scrap of vault masonry lives above that plane - and the union leaves precisely one zero, at the corner of each bay at impost height. That zero is not an artefact to be smoothed away, it is where the vault lands: put a corbel there and the field becomes honest. The ribs are subtracted tubes whose axes are curves the surfaces already share - the groin where the two barrels cross, the transverse arch in the plane of the bay edge, the ridge along each crown, a boss at their crossing, and a pair of intermediate liernes that turn a quadripartite vault into a net vault as uRibs is raised. The webbing between them is coursed ashlar laid in the vault's OWN coordinates, arc length up the curve against distance along the axis, so the courses run with the shape instead of across it. The lights are floating orbs and they are deliberately NOT in the distance field. An emissive sphere in map() is found by every shadow ray and every ambient-occlusion probe, and a light that occludes itself blacks out the room it is lighting; so each orb is an analytic splat along the ray - one dot product for depth, one for the perpendicular miss - and a point in the light gather, and nothing else. Their colour is a blackbody curve in kelvin, normalised so that changing the temperature changes the colour and not the exposure, from 1700 K candle to 7500 K overcast. Around each orb is a flock of moths. Each moth is on a tilted, precessing orbit whose radius breathes, so the flock spirals toward the light and falls away from it rather than sitting on a ring; they are projected onto the ray and accumulated as ONE order-independent premultiplied layer, which is what lets a moth be a bright mote against the dark nave and a dark silhouette across the orb without ever being sorted. The water is unchanged and still the subject, and still not marched: a pool ripple is 8 mm, under a pixel past arm's length, so the surface is an analytic plane hit plus one Newton step and everything anyone sees is in the NORMAL. Four rotated wave trains, phase-warped by value noise, each moving at one over the square root of its wavenumber - gravity-wave dispersion - so the long trains outrun the short ones and the field never reads as a scrolling texture. Caustics are the focusing term of the refracted map, one over one plus depth times the Laplacian of the ripple, and the same field attenuated by height is what puts moving light forty feet up on the vault webbing. The picture is graded warm and graded in LINEAR, which is the only place a grade is a multiply rather than a wish: the gain is warmed and the lift is cooled BEFORE the tone curve, and the curve itself is a fit to the ACES output transform rather than the Reinhard divide it replaces. Reinhard has neither a toe nor a shoulder, and the shoulder is the whole reason a light reads as a light instead of a white disc with a hard rim - which matters more here than anywhere, because the subject of the room is forty floating lights. Warm orbs over cold water is also the oldest trick in colour film, and it is free: the orbs are tungsten by default and the water keeps the blue-green it gets from Beer-Lambert, so the two ends of the frame separate without a single hand-placed colour. Every tile in the building is a HEXAGON: a two-sublattice fold, a hexagonal norm for the joint distance, and the same box filter as before, decaying to the mosaic's duty cycle rather than to white, because a periodic grid seen edge-on averages to grey. Forty-seven controls: walk, lens, yaw and pitch, wander and turn, sway, cell size, wall density, closed chapels, arcade frequency and width, impost height, vault bay, arch point, rib density, ledge, water depth, ripple, flow, caustics, clarity, orb spacing, working orbs, orb height, orb size, colour temperature, brightness, dark zones, moths, swarm radius, haze, fog, four palettes, filmic curve, print warmth, mosaic scale, accent course, grime, damp, ambient occlusion, shadow, gloss, and four camcorder controls.

#blessedgeneratorraymarchliminalcathedralvaultgothicwatercausticsmothsprocedural3d
by deafadiluser_uploadmade with glslopCC0-1.0credit: CC0. A fork of THE POOLROOMS. Plan generation, footprint filtering and the light gather descend from the CC0 BACKROOMS shader; the vault, the orbs and the moths are original; the water is informed by but not derived from Alexander Alekseev's Seascape.activecreated 2026-09-10 02:04Z97 views0 forks47 params
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).