I have noticed that whenever PICO-8 is in fullscreen, SDL2 applies a bilinear filter to it, making it blurry. It is more noticeable on Raspberry than it is in Windows (and I think in OSX is where it is the least noticeable). It is there in all platforms nevertheless.
You can see screenshots here. The picture has been reduced, but the effect has been preserved. As you can see, the bottom screenshot (fullscreen) is noticeably blurrier. You can "open image in a new tab" to see the original and the effect more clearly.
Shouldn't it be upscaling using "nearest neighbor" to preserve crisp pixels?
(These two have some additional blur because I have magnified them, but you can appreciate the difference)
Uneven pixels are in my opinion worse than slightly blurry pixels. I'd say the best thing would be if integer scaling could be used and it would resize to the biggest possible fit. So on a 1920x1080 screen it would scale the 128x128 image 8 times to 1024 x 1024 and leave the rest blank.
Mmmh, why not adding also a CRT-like filter/shader for compatible computers? It'd make a good complement to this retro-directed/inspired project, don't you think?
This is especially ugly when you have neighboring colors of different components, e.g. red and green. Due to gamma curves, you get dark lines in the middle of transitions.
If you could do a gamma-corrected upscale that might help, at least.
If Pico8 was hardware accelerated it would be easy enough to do NN filtering with supersapmling and gamma correction. Since it's all CPU based, and the upsampling is probably OS based or SDL provided it's probably a lot of work to change it.
If @zep is using SDL 2 then he can use:
https://wiki.libsdl.org/SDL_RenderSetScale
...for integer scaling
or
https://wiki.libsdl.org/SDL_HINT_RENDER_SCALE_QUALITY
...to force nearest neighbour scaling
Perhaps the best thing would be a combination of the two? As forcing nearest neighbour would give you odd pixels if the window was any scale other than an integer multiple.
Maybe the control/widget that maximises the window could instead cycle through valid integer scales? i did this with one of my older Mac & PC games.
For full screen it could set the largest integer scale for the current display? This could be done without the extra window control messing around I mention above.
I'd guess that it was much easier to just set Linear scaling and not have to worry about overriding the window controls or doing that extra logic.
[Please log in to post a comment]