Field 150 · The Making Of
How a single fragment shader turns two coherent point sources into a living pattern of constructive fringes and destructive nulls — and how three iteration passes made it read.
The concept / 01
Fresnel is a study in superposition. Two point sources ripple outward across a dark optical bench; wherever the path from one is a whole number of wavelengths longer than the path from the other, the crests reinforce into a bright antinode. A half-wavelength off, they annihilate into a black null.
The audience is anyone who has heard "the double-slit experiment" and never watched it move. The page's single job: make the invisible arithmetic of interference visible, tangible, and adjustable — drag a source and watch the fringe spacing breathe.
Palette / 02
The field is drawn in light on black, so the ground is nearly the darkest usable value and the accent is spent only where the physics is brightest. Body copy runs on a derived cool ink — never the teal line/mark colour — to hold contrast on the dark bench.
Type / 03
Clean, slightly technical geometry. The 800-weight wordmark carries the boldness; the 300-weight tagline stays quiet beneath it — one moment of scale bravery, disciplined everywhere else.
Every readout — wavelength, separation, fringe pitch — is set in tabular monospace so the numbers tick without reflowing. It reads as lab instrumentation, not marketing.
The signature / 04
A single full-screen triangle runs a fragment shader that, for every pixel, measures the distance to each source (d1, d2), computes each wave as amp · cos(k·d − ω·t) with a 1/√(1+d) falloff, and simply adds them. The instantaneous sum squared gives the shimmer; a fixed envelope |cos(½·k·(d1−d2))|² keeps the nodal hyperbolas permanently black so the fringes stay legible even in a frozen frame. Two uniforms carry the source positions; dragging rewrites them each pointer-move, and the whole pattern re-knits in real time. The wavelength slider maps to the wavenumber k, so shorter waves pack the fringes tighter. No three.js, no GSAP — raw WebGL.
Path difference Δr = r₁ − r₂ sets everything: bright where it equals a whole number of wavelengths, dark at a half-integer. The corner readout derives wavelength, source separation and angular fringe pitch live from the shader's own uniforms, so the panel and the picture can never disagree.
Iteration log / 05
Driving the signature immediately surfaced two silent defects that a load-only probe would have missed:
pointerdown — the sources looked draggable but weren't. Moved hit-testing to a window capture-phase handler in field-space, filtering out real links and inputs.steady + 1.7·inst, soft tone-map) so antinodes glow without clipping and nulls stay ink-black.u_grab uniform lifts its core glow ~70%, so the pixel you are dragging visibly answers the cursor.document.hidden, WebGL context-loss falls back to a CSS gradient.