How can I make vector games look good in retroarch?

I’m wondering if anyone has any tips to make vector games look good in retroarch, I’ve used standalone mame for these and gotten good results, but I would really like to be able to run them through retroarch to leverage the shader pipeline.

When I run it through one of the mame cores in retroarch I get something like this which looks like the core is outputting a 240p source

Any tips or recommended cores would be much appreciated!!!

1 Like

Yeah, it just outputs at 240p by default, which sucks. You can use the alternate render option to get a bigger image, but that screws up the shaders and thereby negates the whole point of what you’re wanting to do. (there is a passable vector shader that works with the alternate render method, though, if you want to check it out)

IIRC, there was a successful bounty to support high-res vector games on at least one of the mame cores, probably 2003.

Since we only do postproc, we can’t do some of the cool/fun stuff that mame’s own shaders can do, since they’ve provided hooks to know, for example, the endpoints of a line, so you can make them brighter, etc.

2 Likes

You can change crt gamma to 1.0 with vector games and keep 2.2 LCD gamma. Also I suggest to use blur-gauss-v and blur-gauss-h shaders coupled with glow,diffusion etc . It doesn’t look like a vector tube at all but it’s better than without shaders :grin:. Here’s some screenshots with 3 different shaders.

4 Likes

I mostly agree with @ProfessorBraun. The best scaling algorithm for vector gfx. might be plain ScaleFX though, since it can handle up to level 6 slopes. But it really depends how much effort is put into the preset. Regardless, i strongly agree with the glow effect.

3 Likes

FBNeo also got some support for hi-res through dipswitches, it only supports a few vector games though (bwidow, gravitar, spacduel, and tempest), basically the dipswitch enable a 1080p mode (default for vector games in FBNeo is 600p).

2 Likes

I’ll improve FBNeo’s Hires support in the next few days, i just noticed we actually support other vector games (actually, most of them ?), and my code for bwidow/gravitar/spacduel was scaling to the wrong res (1440p, which seems to be a problem with RA if it’s also used for viewport on a 1080p screen ?).

5 Likes

Thanks everyone for your helpful suggestions!

@ProfessorBraun Do you mind sharing your presets for these? #1 and #3 have a nice feel to them :slight_smile:

2 Likes

Yes sure, 1st shader is a custom Crt-Royale so my preset won’t work with your files,when I have time I’m gonna make a zip file and upload everything. But I have another preset.

shaders = "10"
shader0 = "shaders_slang/crt/shaders/guest/lut/lut.slang"
filter_linear0 = "false"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = ""
float_framebuffer0 = "false"
srgb_framebuffer0 = "false"
scale_type_x0 = "source"
scale_x0 = "1.000000"
scale_type_y0 = "source"
scale_y0 = "1.000000"
shader1 = "shaders_slang/crt/shaders/guest/color-profiles.slang"
filter_linear1 = "true"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = ""
float_framebuffer1 = "false"
srgb_framebuffer1 = "false"
scale_type_x1 = "source"
scale_x1 = "1.000000"
scale_type_y1 = "source"
scale_y1 = "1.000000"
shader2 = "shaders_slang/crt/shaders/guest/d65-d50.slang"
filter_linear2 = "true"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
alias2 = "WhitePointPass"
float_framebuffer2 = "false"
srgb_framebuffer2 = "false"
scale_type_x2 = "source"
scale_x2 = "1.000000"
scale_type_y2 = "source"
scale_y2 = "1.000000"
shader3 = "shaders_slang/crt/shaders/guest/afterglow.slang"
filter_linear3 = "true"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
alias3 = "AfterglowPass"
float_framebuffer3 = "false"
srgb_framebuffer3 = "false"
scale_type_x3 = "source"
scale_x3 = "1.000000"
scale_type_y3 = "source"
scale_y3 = "1.000000"
shader4 = "shaders_slang/crt/shaders/guest/avg-lum.slang"
filter_linear4 = "true"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "true"
alias4 = "AvgLumPass"
float_framebuffer4 = "true"
srgb_framebuffer4 = "false"
scale_type_x4 = "source"
scale_x4 = "1.000000"
scale_type_y4 = "source"
scale_y4 = "1.000000"
shader5 = "shaders_slang/crt/shaders/guest/linearize.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = "LinearizePass"
float_framebuffer5 = "true"
srgb_framebuffer5 = "false"
scale_type_x5 = "source"
scale_x5 = "1.000000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/blurs/blur-gauss-h.slang"
filter_linear6 = "true"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = ""
float_framebuffer6 = "true"
srgb_framebuffer6 = "false"
scale_type_x6 = "source"
scale_x6 = "1.000000"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/blurs/blur-gauss-v.slang"
filter_linear7 = "true"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = "GlowPass"
float_framebuffer7 = "true"
srgb_framebuffer7 = "false"
scale_type_x7 = "source"
scale_x7 = "1.000000"
scale_type_y7 = "source"
scale_y7 = "1.000000"
shader8 = "shaders_slang/crt/shaders/guest/linearize_scanlines.slang"
filter_linear8 = "true"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
alias8 = ""
float_framebuffer8 = "true"
srgb_framebuffer8 = "false"
scale_type_x8 = "source"
scale_x8 = "1.000000"
scale_type_y8 = "source"
scale_y8 = "1.000000"
shader9 = "shaders_slang/crt/shaders/guest/crt-guest-dr-venom.slang"
filter_linear9 = "true"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "false"
alias9 = ""
float_framebuffer9 = "false"
srgb_framebuffer9 = "false"
scale_type_x9 = "viewport"
scale_x9 = "1.000000"
scale_type_y9 = "viewport"
scale_y9 = "1.000000"
parameters = "TNTC;CP;CS;WP;wp_saturation;SW;AR;PR;AG;PG;AB;PB;sat;lsmooth;GAMMA_INPUT;TATE;IOS;OS;BLOOM;brightboost;brightboost1;gsl;scanline1;scanline2;beam_min;beam_max;beam_size;h_sharp;s_sharp;csize;bsize;warpX;warpY;glow;shadowMask;masksize;vertmask;slotmask;slotwidth;double_slot;mcut;maskDark;maskLight;CGWG;gamma_out;spike;inter;interm;bloom"
TNTC = "0.000000"
CP = "0.000000"
CS = "0.000000"
WP = "0.000000"
wp_saturation = "1.000000"
SW = "1.000000"
AR = "0.070000"
PR = "0.050000"
AG = "0.070000"
PG = "0.050000"
AB = "0.070000"
PB = "0.050000"
sat = "0.100000"
lsmooth = "0.900000"
GAMMA_INPUT = "2.500000"
TATE = "0.000000"
IOS = "0.000000"
OS = "0.000000"
BLOOM = "0.000000"
brightboost = "4.000000"
brightboost1 = "1.000000"
gsl = "0.000000"
scanline1 = "1.000000"
scanline2 = "5.000000"
beam_min = "2.000000"
beam_max = "2.000000"
beam_size = "0.000000"
h_sharp = "20.000000"
s_sharp = "0.000000"
csize = "0.000000"
bsize = "600.000000"
warpX = "0.000000"
warpY = "0.000000"
glow = "0.500000"
shadowMask = "-1.000000"
masksize = "1.000000"
vertmask = "0.000000"
slotmask = "0.000000"
slotwidth = "2.000000"
double_slot = "1.000000"
mcut = "0.000000"
maskDark = "1.000000"
maskLight = "1.000000"
CGWG = "0.000000"
gamma_out = "2.200000"
spike = "0.000000"
inter = "800.000000"
interm = "0.000000"
bloom = "0.000000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/lut/sony_trinitron1.png"
SamplerLUT1_linear = "true"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT1_mipmap = "false"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/lut/sony_trinitron2.png"
SamplerLUT2_linear = "true"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT2_mipmap = "false"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/lut/other1.png"
SamplerLUT3_linear = "true"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT3_mipmap = "false"

It only works with FBNeo and Hi-res mode dipswitch “on”. It won’t work with Mame (libretro), for that one I need to lower input gamma and do other tricks so I’ll stay with FBNeo for the moment (for vector games). @guest.r Hey nice idea with ScaleFX , I’m curious to see how it looks. Your afterglow shader + ScaleFX could be good for vector games.

4 Likes

On a sidenote, now all FBNeo’s vector games have their Hires 1080p mode, and it seems FBNeo supports every vector games apart those from Cinematronics hardware.

7 Likes

That’s awesome news!

1 Like

Thank you for this. I have created a slangp file with it BUT in RetroArch I get a failed-to-apply error message. I have checked the .slang files referenced paths and they are OK. What else may I need to check in order to have the shader up?

Thank you

2 Likes

Hey :slight_smile: I’m not sure but load guest dr-venom preset first,after that you can change blur horizontal and vertical passes with blur-gauss-h and blur-gauss-v,apply. And finally copy paste my preset.

2 Likes

I find myself in the same boat as the OP here. I originally discovered Retroarch via RetroPie and now use the standalone Retroarch as my main emulation setup on my PC. I only play a few vector games, and the standalone version of MAMEUI does a decent job of approximating a vector monitor via D3D11 and HLSL. Unfortunately, the two slang vector shaders that I find in Retroarch currently provide passable, but ultimately unsatisfying results when compared to the former. vector-glow-alt-renderer.slangp currently provides the best results for me within Retroarch, but again the standalone HLSL shader is subjectively “better” IMO. My question is twofold. 1) is it possible to port the HLSL shader into a future iteration of RA in the same way as has been done with the MAME NTSC CRT HLSL shader? Failing that, are there any good tutorials on writing one’s own shader chain preset file using the resources already included in RA’s slang library?

2 Likes

When I ported the rest of it, I recalled the vector stuff needing some hooks into the program itself to provide information about the vectors, but now that I just looked at it, it doesn’t seem so bad, so maybe I’ll take another stab at it.

3 Likes

Thank you and great work on the CRT portion BTW. Looking at the shader parms for the former, it was incredibly easy to identify what I was looking at, and I remember saying to myself, if someone could do this for the vector portion, we would really be able to lay a shellacking on the Empire! So may the Force be with you. :wink:

4 Likes