From 731a4ab52e59ba2d5d36496c333c9d6bb6319e64 Mon Sep 17 00:00:00 2001 From: TimothyLottes Date: Tue, 8 Nov 2016 21:44:25 -0500 Subject: [PATCH] Add files via upload --- 20150930.html | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 20150930.html diff --git a/20150930.html b/20150930.html new file mode 100644 index 0000000..47c58b6 --- /dev/null +++ b/20150930.html @@ -0,0 +1,154 @@ +
+

20150930 - Tonemapping and Slot Mask Simulation

+
+This started a while back as a hobby project attempting to produce a better and more realistic non-real-time CRT simulation for print media such as the +The Bitmap Brothers: Universe book. +It ended with some interesting thoughts about tone-mapping and things which can be applied to real-time CRT simulation as well...
+
+Tonemapping +
+CRT simulation for low-dynamic-range media is mostly a tonemapping and filtering problem. +A CRT has a large amount of black surrounding some very bright phosphors, +and even more black for vintage arcade monitors which scan only half the fields but at twice the rate. +The challenge: how to maintain overall image brightness and still relay the feel of scan lines and tiny phosphors. It is a challenging problem. +
+
+There are some common methods of tonemapping in games and film, which fail on this problem, +and a solution which might provide some insight on improving tonemapping for games and film. +
+
+The most common tonemapping method for games is to tonemap RGB channels individually. +This is one of core reasons a majority of games have serious color distortion in the darks (often over-saturation) +as the ratios of the color channels are not preserved. +The Dec 2014 version of ACES, which is commonly referenced and applied for game engines has this problem. +
+
+Often the next evolution of this idea is to split tonemapping into separate operations for luma and chroma. +Typically the chroma is left alone with exception of the highlight compression area +where channel cross-talk is added (effectively a desaturation) so that brights over-expose to whites instead of clamping at pure primary and secondary hues. +Effectively RGB is converted to XYZ then to xyY, then Y (luma) is tonemapped, then xy (chroma) is pulled towards the white-point in areas of over-exposure. +This however suffers from a similar problem as tonemapping RGB channels individually. +While the chroma is preserved for a single pixel (better), +the extent to which the pixels brightness changes during tonemapping is a function of luma (bad). +
+
+Specifically luma is mostly effected by green, followed by a little red, and very little blue. +So two different pixels say one with only 0.25 of green, and one with only 0.25 of blue, get tonemapped very differently. +The blue hues fall off very quickly, the greens quite a bit later. +For CRT simulation this presents quite a problem, because often a source "pixel" is spread across +phosphors of pure primary color. +When tonemapping luma, the ratios of RGB are not preserved across the phosphor splats (multiple output pixels) which represent a source pixel. +This has a net result of making the darks look green as contrast is increased in the tonemapper. +
+
+The solution for CRT simulation tonemapping, is to instead tonemap max(R,G,B), then normalize RGB and scale to the tonemapped value. +This preserves RGB ratios across adjacent pixels representing phosphors of the same input pixel. +
+
+One aspect of CRT simulation tonemapping which does not apply to film or games, is that it is desirable with CRT simulation to avoid adding cross-talk on over-exposure. +This way the simulated phosphors maintain at pure hues.
+
+
+Slot Sharpness vs Loss of Brightness +
+I built a CRT simulation shader which can enlarge an image 16x in each dimension. +Showing stills below up to 16x enlargement and what a zoomed out view would look like. +The CRT simulation shader for each enlarged pixel accumulates the effect from the 7 nearest slots per color channel across two scan lines. +There are controls for tonemapping (exposure, contrast, clipping), scan-line thickness, scan-line horizontal sharpness, slots per source pixel, slot fall-off (controls slot sharpness), slot vertical gap, +and something which can provide a magnification projection of part of the image per slot (hack).
+
+The Metal Slug image example below shows roughly the limit of what can be done under an attempt to maintain slot sharpness at the expense of brightness. +The tonemapping is using roughly 4x increase in brightness to work around the slot mask, with 2x the contrast. +This tends to have a negative effect on the brights, squashing them. +
+
+Settings used in test app: 16 400 200 100 066 040 100 080 012 100
+
+
+
+
+
+
+
+Seeing the full size image (below) shows exactly why there is no great solution here. +The extreme tonemapping tends to expand out the very bright phosphors, +while the less light ones maintain a most of the feel of an individual slot. +But the trade off is a lack of ability to maintain the contrast or brightness of the source image.
+
+ +
+
+
+
+
+ +Slot Bleeding +
+This next selection of shots shows another compromise. +This time allowing the slots to bleed into each other increasing brightness. +To work around loosing the perception of slots, I increased the vertical gap between slots, to keep the perception at least of honeycomb layout of slot triplets. +This requires only a 3x increase in brightness, and drop to only 1.5x contrast in the tone-mapper. +I used the "magnification hack" setting to push the slots to be mostly filled or not filled. +Also increased the horizontal scan-line blur compared to the prior section. +
+
+Settings used in test app: 16 300 150 100 066 050 100 060 020 030
+
+
+
+
+
+
+
+
+ +
+
+ +Visible Scan-Lines and the Importance Of Adaptive Highlight Compression +
+This time I believe the shot might be from some version of R-Type? +Switching to visible scan-lines requires an increase in the slot-mask density (or CRT resolution). +Slot mask is almost non-visible in the zoomed out shot. +This example also allows some highlight clipping in the tone-mapping step, +which can grab back some brightness and dynamic range. +When a large amount of highlight tonality is reserved for large dynamic range which is never used, +the result tends to be a reduction of contrast or squashing of the highlights. +This suggests for games it is very important to smoothly dynamically adaptively adjust the highlight part of the tonal curve at run-time. +
+
+Settings used in test app: 16 300 150 030 025 060 160 040 030 100
+
+ +
+
+
+
+
+
+
+
+
+Estimating What Modern Games Would Look Like on Vintage CRTs +
+Just for fun I tried running some Star Wars Battlefront press screen shots through the filter. +Certainly no major game would ever ship with a CRT filter like this, +but I actually prefer the dropped resolution and slot mask as a way to hide the perfection of high-resolution GPU real-time renderings. +The result is certainly way less sharp, but effective super-sampling would still allow for effective aiming (fractional pixel movement changes pixel gradient). +Also in my case, the lack of information enables the mind to fill in the gaps resulting in a more believable scene. +
+
+ +
+
+
+
+
+ + + + +
+ + +