As I said, very impressive work.
I'm still a bit skeptical about there being no banding at all in motion, but perhaps that is just GifCam as you say. ...
Technically, the bands will always be there unless adding way too much noise
to the signal. But since the eye has a finite resolving power, it suffices to
add only a certain amount of some specifically shaped noise to make the image
banding free with the noise being least objectionable. Well, that's at least
the goal.
The banding problem is actually two-folded. If the bit depth is very low, then
one can see the bands produced by the pattern itself, if the pattern is small.
For, any pattern can only reproduce so many shades. As you know, a 2x2 Bayer
pattern can only produce 5 halftones (shades). These halftones can't be
covered unless introducing some sort of random (breaking the pattern). On high
bit depths these halftones (4x4 is used a lot) may already suffice to hide the
quantisation bands and also to hide the bands of the pattern itself taking
human perception into account (integration).
... When working at very low resolutions and bit-depths, I can see where you would want something that is say 95% banding-free and low noise, vs 2LSB TPDF dither which is 100% banding free but high noise. ...
Indeed. By adding noise to the signal everything can be hidden, even the
signal! xD The only question is, after having done all other stuff; how to
hide the damn noise?
... When dealing with high resolutions and in a demanding 3D game, I would think that a relatively simple TPDF dither solution might be preferable to a computationally expensive error diffusion technique. ...
Sure. Error diffusion is out of the question, for, it produces some good
artifacts, flickers when used in animations (see many of the (ugly)
animated-gifs), and is computationally cumbersome (but various optimization
exist). But, well, error diffusion isn't the end of the story considering
diffusion techniques. As I wrote in a previous post, pointelism (another
diffusion technique) is far superior. Question is: how to make it fast?
... At the same time, I don't know if the noise which is added by TPDF dither is necessarily a bad thing either. A lot of developers add a "film grain" filter on top of their image, and TPDF dither would typically show much less noise than that when you're dealing with converting say a 16-bit buffer to an 8-bit or 10-bit output. The higher the bit-depth, the less visible the noise is. ...
When going for a grainy look TPDF may do the job esp. at higher bit depths.
But looks odd when doing color dithering.
However, most of the issue reoccur if the HDR shades get very dark. It's in
the dark region where you will see the noise/bands much more again, which is
basically the problem here (thread). For one, you need a good noise function
to hide the quantisation but that noise function also needs to stay less
visible on its own, which can only be realized sufficiently when taking human
vision into account, for, the eyes' spatial frequency response isn't uniform
across the retina, it detects higher frequency components in the diagonal to a
much lesser degree, which is also the reason why most patterns (see offset
printing (color black), the Bayer patterns >=4x4 etc.) are rotated by 45
degrees making the pattern less visible to the eye. Doing so basically amounts
to noise shaping (like in music), but done here in 2d. The noise/whatever is
shaped in such a way that it produces less artifacts. For the classic patterns,
i.e. the Bayer pattern (class: dispersed-dot ordered dithering) it was proven
by Robert Ulichney (see: Digital Halftoning) that these patterns are optimal
for the given class in producing the least amount of artifacts for the eyes.
That's the reason why the Bayer patterns have all these crosses (x, 45 degrees)
in there, because a cross is less objectionable to the eye whereas a plus (+)
is. Any other pattern within that class will produce more objectionable
artifacts.
The same principle is applied to any other method. TPDF is just one way to
shape the noise (away from white noise). And there are million ways to shape
noise or any other signal for that matter. However, the eyes (like the ears)
have limits and it is perhaps best to shape the noise in such a way that it
becomes less objectionable to the eyes, producing better dithering if done
rightfully. Doing so involves a 2d Fourier analysis of the pattern/signal
and matching it with the eyes. The work of Robert Ulichney (Digital Halftoning)
shows how all this works. And if you look closely, you will see that the
pattern produced via diffusion and patterns on hexagonal grids have some very
interesting power spectra.
Second. Another issue usually not address is the Weber/Fechner law (TVI,
threshold vs. intensity). That is to say; with respect to human vision,
uniform quantisation makes no sense. You will waste a lot of bits for shades
you can't really distinguish that well. Hence, it's better to spend more bits
for the dark shades than for the bright ones, because jumps in bright shades
aren't that much objectionable to the eye due to the Weber/Fechner law
underlying human vision. That's also the reason why we don't need 16 bit HDR
TVs, for, 12 bit (see: Dolby Vision) suffices for the human eye given the
quantizer is based on human vision.
None if this was addressed in the paper posted above. So there is a lot left
on the table to further improve/suppress banding in games.
... I think we can all agree that this is something which many developers have been overlooking and it results in very ugly artifacts which shouldn't be there - especially when their rendering pipeline is using buffers with high internal precision to do things like HDR lighting. (and now HDR output)
Overlooked? Nope. Today's programmers were rise by a 24 bit framebuffer!