diff --git a/20161101.html b/20161101.html new file mode 100644 index 0000000..fdf64dc --- /dev/null +++ b/20161101.html @@ -0,0 +1,81 @@ +
+

20161101 - Linear Dithering Before Transfer Function

+
+Source Material +
+Fine Art of Film Grain
+Grain and Fine Details
+Advanced Techniques and Optimization of VDR Color Pipelines - Link to GDC presentation on this page
+
+Extra Notes +
+The point of Fine Art of Film Grain +was to show how to take an artist generated grain texture, +specifically something which isn't a perfect repeating blue noise texture, +and make it energy conserving so it can serve double usage as video grain and dithering. + +Bart Wronski's Dithering Part Two - Golden Ratio Sequence, Blue Noise and Highpass and Remap +qualifies the frequency domain output of repeated highpass with remap used to reshape a poor quality noise. +The technique I use to generate an artistic grain texture is a little different, +I would do many repeated highpass passes, +and only at the end do one remap step. +
+
+Linear Dither Before Non-Linear Quantization +
+ +My VDR GDC presentation talked about this, +but the slides don't go into enough detail on why. +This as an alternative method of quantization to the traditional quantization in the non-linear output space. +Both have various cost/quality trade-offs. +
+
+ +In order for a dither to be energy conserving, +meaning not introduce any bias into the signal temporally, +on a still image, +the average of the output values over time should be the non-dithered input. +Best way to test this is to try to dither to 2-bits/channel on a color photograph with a temporal dither. +If the photo's contrast or saturation changes, then a bias had been introduced in the signal. +
+
+ +Near black, bias can also be a large problem. +To avoid any bias, over time, +any amount of positive dithering must be matched with a linearly equal amount of negative dithering temporally. +However the display and signal cannot reproduce negative luma. So dithering must be adjusted as image luma approaches zero (talked about around slide 95-96 in my GDC presentation). + +
+
+In a 2-bit/channel dithering ground truth test, a similar adjustment must be done to the whites. +However in practice I don't do the correction for whites with typical 8-bit output, +because I don't feel it is perceptually important. It is perceptually important in the darks, +and note be very careful here, because some displays like WRGB OLED TVs clamp a large range of darks to zero by default. +Evaluation of darks need to be done in a theater black ambient level room with a very low APL scene on a calibrated display which is actually capable of correct black output close to zero. +
+
+ +Hardware ROP rounds to nearest in the non-linear output space. +Linearly speaking, this rounding is biased where the bias changes based on the slope of the transfer function for the non-linear output space. +Likewise if a dither is added after the linear to non-linear transform, +then equal positive and negative dither contribution to that non-linear signal before quantization will also have bias +(which changes based on the slope of the transfer function). +
+
+ +While it is possible to correct for bias with dithering in the non-linear output space, +I find it excessively expensive to do so in real-time. +The solution I use instead is to introduce dither linearly with enough dither so that there are no bands of unchanging values, +and so that the final non-linear quantized value is temporally switching between at least 2-3 values. +Given the linear dithered value, +it is possible to do linear nearest quantization in the shader instead of letting the hardware do non-linear nearest in say a 10:10:10:2 non-linear output. +
+
+ +Lastly, when adding grain/dither linearly with output PQ2048 transfer functions, +an energy conserving asymmetrical grain distribution must be used (covered around slide 99 in my GDC presentation). + +
+ + +