[HN Gopher] Ordered dithering with arbitrary or irregular colour...
___________________________________________________________________
Ordered dithering with arbitrary or irregular colour palettes
(2023)
Author : surprisetalk
Score : 76 points
Date : 2026-03-17 15:31 UTC (6 days ago)
(HTM) web link (matejlou.blog)
(TXT) w3m dump (matejlou.blog)
| vardump wrote:
| Are there other uses remaining for ordered dithering than retro
| look and perhaps e-ink?
| 0xMalotru wrote:
| Yep e-ink is a good practical use. In fact any system with
| black and white display use ordered dithering when they want to
| draw images
| Lerc wrote:
| I would think that it would only be beneficial on devices
| that don't maintain a full frame rendering buffer or if they
| wanted to do partial updates.
|
| If the full frame is maintained with more values then quite a
| lot of things like Floyd Steinberg optimize well enough to be
| integrated with a full frame update.
| krapht wrote:
| Lots of sensors these days will give you 10 or 12 bits of data
| per color channel. You may want ordered dithering when
| previewing on an 8 bit display.
| the8472 wrote:
| Shallow color gradients (e.g. blue sky or anime) result in
| visible banding on 8bpc displays, which is a large fraction of
| displays. Ordered dithering is GPU-friendly, so it's useful to
| reduce higher-bpc content to those display formats without
| introducing banding.
| chmod775 wrote:
| Light sources in video games and such. If you have a light
| source with a very large falloff range illuminating a large
| area, you'll have noticable steps in the gradient.
|
| Ordered dithering is a very cheap solution to this.
| account42 wrote:
| Wouldn't random noise be a more appropriate solution in that
| case?
| chmod775 wrote:
| Truly random per-frame noise looks bad and grainy (imho),
| but various noise functions work well, yes.
|
| Many implementations just sample some noise texture,
| possibly because that's cheaper - but hardware is so fast
| nowadays that even sampling some non-trivial noise function
| many times per pixel hardly registers.
|
| A deferred 2.5D renderer I wrote some while ago just does
| this screen-wide on the entire framebuffer in a post
| process step and that pretty much hides all banding
| already: vec2 fragCoord =
| gl_FragCoord.xy; float noise = fract(52.9829189 *
| fract(dot(fragCoord, vec2(0.06711056, 0.00583715))));
| resultColor += vec3((noise - 0.5) / 255.0);
|
| You might call this random noise (though it's static). It's
| enough if you're operating in high precision framebuffers
| for most rendering steps, and will do a decent job at
| hiding banding when things are downsampled to whatever the
| screen supports.
|
| If you can't afford to just rgba16float everything you
| might have to be smarter about what you do on an individual
| light level. Probably using some fancier noise/making sure
| overlapping lights don't amplify the noise.
| Kalabasa wrote:
| In video games or graphics, dithering can be an alternative to
| transparency. It's more performant too. I see this a lot in
| handheld consoles.
|
| As screen resolution and density increases, dithering could
| even replace transparency as long as you don't look close
| enough.
| kqr wrote:
| Any time you want a sequence to be deterministic, seem
| familiar, and also have a roughly even mix of element types.
| Think shuffling playlists, ordering search results, etc.
| geon wrote:
| Funny. I referenced this exact article yesterday and implemented
| N-Closest.
|
| There was a surprising amount of parameters to fiddle with.
| Especially since I experimented with adjusting the N depending on
| the distance of the matches.
|
| I wanted to implement ordered dithering to convert images to the
| c64.
|
| I think dithering looks best when there are only 2 colors
| involved the mix, but the palette is a bit wonky so a lot of
| colors are hard to represent well.
|
| An issue I noticed was that when the top 2 candidates in a
| gradient flipped from A,B to B,A as the gradient moved closer to
| B, was that the checker pattern would get an ugly seam of double
| pixels, like ABABABBABABA.
|
| I'll experiment more with manually selecting pairs of colors that
| mix well and generate gradient ramps from them. Then I can pre-
| quantize the image and use a predetermined dither pattern for
| each mix. Should also allow for more artistic control.
| anArbitraryOne wrote:
| I love dithering in a platonic way
| yehoshuapw wrote:
| Matt Parker video about dithering, worth a watch:
|
| https://m.youtube.com/watch?v=kT4p1GXq4HY
___________________________________________________________________
(page generated 2026-03-23 23:01 UTC)