ScaleNx - Artifact Removal and Algorithm Improvement

You need to actually sample the texture somewhere and call it ‘conColor’. Put this line right above the //overscan mask line: vec3 conColor = texture(Source, vTexCoord).rgb;

1 Like

Thanks, that did the trick.

still working on it guys, don’t worry. I’m gonna release the new version in both formats, cg and slang.

2 Likes

and here we go. without further ado, here is the new version in slang and cg!

DOWNLOAD https://mega.nz/#!SIpGhYQa!HJrQW4ko-RZf_zl-4WAk3sFM7va709VltTgwS9lVHRk

still need to do some code cleanup and create some of the other presets.

here are the noteworthy changes:

  • completely redesigned the weight function which determines the strength of an interpolation candidate. with it scalefx is now able to interpolate anti-aliased edges and at the same time limits itself in a smart way, so you can pretty much crank up the threshold value without creating much artifacts.

(due to the now more advanced weight function I needed to make use of full float frame buffers for the first two passes. if this should be a problem I could merge the first three passes together, which would result in a bigger kernel though and would have an impact on performance)

  • in hybrid mode ScaleFX and reverseAA are more intertwined now which minimizes the artifacts seen in previous versions. for the first time this should be a real option for games with prerendered graphics.

  • another thing: with the hybrid-preset ScaleFX is automatically DISabling the new “Filter AA” option, which is really the only time you wanna deactivate it. this way reverseAA can handle AA edges while ScaleFX is handling the rest. when using ScaleFX on its own, you wanna leave this option enabled.

  • new option “Filter Corners”. pixel corners that are not part of a staircase pattern can be left alone by disabling this option. this way the image is overall less smooth and rounded which one might prefer.

and here is an example of the hybrid mode in action:

whoa, that looks really great O_O

I’ll update the repo ASAP. I look forward to playing around with it!

here are some examples in motion.

1 Like

Damn this looks gorgeous! Now I am struggling in the decision of whether keep using my old-school CRT looks, or switch to this eyegasm setting.

I have all my shaders setup in presets to resolve this problem.

That way I get everything set up by ‘connection’ type.

RF Composite S-Video RGB Component HDMI

Most of those are favorites from the analogue shader pack

I use this Scale3nx as my HDMI preset though lol

Alright, should be up-to-date in the repos. I moved the old shaders and presets into scalefx/shaders/old, in case anyone depended on them for presets.

Some shots with my test image: new scalefx new hybrid old scalefx old hybrid

Thanks! Does the retroarch exe need to be updated again from 2 months ago in order to use (just got out of the slammer)? And Games like Final Fantasy 9 have flickering pixels on the video credits screen. Has that issue been solved (not a big deal though)?

Oof, sucks about the jailtime. Welcome back :slight_smile:

You shouldn’t need to update RetroArch, I don’t think, but you’ll want to update your shaders via the online updater.

I doubt the pixel flickering has changed but it’s worth checking, I guess.

Thanks :slight_smile: I’m having trouble telling from the pics which is the best version of scalefx with the updates. What visual differences does hybrid have over the original? I’ve wondered that for quite some time.

Hybrid is better for blended/antialiased stuff (think: PS1 background images), while regular is better for hard-edged cartoony stuff, like Super Mario Bros.

Ahh, ok. I see now. Thanks!

I’ve updated some of my scalefx presets (located in the cgp folder). New scalefx version is really better, congrats spookyfox for the great work.

I have also became a fan of the Hyllian’s jinc shader, gives a very nice touch to the colors. :smiley:

xsoft+scalefx-level2aa.cgp:

shaders = 8

shader0 = ../scalefx/shaders/scalefx-pass0.cg
filter_linear0 = false
scale_type0 = source
scale0 = 1.0
float_framebuffer0 = true

shader1 = ../scalefx/shaders/scalefx-pass1.cg
filter_linear1 = false
scale_type1 = source
scale1 = 1.0
float_framebuffer1 = true

shader2 = ../scalefx/shaders/scalefx-pass2.cg
filter_linear2 = false
scale_type2 = source
scale2 = 1.0

shader3 = ../scalefx/shaders/scalefx-pass3.cg
filter_linear3 = false
scale_type3 = source
scale3 = 1.0

shader4 = ../scalefx/shaders/scalefx-pass4.cg
filter_linear4 = false
scale_type4 = source
scale4 = 3.0 

shader5 = ../stock.cg
filter_linear5 = false
scale_type5 = source
scale5 = 2.0

shader6 = ../anti-aliasing/shaders/aa-shader-4.o-level2/aa-shader-4.o-level2-pass1.cg
filter_linear6 = true
scale_type6 = source
scale6 = 1.0

shader7 = ../anti-aliasing/shaders/aa-shader-4.o-level2/aa-shader-4.o-level2-pass2.cg
filter_linear7 = true
scale_type7 = source
scale7 = 1.0

parameters = "SFX_CLR;SFX_SAA"
SFX_SAA = 0.00
SFX_CLR = 0.60 

xsoft+scalefx-level2aa+sharpsmoother.cgp

shaders = 10

shader0 = ../windowed/shaders/jinc2-sharper.cg
filter_linear0 = false
scale_type0 = source
scale0 = 1.0

shader1 = ../scalefx/shaders/scalefx-pass0.cg
filter_linear1 = false
scale_type1 = source
scale1 = 1.0
float_framebuffer1 = true

shader2 = ../scalefx/shaders/scalefx-pass1.cg
filter_linear2 = false
scale_type2 = source
scale2 = 1.0
float_framebuffer2 = true

shader3 = ../scalefx/shaders/scalefx-pass2.cg
filter_linear3 = false
scale_type3 = source
scale3 = 1.0

shader4 = ../scalefx/shaders/scalefx-pass3.cg
filter_linear4 = false
scale_type4 = source
scale4 = 1.0

shader5 = ../scalefx/shaders/scalefx-pass4.cg
filter_linear5 = false
scale_type5 = source
scale5 = 3.0

shader6 = ../blurs/sharpsmoother.cg
filter_linear6 = false
scale_type6 = source
scale6 = 1.0

shader7 = ../stock.cg
filter_linear7 = false
scale_type7 = source
scale7 = 2.0

shader8 = ../anti-aliasing/shaders/aa-shader-4.o-level2/aa-shader-4.o-level2-pass1.cg
filter_linear8 = true
scale_type8 = source
scale8 = 1.0

shader9 = ../anti-aliasing/shaders/aa-shader-4.o-level2/aa-shader-4.o-level2-pass2.cg
filter_linear9 = true
scale_type9 = source
scale9 = 1.0

parameters = "JINC2_AR_STRENGTH;JINC2_WINDOW_SINC;JINC2_SINC;SFX_SAA;SFX_CLR"
JINC2_AR_STRENGTH = 0.30
JINC2_WINDOW_SINC = 0.55
JINC2_SINC        = 0.95
SFX_SAA = 0.00
SFX_CLR = 0.60

Yeah, JINC is really interesting. It works really well for texture filtering in cores, since it’s fast and simple, but it really makes a nice difference compared with bilinear or nearest.

EDIT: FYI, I got these presets (and the missing shaders they use) converted to glsl and slang formats and pushed up to their respective repos.

Cheers and tyvm!

The hybrid version also looks awesome with some games, it’s worth exploring it’s potential:

I will explore some scalefx9-hybrid combos, maybe they’ll look very nice. It’s definitely much better then the old hybrid.

1 Like

thanks! I’m still not that happy with some artifacts that occur with the hybrid-combination. scalefx and reverseAA don’t perfectly mix. I though about a postpass reverseAA variant that works on the already upscaled image but I haven’t came up with a good solution.still definitely better than the previous versioin. and I’d use some blur or smooth filter anyways in the case of using hybrid.

can anything be done shader wise with scalefx x9 with vulkan and psx beetle core to prevent retroarch from crashing when rez is set above x1?

In case anybody is wondering I’ve confirmed that this shader works on a Snapdragon 625 powered Android phone at full speed.