Having worked on graphics programming for more than a decade, I still didn't pick on that when I played the game. Considering the overall visual language of the game, I'd say it's 100 hours well spent.
Could have easily published this at SIGGRAPH under temporal coherence for non-photorealistic rendering.
For people who are unaware "Return of the Obra Dinn" and "Papers, Please" are both games by Lucas Pope and they are both considered absolute classics and have won multiple awards. Well worth checking out even if you don't consider yourself a typical game-enjoyer. They are not typical games.
Harsh 1-bit dithering is such an interesting topic - even in 2d there are multiple ways of doing it, each with trade-offs and advantages.
It is amazing to me that something that was so integral to the 80s computing experience is now actually quite tricky on modern hardware. For my own project[0] I found that it is almost impossible to ensure a one-to-one mapping between offscreen pixels and the canvas provided by the browser.
It looks like none of the proposed approaches work well, and the problem seems to be much more complicated that it looks.
I think what might work properly is:
- A "fractal" dither pattern so that it can be zoomed out and in smoothly and is scale invariant
- Doing things in texel space so that both camera movement and object movement works properly
- Doing bilinear filtering (perhaps keeping all samples instead of storing the weighted average) or perhaps supersampled rendering of the dithered pattern, and then using some sort of error diffusion pass in screen space (with a compute shader)
But not actually sure if this works in practice.
If that's not enough, an alternative would be to do things in screen space "naively", then reverse map the screen space rendering to texel space (in a resolution-preserving way), and use the information in texel space on the next frame to create a screen space solution compatible to the one in texel space, map it to texel space, etc., effectively building up the fractal per-texel pattern incrementally at runtime. This might be the best solution but seems very expensive in terms of memory, computation and complexity.
Went a bit further down the rabbit hole and found the previous devlogs he posted about the topic for anyone interested. [1] [2]
Of note was an upsampling algorithm called Scale2X he talked about. [3] Pretty neat !
One of the best write-ups on dithering that I've seen so far! I worked on the b&w dithering for Return to Dark Castle.
We wanted to use Atkinson dithering, but it was hard to do in a shader because of how neighboring pixel values trickle into each other, and I was super stressed and tired at the time. I don't think it occurred to us to pin the pattern to the offset of the scene, so I think there is twinkling on scrolling levels like the catacombs and helicopter pack. But maybe we did? I wish I could remember. Anyway, kudos!
I recently downloaded it from GOG and tried to play it on a 5K studio display. I wasn't able to get a result that did not blur those beautiful pixels, which is such a shame. Yes, I did go into all those setting menus.
I literally had no idea so much went into the dithering, my presumption was there was just an off the shelf posterization filter applied.
The end result looks fantastic and managed to give me wild nostalgia for playing games like The Manhole on my friends Macintosh Classic as a kid.
One of my favorite games ever, my wife and I played through it together. I feel like there's not a lot of games you can play with another person these days and playing it like that was a wonderful experience. I would highly recommend playing it with another person if you have the chance.
Stabilizing the Obra Dinn 1-bit dithering process (2017)
(forums.tigsource.com)525 points by CharlesW 8 November 2024 | 114 comments
Comments
Could have easily published this at SIGGRAPH under temporal coherence for non-photorealistic rendering.
It is amazing to me that something that was so integral to the 80s computing experience is now actually quite tricky on modern hardware. For my own project[0] I found that it is almost impossible to ensure a one-to-one mapping between offscreen pixels and the canvas provided by the browser.
[0] https://sheep.horse/2023/1/improved_web_component_for_pixel-...
I think what might work properly is:
- A "fractal" dither pattern so that it can be zoomed out and in smoothly and is scale invariant
- Doing things in texel space so that both camera movement and object movement works properly
- Doing bilinear filtering (perhaps keeping all samples instead of storing the weighted average) or perhaps supersampled rendering of the dithered pattern, and then using some sort of error diffusion pass in screen space (with a compute shader)
But not actually sure if this works in practice.
If that's not enough, an alternative would be to do things in screen space "naively", then reverse map the screen space rendering to texel space (in a resolution-preserving way), and use the information in texel space on the next frame to create a screen space solution compatible to the one in texel space, map it to texel space, etc., effectively building up the fractal per-texel pattern incrementally at runtime. This might be the best solution but seems very expensive in terms of memory, computation and complexity.
[1] https://forums.tigsource.com/index.php?topic=40832.260 [2] https://forums.tigsource.com/index.php?topic=40832.msg121719... [3] https://www.scale2x.it
I remember seeing early parts of his work on papers please and there is something wonderful about sharing your process and exposing it to feedback.
We wanted to use Atkinson dithering, but it was hard to do in a shader because of how neighboring pixel values trickle into each other, and I was super stressed and tired at the time. I don't think it occurred to us to pin the pattern to the offset of the scene, so I think there is twinkling on scrolling levels like the catacombs and helicopter pack. But maybe we did? I wish I could remember. Anyway, kudos!
https://www.youtube.com/watch?v=8qvdAWLcPyU
Found a new mantra for my life.
I literally had no idea so much went into the dithering, my presumption was there was just an off the shelf posterization filter applied.
The end result looks fantastic and managed to give me wild nostalgia for playing games like The Manhole on my friends Macintosh Classic as a kid.
One of my favorite games ever, my wife and I played through it together. I feel like there's not a lot of games you can play with another person these days and playing it like that was a wonderful experience. I would highly recommend playing it with another person if you have the chance.