3 ms·
If you find this interesting, you might also be interested in this video of someone diving even deeper into how to make the dither surface stable: https://www.y
by m12k 7mo ago
If you find this interesting, you might also be interested in this video of someone diving even deeper into how to make the dither surface stable: https://www.youtube.com/watch?v=HPqGaIMVuLs https://www.youtube.com/watch?v=HPqGaIMVuLs
- dpatterbee 7mo agoThis really is a fantastic video. I don't think I'd considered many of the ideas behind dithering before seeing how it could be extrapolated to this degree. The video ends in a place where I suspect even further advances could still be made.
- m12k 7mo agoThere's a follow up video with variations of the technique (some of them with color) demonstrated in a game: https://www.youtube.com/watch?v=EzjWBmhO_1E https://www.youtube.com/watch?v=EzjWBmhO_1E But yes, there's still the issue of oblique angles looking different that still remains open AFAIK.
- whtrbt 7mo agoVery cool! The dither is no longer in screenspace though, which kills the retro charm.
- m12k 7mo agoFair point, though I think that when it's low rez enough, it becomes less apparent that it's not in screenspace, and it gets closer to a retro look: https://youtu.be/EzjWBmhO_1E?t=102 https://youtu.be/EzjWBmhO_1E?t=102
- pvillano 7mo agoIMO, the holy grail of 3d dithering is yet to be achieved. runevision's method does not handle surfaces viewed at sharp angles very well. I've thought a lot about a method with fractal adaptive blue noise and analytic anisotropic filtering but I don't yet have the base knowledge to implement it.
- Retr0id 7mo agoMy take on it is to use some arbitrary dithering algorithm (e.g. floyd-steinberg, blue noise thresholding, doesn't really matter) for the first frame, and for subsequent frames: 1. Turn the previous dithered framebuffer into a texture 2. Set the UV coordinates for each vertex to their screenspace coordinates from the previous frame 3. Render the new frame using the previous-framebuffer texture and aforementioned UV coords, with nearest-neighbor sampling and no lighting etc. (this alone should produce an effect reminiscent of MPEG motion tracking gone wrong). 4. Render the new frame again using the "regular" textures+lighting to produce a greyscale "ground truth" frame. 5. Use some annealing-like iterative algorithm to tweak the dithered frame (moving pixels, flipping pixels) to minimize perceptual error between that and the ground truth frame. You could split this work into tiles to make it more GPU-friendly. Steps 4+5 should hopefully turn it from "MPEG gone wrong" into something coherent.
- femto 7mo agoDiscussed on HN in January 2025: https://news.ycombinator.com/item?id=42808889 https://news.ycombinator.com/item?id=42808889