flycast
flycast copied to clipboard
[Bug/All platform/All renderer] Upscaling problems with Capcom & SNK games (only on higher resolution)
Follow up from the issue in the old repo https://github.com/libretro/flycast/issues/818
After 3 years, I finally was able to build cores myself in order to find the culprit.
Culprit ---> https://github.com/libretro/flycast/commit/a2137ce23b71b3d13857a770a6f13e6e68158850
https://github.com/libretro/flycast/commit/bc5be5e69510376a5a24bfef19fce3286b0921aa Last working build.zip
Examples : Chun-Li's standing pose in CVS 1/PRO at 1280x960 (integer multiple of 640x480, you'll see stripes on non-integer multiple)
Correct Chun-Li : https://github.com/flyinghead/flycast/assets/47425204/046de5a6-140d-43d7-bd16-d79cc686b4fa
Warped Chun-Li (today's latest core) - Her shoulder is increasing and decreasing : https://github.com/flyinghead/flycast/assets/47425204/38d775d4-851e-4069-8301-e3c1b2316f44
This only happens on Capcom characters (thus no SNK characters are affected) in CVS because their sprites comes from the CPS2 with a strange ratio, it also happens on all characters from MVC2.
Why is upscaling important for these 2D games ?
- Sprites from CPS2 have a weird resolution of 384×224 (4/3 non pixel perfect) which doesn't translate well with the Naomi resolution of 640x480 (pixel-perfect 4/3), thus they are horrible at native with pixels from hell
- MVC2 has 3D stages
- CVS has 3D elements in the UI
This is a very minor glitch and you have several workarounds: don't upscale or upscale by an integer multiple.
The commit you mention helps avoiding some of these issues, which are by far more severe and affect many games:
This is a very minor glitch and you have several workarounds: don't upscale or upscale by an integer multiple.
The commit you mention helps avoiding some of these issues, which are by far more severe and affect many games:
Sorry I wasn't clear enough.
Upscaling by integer doesn't solve it at all, it's not warping at native and that's it but the game is ugly at native unfortunately.
Integer multiple only helps with stripes but the warping is always there after this commit.
Thanks anyway.
I built a core without the bleeding edge fix and the games are perfect in 4K.
This helped me found other games suffering from this issue :
- KOF2000 + KOF2001 + KOF2002
- Garou Mark of the Wolves
- Street Fighter W Impact
To be fair, those SNK games doesn't really benefit from upscaling as Native is already perfect (SNK didn't use strange resolution on Neo-Geo).
I gave a custom name to that core and will play those specific games like that.
I know that it's not urgent at all but would you consider adding a option like that ?
- Fix Upscale Bleeding Edge = ON (default option)
I would thus be able to disable it for those specific games.
Merci beaucoup pour ton temps :).
Same image issue, using 1280x960 internal rendering resolution (2x integer upscaling), game:mvsc2 + wild screen hack。 I also tried the repair build on the first floor, and the issue was alleviated, but it did not disappear completely.
![]()
![]()
![]()
Same image issue, using 1280x960 internal rendering resolution (2x integer upscaling), game:mvsc2 + wild screen hack。 I also tried the repair build on the first floor, and the issue was alleviated, but it did not disappear completely.
-
Please try my latest build here https://github.com/Immersion95/flycast/actions/runs/6443085776
-
Disable Widescreen hack
-
You can also try higher resolution
I don't have any glitch like you with widescreen disabled.
Just tested your build, it works!!! (only ryu's super seems to have a bit of a break, but much less) Finally! Using it with CRTEmudriver (2560 superes output with 2560x1920 internal rendering), libretro core version for easy CRT output, looks absolutely breathtaking to have the horizontal so clean. Tried both 480p and a forced custom 224p (makes the scanlines match character sprites exactly, slight bit of vertical filtering through a shader to make high res elements cleaner).
There's so much detail now! Thank you, please have it merged into main!
Just tested your build, it works!!! Finally! Using it with CRTEmudriver (2560 super res with 4x internal rendering), libretro core version for easy CRT output, looks absolutely breathtaking to have the horizontal so clean. Tried both 480p and a forced custom 224p (makes the scanlines match character sprites exactly, slight bit of vertical filtering through a shader to make high res elements cleaner).
There's so much detail now! Thank you, please have it merged into main!
Thanks ! Don't forget to change the texture filtering to Nearest when you upscale.
Thank you for the buid you provided. If you didn't have the Sharingan, might not be able to detect the subtle pixel jitter of the sprites.Since most of the images in cvs1 are at the native resolution, I think the only game that is really affected is mvsc2. Before flycast merged , this game had been set to this dedicated lib core.Now I'm trying to see if cvs2 is also affected.
@flyinghead : Hi, I would like to add this option in the settings myself.
While I'm searching, would it be possible to give me a rough summary on how to do it ? If you can't, I will try to find a way, thanks anyway !
You can add it as an option in core/cfg/option.cpp
and core/cfg/option.h
. Something like this:
option.h:
extern Option<bool> FixUpscaleBleedingEdge;
option.cpp:
Option<bool> ShowFPS("rend.FixUpscaleBleedingEdge", true);
From there, you can wrap your code changes in a conditional like if (config::FixUpscaleBleedingEdge) {}
.
From there, the option will be shown in your emu.cfg
file, and you can adjust it there. If you want to add it to the Settings UI, head to core/rend/gui.cpp
and add the option in the gui_display_settings()
function.