gotten this to where it’s more or less just a sharpness difference
Reference screenshot
The sharpest image I can get with the NTSC shader if I want to blend something
source:
Thank you, we need more comparison shots like this.
I like the screenshot, what settings are being used? I don’t see accurate RGB triads but the deconvergence kinda gives it that “additive color” feel. I tried something similar with a black and white masks (mask 7 I believe) not too long ago- could be a good option for OLED and such.
Yes. I often add exaggerated glow and misconvergence (and raised black level) when I need an immediate analogue look.
shaders = "19"
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 = ""
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/ntsc/gdapt-pass0.slang"
filter_linear2 = "false"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
alias2 = ""
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/ntsc/gdapt-pass1.slang"
filter_linear3 = "false"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
alias3 = "StockPass"
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/afterglow0.slang"
filter_linear4 = "true"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
alias4 = "AfterglowPass"
float_framebuffer4 = "false"
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/advanced/pre-shaders-afterglow.slang"
filter_linear5 = "true"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = "PrePass0"
float_framebuffer5 = "false"
srgb_framebuffer5 = "false"
scale_type_x5 = "source"
scale_x5 = "1.000000"
scale_type_y5 = "source"
scale_y5 = "1.000000"
shader6 = "shaders_slang/crt/shaders/guest/advanced/ntsc/ntsc-pass1.slang"
filter_linear6 = "false"
wrap_mode6 = "clamp_to_border"
frame_count_mod6 = "2"
mipmap_input6 = "false"
alias6 = ""
float_framebuffer6 = "true"
srgb_framebuffer6 = "false"
scale_type_x6 = "source"
scale_x6 = "4.000000"
scale_type_y6 = "source"
scale_y6 = "1.000000"
shader7 = "shaders_slang/crt/shaders/guest/advanced/ntsc/ntsc-pass2.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 = "0.500000"
scale_type_y7 = "source"
scale_y7 = "1.000000"
shader8 = "shaders_slang/crt/shaders/guest/advanced/convert-ntsc.slang"
filter_linear8 = "true"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
alias8 = ""
float_framebuffer8 = "false"
srgb_framebuffer8 = "false"
scale_type_x8 = "source"
scale_x8 = "0.500000"
scale_type_y8 = "source"
scale_y8 = "1.000000"
shader9 = "shaders_slang/crt/shaders/guest/advanced/stock.slang"
filter_linear9 = "true"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "true"
alias9 = "PrePass"
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/avg-lum-ntsc.slang"
filter_linear10 = "true"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "true"
alias10 = "AvgLumPass"
float_framebuffer10 = "false"
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/linearize-ntsc.slang"
filter_linear11 = "true"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
alias11 = "LinearizePass"
float_framebuffer11 = "true"
srgb_framebuffer11 = "false"
scale_type_x11 = "source"
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 = "640"
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 = "640"
scale_type_y13 = "absolute"
scale_y13 = "480"
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 = "640"
scale_type_y14 = "absolute"
scale_y14 = "480"
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 = "640"
scale_type_y15 = "absolute"
scale_y15 = "480"
shader16 = "shaders_slang/crt/shaders/guest/advanced/crt-guest-advanced-ntsc.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"
shader18 = "shaders_slang/sharpen/shaders/fast-sharpen.slang"
wrap_mode18 = "clamp_to_border"
mipmap_input18 = "false"
alias18 = ""
float_framebuffer18 = "false"
srgb_framebuffer18 = "false"
AS = "0.000000"
BP = "10.000000"
ntsc_fields = "1.000000"
ntsc_phase = "3.000000"
GAMMA_INPUT = "2.400000"
glow = "0.200000"
bloom = "0.100000"
bloom_dist = "0.100000"
halation = "0.075000"
gsl = "2.000000"
beam_max = "1.250000"
h_sharp = "5.000000"
s_sharp = "0.500000"
ring = "4.000000"
shadowMask = "8.000000"
maskstr = "0.500000"
mask_layout = "1.000000"
mask_gamma = "2.000000"
gamma_out = "2.400000"
deconrr = "2.500000"
deconrb = "-2.500000"
deconrry = "-2.000000"
deconrby = "2.000000"
CONTR = "0.200000"
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"
I would really like to know, if Raspberry composite video can mix Genesis dither. I’m almost paying for a Trinitron to use with composite video, but I think I’ll have to restore my Genesis, but I don’t know how.
Well, in my memories I remember seeing Sonic’s waterfalls transparent, and the image was very sharp on TV, but I can’t rely only on memories.
I’ve been doing two tests when tweaking NTSC-advanced.
The SMB text, and the Sonic waterfall.
AFAIK, the SMB text is always sharp no matter what kind of composite video filtering the TV is doing. I’ve just never seen the text as blurry as the NTSC shader makes it.
Passing the waterfall test is easy. I’ve yet to find any combination of settings that will pass both the waterfall test and the SMB text test, though.
Is there any solution? I think composite video may need an entirely new shader, written from the ground up, specifically for composite video.
(see circled areas)
from what I can tell the whites are just bleeding too much into the blue. But if I make it sharper with any of the available methods then it no longer passes the waterfall test. Meanwhile, a CRT via composite video passes the waterfall test AND is able to keep the white text sharp.
Is this a linear gamma vs curved gamma thing?
I’ll soon post a new version of the ntsc shaders, maybe you can try the new sharpness settings. SMB and Sonic Waterfall are two different scenarios though, first triggers 3-phase coding, latter 2-phase coding.
3-phase can’t do perfect de-dithering with these shaders, even at default settings, therefore i see no harm to increase the ordinary sharpness a bit.
Come to think of it, I know of exactly 0 games on NES that made use of dithering. I don’t think it was a thing on NES.
SNES I’m less sure about it. It seems like some games on SNES made use of dithering, although I can’t think of any off the top of my head. If some SNES games made use of dithering then we need a 3-phase option that blends dithering…?
also, fun fact: the sharpness control on American TVs was basically an edge enhancement meant to make composite video sharper; with S-video you would set this to 0, most of the time. So even with composite video you could have sharp, unblended dithering depending on what the TV is doing.
IMO 256px (3-phase) de-dithering on SNES has to be confirmed on real HW in a way. The ntsc shaders have an interesting history, previously there were 2 versions, one for emulated HW which outputed 256 horizontal pix. (3-phase), second for 320 pix. (Sega Genesis…)(2-phase).
GDV uses the merged adaptive version, so in a way different presets should be used for different cores.
The capture site I posted a while back had a shot of Blaster Master on NES that looks like it benefits from dithering.
On SNES.e.g. the Earthworm Jim title screen is similar looking to the one on Genesis. In Mortal Kombat 3, the lifebars have a checkerboard pattern, I’m not sure to what extent dithering, blending/transparency effects on SNES are synonymus here.
There are quite a number of SNES and PC Engine games that use dither patterns to simulate extra colours which would benefit from de-dithering.
Off the top of my head.
SNES
UN Squadron - Life bar, Sky in the intro
Mega Man 7 - Title text
Super Metroid - Title text and other areas
PC-Engine
Gate of Thunder
Lords of Thunder - Transparency in the waterfall in the Water Level
Ys I,II & IV
Dracula X
Many many more examples
NES
Guerilla War - Shadows under planes in intro to simulate transparency.
IIRC, F-Zero has a lot of dithering in the backgrounds, too.
However, just because there’s a checkerboard pattern it doesn’t mean that the “artist’s intention” was that it should be blended to a solid intermediate color. As has been mentioned, PC and arcade games regularly used dithering patterns on displays and connections where no blending is expected. It’s just a general technique that people used for artistic reasons with limited palettes.
I agree with this. It would be quite interesting if this new sharper de-dithering functionality could be applied to PC-Engine and SNES games to enhance their palettes without the false positives of MDAPT and the blurriness of more traditional methods which might work fine for Sega Genesis but look completely out of place and even make text illegible on PC Engine games, many of which ran at relatively high resolution.
I’ve managed to get pretty acceptable results using custom sharpening and resolution settings with Blargg’s NTSC Video Filter and relatively sharp shader settings.
I’m wondering if this new NTSC fast shader will provide good enough results to work on PC Engine games in particular, which feature extensive use of dithering.
This is exactly what I had in mind when I posted that I couldn’t think of any examples from SNES games. There’s nothing as obvious as, for example, the Sonic waterfall (that I can think of). I think with transparency effects it’s reasonable to assume that they’re supposed to be transparent. I think certain color shifts are clearly intended as well, like purple bricks into brown. Checkerboard patterns are iffy, it’s not always clear that they’re supposed to be blended.
@Cyber The Guerilla War example is interesting, I’ll check it out
Even so, I’m all for enhancing the colours once it fits without creating any graphical artifacts.
MDAPT adds but also takes away due to false positives. Even a few can mess things up enough to break immersion in my opinion.
The dialog boxes in Secret of Mana seem obviously intended to be transparent. They aren’t, unless you use blending.
There’s also the Mr. DNA dialogs in Jurassic Park and the various transparency effects in Kirby’s Dreamland 3.
I like adding the gtu-50 pass 1 and pass 2 to the NTSC shader. It smears some colors without blurring the pixels and you have control over it. It’s a very minor differnce but I like it.
shaders = "18"
shader0 = "shaders_slang/crt/shaders/gtu-v050/pass1.slang"
filter_linear0 = "false"
wrap_mode0 = "clamp_to_border"
frame_count_mod0 = "2"
mipmap_input0 = "false"
alias0 = ""
float_framebuffer0 = "true"
srgb_framebuffer0 = "false"
scale_type_x0 = "source"
scale_x0 = "1.000000"
scale_type_y0 = "source"
scale_y0 = "1.000000"
shader1 = "shaders_slang/crt/shaders/gtu-v050/pass2.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 = "640"
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 = "640"
scale_type_y13 = "absolute"
scale_y13 = "480"
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 = "640"
scale_type_y14 = "absolute"
scale_y14 = "480"
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 = "640"
scale_type_y15 = "absolute"
scale_y15 = "480"
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"
compositeConnection = "1.000000"
signalResolution = "1024.000000"
signalResolutionI = "85.000000"
signalResolutionQ = "51.000000"
PR = "0.140000"
PG = "0.140000"
PB = "0.140000"
TNTC = "4.000000"
WP = "-50.000000"
wp_saturation = "1.250000"
quality = "0.000000"
ntsc_sharp = "-8.000000"
interm = "2.000000"
SIZEHB = "1.000000"
SIGMA_HB = "0.250000"
SIZEVB = "1.000000"
SIGMA_VB = "0.250000"
glow = "0.000000"
bloom = "0.150000"
halation = "0.050000"
brightboost = "1.800000"
gsl = "-1.000000"
scanline2 = "15.000000"
beam_min = "1.400000"
beam_max = "1.100000"
shadowMask = "11.000000"
maskstr = "0.650000"
mcut = "1.300000"
slotwidth = "4.000000"
double_slot = "2.000000"
dctypex = "0.450000"
dctypey = "0.500000"
deconrr = "-3.000000"
deconrb = "3.000000"
deconrry = "3.000000"
deconrby = "-3.000000"
decons = "0.400000"
post_br = "1.150000"
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"
I’m sometimes also fond of pre-scaling, especially with 2-phase coding. Fringing can be cool, but it sometimes produces notable temporal blur. With xBR, scalefx…there is much more crisp added.
The NTSC preset for the Megatron shader is my benchmark for what the filtering should look like. The text is sharp, and the waterfall is blended. I’m starting to think that the gaussian blur(?) might be the issue. Megatron uses a simple bicubic filter.
guest-ntsc has the edge when it comes to color, brightness, scanline control, etc…it’s just difficult to get the filtering to look right.