NTSC for Nintendo and SEGA home consoles

I’m trying to find the best way to apply NTSC filtering to Nintendo and SEGA home consoles and I see there are 3 options available:

  1. Blargg NTSC filtering in some core options (not all of them have it available, e.g. bsnes)
  2. NTSC CPU filters in the RetroArch video options
  3. NTSC shaders

From my understanding, using the shaders is recommended, as they are more compatible, but I fear they might not be as accurate as Blargg’s Am I wrong?

I have tried several of the NTSC SLANG shaders on the NTSC folder and the only ones that seem to work are the ones with S-Video. Composite ones seem to have a weird combing effect that flickers in motion and looks like this when on a screenshot:

Is there any drawback from using the adaptive shader instead of the resolution-specific shaders? Using the adaptive shader in Composite mode still shows the above issue, but changing it to S-Video mode makes it look very good.

I’ve tried using the built-in core options on Genesis Plus GX to try and get the transparent waterfalls in Sonic the Hedgehog, but they flicker as hell during horizontal movement, as described on this post:

Additionally, are there other options to simulate the fake transparency, dithering and color composition achieved by developers without having to degrade the whole signal with NTSC? For example, using horizonal blurring, or the “Blur emulation” option from bsnes?

Hello, here what I did with newpixie-crt shader (Sonic behind waterfall)

1 Like

I can’t achieve your picture with newpixie-crt (SLANG). What parameters are you using?

Here is preset that achieve above result, just save as slangp in root shader folder.

shaders = "5"
shader0 = "shaders_slang/dithering/shaders/gdapt/gdapt-pass1.slang"
filter_linear0 = "false"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = "accum1"
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/newpixie/accumulate.slang"
filter_linear0 = "true"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = "accum1"
float_framebuffer0 = "false"
srgb_framebuffer0 = "false"
scale_type_x0 = "source"
scale_x0 = "1.000000"
scale_type_y0 = "source"
scale_y0 = "1.000000"
shader2 = "shaders_slang/crt/shaders/newpixie/blur_horiz.slang"
filter_linear1 = "true"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = "blur1"
float_framebuffer1 = "false"
srgb_framebuffer1 = "false"
scale_type_x1 = "source"
scale_x1 = "1.000000"
scale_type_y1 = "source"
scale_y1 = "1.000000"
shader3 = "shaders_slang/crt/shaders/newpixie/blur_vert.slang"
filter_linear2 = "true"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
alias2 = "blur2"
float_framebuffer2 = "false"
srgb_framebuffer2 = "false"
scale_type_x2 = "source"
scale_x2 = "1.000000"
scale_type_y2 = "source"
scale_y2 = "1.000000"
shader4 = "shaders_slang/crt/shaders/newpixie/newpixie-crt.slang"
filter_linear3 = "true"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
alias3 = ""
float_framebuffer3 = "false"
srgb_framebuffer3 = "false"
parameters = "acc_modulate;blur_x;blur_y;use_frame;curvature;wiggle_toggle"
acc_modulate = "0.350000"
blur_x = "1.000000"
blur_y = "1.000000"
use_frame = "0.000000"
curvature = "0.000100"
wiggle_toggle = "0.000000"
textures = "frametexture"
frametexture = "shaders_slang/crt/shaders/newpixie/crtframe.png"
frametexture_linear = "true"
frametexture_wrap_mode = "clamp_to_border"
frametexture_mipmap = "false"

Oh, I see you’re using gdapt. I’m avoiding those kinds of algorithm based shaders because of false-positives and false-negatives, but thanks anyway.

1 Like