About
Implementation and exploration of Runevision's Surface Stable Fractal Dithering effect, with an outline shader for added clarity. SSFD aims to reproduce dithering filters found in games like Return of the Obra Dinn without the flickering artefacts when moving. To do so, we map the dithering directly onto the surfaces' UVs and scale them according to their viewport scale using a fractal pattern. As such, shades are represented by dot densities on the screen, and these dots are always the same size due to the fractal pattern.
Implementation
The implementation itself is well detailed on their video although I wrote my own report for the project. You essentially use a dither texture (or 3 for RGB) as a threshold you remap to 0 or 1, and then multiply or divide by 2^N its UVs depending on the rate of change of the UVs across the screen. To transition smoothly between the different levels of UV scale you use a 3D texture which transitions between N and N^2.
The outline is done quite simply using a G-buffer. We use both the normals and the depth to inform where lines should be drawn, upping the threshold with distance from camera.
Once you have the dithering effect, you can choose between dark dots on light background, where density symbolizes shade, and light dots on dark background where density symbolizes light. You can also use an actual texture on your surface and sample its albedo. Then, you pass the dithering effect 3 times, one for each channel, and offset slightly to one another. The result will be very reminiscent of how old printers deal with colour.
Limitations
I did notice many issues with this form of dithering. Being mapped on the surfaces, there is no good way of getting rid of angle artefacts. At an angle circles will be squished, aliasing will appear, the effect breaks. Outlines do help the issue by masking the steepest angles and improving clarity however.