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.
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.
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"
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.
@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.
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.
Thoughts?
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.
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:
CRT:
Monitor:
Found a few composite video shots on a JVC PVM - it’s baffling how sharp and clean it looks. Trying to get any NTSC shader to look like this has proven to be quite a challenge!
Look at how sharp the “M” in “Game” is - I spent a few hours playing with the knobs and dials in guest-advanced-ntsc trying to match this before giving up. Is it possible?
(https://ctrl-alt-rees.com/2019-01-26-nintendo-famicom-composite-video-output-mod.html)
I can increase comb filter and erase all color that interferes to luma (eg the rainbow like in white letters)
The sharp image produced by a PVM is a piece of cake to do on a shader and requires just a few cycles to do as LCDs are already sharp and hardware bilinear filter is extremely sharp too - contrary to what people think - when ONLY used horizontally.
Looks good! Settings?
shaders = "2"
feedback_pass = "0"
shader0 = "shaders_glsl/ntsc/shaders/ntsc-simple/tiny_ntsc.glsl"
alias0 = ""
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
float_framebuffer0 = "false"
srgb_framebuffer0 = "false"
shader1 = "shaders_glsl/crt/shaders/CRT-Beam.glsl"
alias1 = ""
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
filter_linear1 = "true"
float_framebuffer1 = "false"
srgb_framebuffer1 = "false"
comb = "1.000000"
lpf_w = "0.250000"
c_lpf = "0.200000"
y_lpf = "0.600000"
Scanline = "0.500000"
I run it on a window to keep integer for crt-beam, having written these i know them inside out, i could slot a gaussian falloff scanlines there to scale in whatever resolution perfectly (crt-geom does that).
Ah, I was trying to do this within guest-advanced-ntsc because it does some other things I like. Your shader looks a lot simpler, though, and the result is good. I’ll give it a spin. Thanks!
Yeah i always squeeze them to run on modest hardware lol. So i avoid those fancy exp(), pow(), multiple texture reads and all that. The heaviest i ever did was crt-consumer, go figure.
Has CRT-Beam been ported to Slang?
No there was no demand, so i never bothered. I do a lot of experiments on NTSC, and tiny CRT shaders that do a lot more than their weight etc, things that i find interesting and a challenge.