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 (27)
1.00
0.80
3.30
3.30
5.00
2.00
0.60
0.30
0.00
160.00
40.00
0.50
1.80
0.15
6.00
0.90
0.35
1.00
420.00
0.50
0.60
0.90
1.00
1.00
0.25
0.30
0.03
.fs source · isf not running

Metallurgy

#344dbnaf
⑂ fork it{ } json

The Markus-Lyapunov fractal, computed rather than drawn. Take the logistic map x -> r x (1 - x), the standing summary of how order becomes chaos, and let r alternate between two values A and B following a fixed binary word - ABAB, AABAB, AAAAAABBBBBB. Put A on the horizontal axis and B on the vertical, and at every point of the plane measure how fast two neighbouring orbits pull apart: lambda = lim 1/N SUM ln |f'(x_n)|. Where lambda is negative the orbit settles and the system is ordered, drawn warm; where it is positive neighbours separate exponentially - chaos, drawn cold and dark. Nothing comes from a distance field or a noise stack: every pixel runs its own small dynamical system a few hundred steps and reports the exponent it earned, so the lace, the nested swallows strung along the diagonal and the self-similar chains are all the period-doubling cascade seen from two directions at once. Two liberties, both dialable to zero. The A/B word is generated as a rotation word - symbol i is B when fract(i*stride/period + phase) lands inside an arc of length 1-duty - which at soft = 0 is exactly the classic binary word; open the soft slider and the arc's edge blurs, so r glides between A and B instead of snapping and the phase can then be turned continuously, morphing the fractal rather than cutting between sequences. That drift is the animation, and since one full turn of the word is period steps it closes on itself. The map slider cross-fades the logistic map into the sine map r sin(pi x)/4, which shares its range and has its own rounder portrait. Relief comes free: the four anti-aliasing taps double as a finite difference, so the height of the exponent field is had from a gradient that was already paid for. The metal slider then stops treating the palette as an albedo and treats it as a conductor - a real normal is built from that gradient and it reflects a small procedural studio of a dark floor, a cool sky and two soft strip lights. Strips rather than points on purpose: a band is what makes a curved surface streak instead of sparkle. A polished conductor returns most of what strikes it, so the palette is carried most of the way to white and kept as a tint on the reflection, which is what a metal's colour physically is; there is no diffuse term at all. Two more things ride on that reflection. Anisotropy brushes the metal along lambda's OWN contours rather than along some fixed direction - a groove acts as a tiny cylindrical mirror and smears the reflection across its axis, so taking the tangent from the level sets makes the grain follow the form the way a turned or spun surface does. And a thin film sits on top: light reflects both off the film and off the metal beneath, the two paths differ by 2*n*d*cos(theta), and each wavelength lands somewhere different on that difference, so some cancel and some reinforce. That is precisely what puts straw, purple and blue onto tempered steel, it is angle-dependent so the bands follow the curvature instead of sitting on the surface, and the film's depth is driven by lambda as well, so the colour maps the dynamics too. Recipes: the default is AABAB - period 5, stride 2, duty 0.60 at centre (3.3,3.3) span 0.80, where stride 2 is what interleaves the word rather than blocking it, since stride 1 at the same period and duty would give AAABB; AAABBB is period 6, stride 1, duty 0.50 at centre (3,3) span 2; classic Markus is period 2, stride 1, duty 0.50 at the same window - the iconic AB image, though two symbols is the one word length at which a drifting phase moves both onto the arc's edge together, so it dissolves to a plain gradient twice per cycle unless soft is set to 0; Zircon Zity is period 12, stride 1, duty 0.50 at centre (3.70, 2.95) span 0.62. Twenty-seven controls: speed, the window's span and centre on both axes, the word's period, stride and duty, word softness, the logistic-to-sine blend, iterations and how many are discarded as transient, the seed, separate saturation curves for the ordered and chaotic sides, seven palettes with a continuous cross-fade, a metal dial that turns the palette from an albedo into a conductor reflecting a procedural studio, anisotropic brushing, thin-film strength, film thickness in nanometres and a travelling swell in that thickness that sets the temper colours crawling along lambda's level sets - clocked to the same phase that turns the word, so it closes on the same loop, relief and the angle the room is turned to, anti-aliasing, exposure, bloom, vignette and grain.

#fractal#chaos#chaosgeneratorfractalchaoslyapunovlogistic-mapdynamical-systemsmathematics2d
by ksinwitnessed_generationmade with ClaudeCC0-1.0credit: CC0activecreated 2026-08-31 04:14Z130 views0 forks27 paramsClaude-opus-5
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).