neon alley

There is no standard illuminant for neon. The CIE standardizes light that falls on things; a neon sign is a thing you look at. So nobody ever froze one — and nobody needed to: the spectrum of a glowing gas is atomic physics, tabulated by NIST to more decimals than any standard. Every light in this alley is derived, not designed.

whitepoint pipeline naive RGB pipeline
sign — or click a sign in the alley
gas
kT — the model's one knob: Boltzmann excitation temperature; level energies do the rest
the output shader — emitted by the library, in this page, at load

This GLSL was generated in your browser just now by whitepoint/codegenxyz-d65 → oklch, the exact-cusp gamut maps for display-p3 and sRGB, and the managed srgb → display-p3 hop the naive path needs just to be displayed faithfully. Same constants as the JS; CPU/GPU parity is tested in CI to the last digit.


  

Same scene, same geometry, same lights. The naive side is what every web demo does: hand-picked sRGB hex, gamma-space mixing, channel-clipped output. The whitepoint side integrates NIST emission lines against the CIE observer at load time, lights the scene in XYZ, and finishes through the library's emitted shaders — OKLCH glow, exact-cusp gamut mapping, wide-gamut display-p3 out.


what's exact, what's approximate

This is not real-time spectral path tracing, and the page should say so. Here is exactly where the physics lives.

Exact: every (light, material) pair's diffuse response is the full spectral integral — SPD × reflectance × color matching functions — computed at load on the CPU (~60 integrals, microseconds). Spatial falloff is wavelength-independent, so the GPU only ever scales and sums those precomputed responses: for diffuse surfaces this is the physically correct answer, not an approximation of it. All conversion math — XYZ → OKLCH, the cusp gamut maps, the display transforms — is GLSL emitted by the library from the same constant table the JS uses, parity-tested in CI.

Derived, with a model: gas line positions and transition data (g·A, upper-level energies) are NIST ASD, fetched by a committed pipeline — but sign plasmas are not in thermal equilibrium, so line powers come from an optically-thin Boltzmann model with one effective parameter, the excitation temperature kT (the slider above; NIST's qualitative intensity column is deliberately unused — its values mix observation series with incompatible scales). Every gas lands in its known color region across the plausible kT range.

Plausible, honest-labeled: brick, asphalt, and paint reflectances — and the stained-glass dye transmittances — are Jakob–Hanika spectra solved from target colors: smooth and physically shaped, not measured. The sky is sodium streetlight scatter at rooftop level, not a sky model.

Aesthetic: bloom is a separable blur (linear-light XYZ in the whitepoint path, clamped gamma in the naive path — that contrast is the point), halos are additive quads, no interreflection, one bounce, no shadows. The argument this page makes is about the color pipeline, and that part routes entirely through shipped, verified library code.