gradient descent


Whether by choice or circumstance, we often find our lives thrust into uncertainty. We're resilient, though — we find patterns in the chaos, deciphering and unraveling it piece by piece until a new comfort emerges. `gradient descent` is my expression of that cyclical flow that comes to dominate our lives.

The piece starts with comfort, a smooth gradient chosen from a curated palette. As the animation runs, that gradient is mutated by a unique sequence of linear transformations - slice, skew or stride on an underlying grid - as it descends into uncertainty. After a time the animation will reverse, peeling back each transformation and returning to comfort before beginning anew.

The menu - which can be accessed with a double click or Escape - gives you extensive control of the experience. I'd encourage you to explore these settings — they transform the feel of the piece, allowing you to adapt it to match your environment or mood. Any setting that can be changed in the menu can also be provided as a URL parameter - there's a button in the menu to export them all.

Built with raw WebGL 1.0, optimised to run smoothly on most devices.

Best viewed in full screen on large format displays.

||| controls

[hold space] ⇝ speed up
[esc/2xclick] ⇝ toggle menu
[g] ⇝ toggle gallery mode
[p] ⇝ toggle pause
[s] ⇝ capture current frame
[a] ⇝ capture all keyframes
[8/9/0/-] ⇝ change viewport

||| settings

All settings are configurable via the interactive menu. Initial values can be set as url parameters by adding &[name]=[value] to the url.

loop [1|0, default 1]
| ⇝ loop the animation
infinite [1|0, default 0]
| ⇝ generate a new sequence after each descent, constantly evolving
gallery [1|0, default 0]
| ⇝ display in gallery mode with keyframes
quality [#, default 1]
| ⇝ additional dpr scaling - lower to improve animation smoothness
speed [#, default 1]
| ⇝ multiplier for step animation speed
step-pause [#, default 0.35]
| ⇝ seconds to pause between keyframe steps
start-pause [#, default 4]
| ⇝ seconds to pause at the initial keyframe
end-pause [#, default 4]
| ⇝ seconds to pause at the final keyframe

||| capture

Capture current frame saves the still immediately, while capture all keyframes saves each of the keyframes sequentially. Some browsers may require confirmation to save multiple stills. When triggered early, unrendered keyframes will be blank. All captures are impacted by the following settings.

capture-aspect [#, default 1]
| ⇝ aspect ratio of the capture, as width/height
capture-size [#, default 2048]
| ⇝ longest dimension of the captures to save, in pixels

NFT License, who? 2022
webgl engine based on lightgl by evanw

This page has been generated using fx_hash public API, to display an overview of a creator's collection from The computation of "rarity" is not the official computation and therefore can differ. Dev by @zancan.