Shader Challenge: composite video on a PVM

Instead of trying to Extract, you can open the archive using Windows Explorer or 7zip and copy then paste. You could also try copying the archive to a root drive or folder then copying and pasting the contents there.

1 Like

I took a quick look and I’m fairly sure that it’s a combination of the mask and resolution that’s making the artifacts less noticeable. How does it look when you remove the mask?

I haven’t noticed anything unusual here comparing with the standard settings, but with genesis etc. games negative values are to be used. Sometimes it looks like the blend isn’t 100% smooth, but this is mostly not an adaptive sharpening issue.

Standard ntsc:

Adaptive sharpening at -5.0:

I’ll also make a remark that NES/SNES games are triggering 3-phase filtering with ntsc shaders, which don’t fully blend dithering. You must force 2-phase mode for the full effect.


@Cyber I can’t actually get the presets to load although I’ve followed the installation instructions. Would you mind posting a shot of the NTSC preset from the screenshot above without the mask so we can really see what’s going on?

1 Like

Hmmm…this is strange. I wonder why.

I don’t mind but it might be a little later. I’m not even on Mega Bezel Reflection Shader v1.7.0 anymore so those presets may not look identical so I’ll have to revert first.

In the meantime, do the HSM Mega Bezel Reflection Shader base presets load fine for you? Especially the GDV-NTSC ones? You should be on version v1.7.0 if you would like to view these properly.

Just realized that I used the version without the graphics but the preset is supposed to be virtually identical apart from settings to fit the graphics and some slight curvature.

CyberLab_NES_Composite_Slot_Mask_IV_OLED_NTSC sans Mask

Slightly tweaked version of the same preset.

Further tweaked version of the same preset.

Varying levels of sharpness.

NES NTSC Artifacts still intact.

…and getting closer to this reference pic:

1 Like

I’m still seeing some very unpleasant edge artifacts, unfortunately. I think you’ve done about as good a job as possible with the tools that are available.

And yes, I’m using the most recent Mega Bezel, so that’s why the presets won’t load.

The first SMB shot under “varying levels of sharpness” is probably the best in terms of sharpness/artifacts.

1 Like

My presets should load fine on the latest Mega Bezel but the NTSC ones just won’t look as they should. I was just trying to find out if the Megs Bezel default presets work for you to see if I might be able to better understand why my presets are not loading on your machine.

If your shader path is too deep (has too many characters in the path) that can cause an issue. Other than that, you can feel free to make a bug report and I’ll investigate further. Something like that not working would trigger my OCD.

I still think there might be room for further alteration and possibly improvement. I would say I’m still learning quite a bit about how different settings and values affect things.

It’s quite possible that those edge artifacts can be further manipulated using the Fringing, NTSC Artifacting and NTSC Scale controls among other settings.

1 Like

btw, this is another great reference image posted by Jamirus. This is not a high-quality TV.

1 Like

Thanks, besides the excessive saturation, this actually may not be that far off from my current NES Slot Mask NTSC presets.

There’s definitely some resemblance.

1 Like

Here’s a recent attempt. It’s not bright enough, but when I crank up the bright boosts the sharpness of the white text goes to hell.

shaders = "18"
shader0 = "shaders_slang/crt/shaders/guest/advanced/stock.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/advanced/stock.slang"
filter_linear1 = "false"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = "StockPass"
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/advanced/afterglow0.slang"
filter_linear2 = "true"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
alias2 = "AfterglowPass"
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/advanced/pre-shaders-afterglow.slang"
filter_linear3 = "true"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
alias3 = "PrePass0"
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/advanced/ntsc/ntsc-pass1.slang"
filter_linear4 = "false"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
alias4 = "NPass1"
float_framebuffer4 = "true"
srgb_framebuffer4 = "false"
scale_type_x4 = "source"
scale_x4 = "4.000000"
scale_type_y4 = "source"
scale_y4 = "1.000000"
shader5 = "shaders_slang/crt/shaders/guest/advanced/ntsc/ntsc-pass2.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = ""
float_framebuffer5 = "true"
srgb_framebuffer5 = "false"
scale_type_x5 = "source"
scale_x5 = "0.500000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/crt/shaders/guest/advanced/ntsc/ntsc-pass3.slang"
filter_linear6 = "true"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = ""
float_framebuffer6 = "false"
srgb_framebuffer6 = "false"
scale_type_x6 = "source"
scale_x6 = "1.000000"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/crt/shaders/guest/advanced/custom-fast-sharpen.slang"
filter_linear7 = "true"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = "NtscPass"
float_framebuffer7 = "false"
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/advanced/stock.slang"
filter_linear8 = "true"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "true"
alias8 = "PrePass"
float_framebuffer8 = "false"
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/advanced/avg-lum-ntsc.slang"
filter_linear9 = "true"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "true"
alias9 = "AvgLumPass"
float_framebuffer9 = "false"
srgb_framebuffer9 = "false"
scale_type_x9 = "source"
scale_x9 = "1.000000"
scale_type_y9 = "source"
scale_y9 = "1.000000"
shader10 = "shaders_slang/crt/shaders/guest/advanced/linearize-ntsc.slang"
filter_linear10 = "true"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
alias10 = "LinearizePass"
float_framebuffer10 = "true"
srgb_framebuffer10 = "false"
scale_type_x10 = "source"
scale_x10 = "1.000000"
scale_type_y10 = "source"
scale_y10 = "1.000000"
shader11 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced-ntsc-pass1.slang"
filter_linear11 = "true"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
alias11 = "Pass1"
float_framebuffer11 = "true"
srgb_framebuffer11 = "false"
scale_type_x11 = "viewport"
scale_x11 = "1.000000"
scale_type_y11 = "source"
scale_y11 = "1.000000"
shader12 = "shaders_slang/crt/shaders/guest/advanced/gaussian_horizontal.slang"
filter_linear12 = "true"
wrap_mode12 = "clamp_to_border"
mipmap_input12 = "false"
alias12 = ""
float_framebuffer12 = "true"
srgb_framebuffer12 = "false"
scale_type_x12 = "absolute"
scale_x12 = "800"
scale_type_y12 = "source"
scale_y12 = "1.000000"
shader13 = "shaders_slang/crt/shaders/guest/advanced/gaussian_vertical.slang"
filter_linear13 = "true"
wrap_mode13 = "clamp_to_border"
mipmap_input13 = "false"
alias13 = "GlowPass"
float_framebuffer13 = "true"
srgb_framebuffer13 = "false"
scale_type_x13 = "absolute"
scale_x13 = "800"
scale_type_y13 = "absolute"
scale_y13 = "600"
shader14 = "shaders_slang/crt/shaders/guest/advanced/bloom_horizontal.slang"
filter_linear14 = "true"
wrap_mode14 = "clamp_to_border"
mipmap_input14 = "false"
alias14 = ""
float_framebuffer14 = "true"
srgb_framebuffer14 = "false"
scale_type_x14 = "absolute"
scale_x14 = "800"
scale_type_y14 = "absolute"
scale_y14 = "600"
shader15 = "shaders_slang/crt/shaders/guest/advanced/bloom_vertical.slang"
filter_linear15 = "true"
wrap_mode15 = "clamp_to_border"
mipmap_input15 = "false"
alias15 = "BloomPass"
float_framebuffer15 = "true"
srgb_framebuffer15 = "false"
scale_type_x15 = "absolute"
scale_x15 = "800"
scale_type_y15 = "absolute"
scale_y15 = "600"
shader16 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced-ntsc-pass2.slang"
filter_linear16 = "true"
wrap_mode16 = "clamp_to_border"
mipmap_input16 = "false"
alias16 = ""
float_framebuffer16 = "true"
srgb_framebuffer16 = "false"
scale_type_x16 = "viewport"
scale_x16 = "1.000000"
scale_type_y16 = "viewport"
scale_y16 = "1.000000"
shader17 = "shaders_slang/crt/shaders/guest/advanced/deconvergence-ntsc.slang"
filter_linear17 = "true"
wrap_mode17 = "clamp_to_border"
mipmap_input17 = "false"
alias17 = ""
float_framebuffer17 = "false"
srgb_framebuffer17 = "false"
scale_type_x17 = "viewport"
scale_x17 = "1.000000"
scale_type_y17 = "viewport"
scale_y17 = "1.000000"
wp_saturation = "1.000000"
contr = "-0.000000"
ntsc_scale = "0.990000"
ntsc_shape = "1.000000"
CSHARPEN = "5.000000"
CCONTR = "0.250000"
CDETAILS = "0.000000"
GAMMA_INPUT = "2.400000"
gamma_out = "2.200000"
HSHARPNESS = "1.000000"
S_SHARP = "0.000000"
HSHARP = "0.000000"
HARNG = "0.000000"
spike = "2.000000"
m_glow = "1.000000"
glow = "0.020000"
brightboost = "1.600000"
brightboost1 = "1.300000"
gsl = "2.000000"
scanline1 = "5.000000"
scanline2 = "20.000000"
beam_max = "1.200000"
scans = "0.500000"
maskstr = "1.000000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3;SamplerLUT4"
SamplerLUT1 = "shaders_slang/crt/shaders/guest/advanced/lut/trinitron-lut.png"
SamplerLUT1_linear = "true"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT1_mipmap = "false"
SamplerLUT2 = "shaders_slang/crt/shaders/guest/advanced/lut/inv-trinitron-lut.png"
SamplerLUT2_linear = "true"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT2_mipmap = "false"
SamplerLUT3 = "shaders_slang/crt/shaders/guest/advanced/lut/nec-lut.png"
SamplerLUT3_linear = "true"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT3_mipmap = "false"
SamplerLUT4 = "shaders_slang/crt/shaders/guest/advanced/lut/ntsc-lut.png"
SamplerLUT4_linear = "true"
SamplerLUT4_wrap_mode = "clamp_to_border"
SamplerLUT4_mipmap = "false"
1 Like

The sharpness is pretty close, yeah. I really don’t like the bloom haze over highlights, but that’s my personal preference and I assume a necessary trade off if you want the image to be bright enough.

The PVM is a lot trickier.

1 Like

@guest.r Is there some kind of alteration to the code we can make to reduce the blurring/swelling of highlights that occurs when using high brightness settings?


You can also try lowering input/output gamma values to get a better transition. With modern versions they more or less affect horizontal filtering.


Me neither.

Exactly, plus the bloom control pumps up the colour volume a bit in a very pleasing manner.

You can probably take a look at @RetroGames4K 's presets and screenshots. I haven’t noticed any (much?) bloom haze in (much of?) his work, however he might have started off on the accurate path but has drifted toward the smooth, soft path over time. I’m sure he uses different tweaks in order to get his brightness to an acceptable level.

At this point we know what needs to be done in order to get things bright enough without bloom and that is the Sony Megatron Color Video Monitor (as well as your) brute force Flat Panel TV brightness approach which makes for some ugly screenshots and great inconvenience if using the display for multiple tasks.

We must also always consider viewing distance when putting so much effort into these things. From a distance many of these so called “deal breakers” don’t really matter, especially when you’re fully immersed by the story, gameplay, music and graphics while playing your favourite games. In other words when you’re having fun.

I think the PVM photo is kinda not so much reference quality as well.

Take a look at these zoomed in.


I’ve found that raising bloom by a single notch (0.05) brightens up the image without having too noticeable an effect on the phosphors. Anything higher and they start to wash out in a bad way and you lose phosphor detail. At very high levels the subpixels become downright ugly.

Definitely. I’m judging my presets based on a viewing distance of 2-3 ft from my desktop monitor. Under such conditions, a higher degree of precision is required.

Those are nice, aside from the (IMO) excessive bloom.

1 Like

Told myself I wouldn’t do this, yet here I am again, obsessively tweaking.

I edited the parameter range for “sharpen strength” in custom fast sharpen so I could crank it up to 10.00.



Shaders. Not even once.

It’s sharp alright, but I can see some ringing/oversharpening. Nothing terrible, though.


I believe something similar is happening on the PVM, although I’ve probably gone a bit overboard.

I think an expanded parameter range could be helpful with some setups. @guest.r


Many of the parameters can go beyond the ranges listed in the menu if entered manually in the shader preset file.

Don’t do it, it’s more than good enough. For me, what’s probably most important is everything being in focus from my viewing position, other than that, I just do this for fun and for the artistic thrills (basically the same feelings that I get when I look at anything visual that I like).

I tend to love a challenge but one that’s worthy of my time and effort. I really wouldn’t want to get to the point where I can’t enjoy playing a game if it’s a little different from the way it looks on the reference standard medium.

I’m not saying that this is you but just warning based on what I’ve read and observed. This niche is filled with perfectionists and obsessive compulsives but we shouldn’t only be sowing the seeds for others’ benefits but also enjoying the fruits of our labour as well.

I think the key to it is being able to accept. To accept and appreciate wherever you are on this journey. Sometimes, what’s needed is not necessarily more or better tools but also more time to master and try different ways of using these tools. We must also accept that the tools themselves will always have certain limitations including the hardware used to display the final output of our labour.

We can also choose to celebrate how far or rather how close we have come, rather than focus on that last 1% which might always continue to elude us.

Our time is short as well as ultimately unknown. Hopefully we’ll at least get to play and possibly complete the majority of games that we would like to in our lifetime.

So for me this is quite satisfactory. That doesn’t mean I wouldn’t experiment some more if I were you but I would definitely enjoy playing on my creation until the next tweak comes along.

1 Like

I took a couple of shots of a screen with NTSC-Adaptive only on both LCD monitor and CRT. None of the SMB shots on the CRT came out satisfactory under present conditions, I used the Streets of Rage 2 screenshot below. Adaptive settings default, except I set to phase 3 (I forgot which is supposed to be used when, but in this case, I didn’t want to have the annoying flicker which you’ll get by default in this example).

Screenshot if you want work with it:

Streets of Rage 2-221205-201600