Dithering Heights tests resolution-dependent perception: as spatial resolution drops, object identity depends more heavily on palette size and color separation. The same shadeless 3D model can remain readable or collapse into noise depending on the balance between pixel count, palette count, and dithering rule.

Source Model

Drag the small source window to rotate Chew on every axis.

Dither Output

loading Chew source...

Type
Toy note
Status
Active toy note
Published
2026-05-01
Canonical URL
https://shanecurry.com/lab/toys/dithering-heights/
Source asset
Chew GLB and hand-drawn texture from the ps1-devlog experiment archive
Implementation
Inline browser toy with local Three.js vendor files, no React runtime

The small source window shows a clean textured model. The large output window intentionally updates slower and at lower resolution, so thresholding, ordered patterns, and error diffusion become visible as different image-making behaviors. At 48 x 48 and below, 1-bit and Game Boy palettes lose much of the model's object separation, while NES RGB and RGB cube palettes preserve more readable parts.

Dithering is not just a filter. It is a decision rule for what can survive when color and resolution are constrained. A live 3D source makes that rule easier to see because the same model keeps moving underneath the reduction. The readout reports an illustrative nearest-color decision budget: pixel count multiplied by palette size, not a browser performance profile.

Source render
Shadeless MeshBasicMaterial, hand-drawn texture map, fixed camera, drag-to-rotate on yaw, pitch, and roll
Output cadence
4 fps dither pass, independent from the smoother source render
Algorithms
Threshold, ordered Bayer, Floyd-Steinberg, and Atkinson dithering
Palettes
1-bit monochrome, Game Boy 4-color, NES RGB 64-color, and RGB cube 216-color nearest-color palettes
Resolution
24 x 24, 48 x 48, 96 x 96, 144 x 144, or 192 x 192 before scaling to the square output window
Decision budget
Approximate nearest-color checks per dither frame: sampled pixels multiplied by palette colors
  • Source asset: ps1-devlog experiment archive.
  • The old project used React Three Fiber; this toy keeps only the Chew model, texture, and a small Three.js loader path.
  • The model is rendered without lighting so the hand-drawn texture remains the source signal.
  • The NES RGB palette is treated as a named emulator-style RGB table; stock NES video does not define one canonical RGB palette.

Shane Curry, "Dithering Heights," https://shanecurry.com/lab/toys/dithering-heights/, toy note, prepared 2026-05-01.

The big picture is worse on purpose. It is larger, slower, and less faithful, which makes the interpretation easier to inspect.