TIL from «Acerola»’s «Making an Inktober Shader»: a one-bit dither is a single comparison. If a pixel is brighter than the noise at the same spot, it’s on. Otherwise it’s off.
In my Shadertoy that’s one line (lum is luminance):
fragColor = lum(image) > lum(noise) ? vec4(1.0) : vec4(0.0); The noise makes neighbouring pixels flip at slightly different brightnesses, so the eye reads the density of “on” pixels as tone.
Which noise matters. White noise clumps into maze-like patterns. Blue noise (CC0 tiles by Christoph Peters) keeps its energy in the high frequencies, so the dots spread out evenly.
The hero at the top runs the same shader with blue noise. Change the noise scale, invert ink and paper, drop in your own image, or export a PNG at the image’s full resolution.