A mesh gradient rendered in WebGL, then quantised through a Bayer matrix so it reads as printed halftone rather than a blur. Every setting is live, and the panel underneath is the code for what you are looking at.

Dither backgrounds

WebGL

Field

Tone field
0.3

Drift of the tone field

0.25

Turbulence in the field

Grain

3

Size of one dither cell

3

Two is a hard cross-hatch

0.35

Warp applied to tone only

Colour

Palette
Mode
0.15

Where the dark end sits

0.85

Where the light end sits

Edit the code to change the preview