Dither
Apply dithering to reduce value precision while preserving perceived density.
What it does
Dither reduces an image to a small number of value levels per channel while holding the impression of the original gradient, trading smooth tonal steps for fine noise that reads as continuous at a distance. Two families of method are available: ordered patterns (Bayer, Blue Noise, White Noise) threshold each pixel against a repeating tile, and error-diffusion methods (Floyd-Steinberg through Sierra-Lite) carry each pixel's rounding error forward into its neighbours for a softer result.
Ordered methods can borrow a halftone or line pattern shape instead of the Bayer grid, and can pixelate the source into blocks before dithering. Dither also runs on a Collection's per-point colour or scalar attribute, using each point's position to drive the same threshold pattern.
When to use it
Cutting an image to a handful of colour levels while preserving a smooth gradient: posterisation without the banding.
Retro, print or pixel-art looks: halftone dots, cross-hatch lines, a chunky pixelated grid.
Stipple or newspaper-print styles, with Floyd-Steinberg or another error-diffusion method.
Dithering a point cloud's colour or density attribute rather than a flat image.
| Parameter | Type | Default | What it does |
|---|---|---|---|
content_in | Raster or Collection or GPU Geometry or Geometries | — | — |
method | String | "Bayer" | Ordered (Bayer/Blue Noise/White Noise): fast per-pixel dither. \ Error Diffusion (Floyd-Steinberg ... Sierra-Lite): wavefront-parallel \ residual diffusion (slower, higher quality). One of: Bayer, Blue Noise, White Noise, Floyd-Steinberg, Atkinson, Jarvis-Judice-Ninke, Stucki, Burkes, Sierra3, Sierra2, Sierra-Lite. |
levels | Number | 4 | Number of discrete levels per channel (2 = binary, 256 = no reduction) |
matrix_size | String | "4x4" | Size of the Bayer threshold matrix (larger = finer pattern). One of: 2x2, 4x4, 8x8. |
strength | Number | 1 | Intensity of the dithering effect (0 = no dither, 1 = full) |
pattern | String | "Bayer" | Threshold pattern shape. One of: Bayer, Halftone Dot, Halftone Diamond, Halftone Ellipse, Line Horizontal, Line Vertical, Line Diagonal, Cross-hatch. |
pattern_scale | Number | 1 | Size of the pattern tile in pixels. 1.0 = 1:1 pixel grid, larger = coarser pattern. |
pattern_angle | Number | 0 | Rotate the dither pattern (degrees). |
pixelate_input | Boolean | false | Snap the source sample to each pattern_scale block so the output is chunky/pixelated instead of letting full-resolution detail show through. |
pattern_texture | Raster | — | Custom threshold pattern image. Luminance becomes the dither threshold. |
threshold_bias | Number | 0.500 | Shift quantization center. 0.5 = neutral. Lower = brighter, higher = darker. |
per_channel | Boolean | false | Enable separate dither strength per RGB channel. |
strength_r | Number | 1 | Dither strength for red channel |
strength_g | Number | 1 | Dither strength for green channel |
strength_b | Number | 1 | Dither strength for blue channel |
mix | Number | 1 | Blend between original (0) and dithered (1). |
temporal_mode | String | "Static" | Static: same pattern every frame. Animated: pattern varies per frame. Stable: content-aware coherence. One of: Static, Animated, Stable. |
attribute | String | "Cd" | Attribute to dither when the input is a Collection. Search or pick from the input's float/colour/vector attributes, or type a name. |
attribute_type | String | "Color" | Channel layout of the attribute being dithered. Color dithers RGB (e.g. Cd); Scalar dithers a single float (e.g. density, alpha). Collection attribute widths aren't known at build time, so this is explicit. One of: Color, Scalar. |
spatial_strength | Field | — | Spatial field controlling where the effect applies (0=bypass, 1=full) |
Gotchas
Ordered methods (Bayer, Blue Noise, White Noise) and error-diffusion methods (Floyd-Steinberg, Atkinson, Jarvis-Judice-Ninke, Stucki, Burkes, Sierra3, Sierra2, Sierra-Lite) work differently. Pattern, Pattern Scale, Pattern Angle, Pixelate Input and Temporal Mode apply to ordered methods only, and are ignored once an error-diffusion method is selected.
On a Collection input, points or a mesh, error-diffusion methods have no scanline to diffuse across and fall back to Bayer silently. Pixelate Input is raster-only as well: each point carries only its own attribute value, so there is no neighbouring pixel to snap to.
Per-channel strength pushes the dither harder on one colour channel than another, which keeps shadows or a dominant colour clean while the rest roughens. Threshold Bias is separate: it shifts the rounding centre rather than the strength, down to bias the result brighter, up to bias it darker.
Worked example
Add a Dither node and feed it an image.
Drop Levels to 2–4 for a strong posterised look, or keep it higher for a subtler reduction in value precision.
Try Bayer first for a fast, regular pattern, then switch Method to Floyd-Steinberg for a softer stipple.
With an ordered method selected, raise Pattern Scale for a coarser tile, or switch Pattern to Halftone Dot for a print-style look.
Enable Pixelate Input to snap the source to the pattern grid for a chunky, low-res result.
Bring Mix down from 1 to blend the dithered result back with the original image.