PlainOldPants's Shader Presets

PS1 is probably happening in the future because I own the original hardware with TonyHax to run burned discs, like the 240p suite. SMS is less likely because I don’t own original hardware, though I have heard some late SMS consoles have the early model 1 Genesis’ signal with a slight color modification. If anyone here owns an NTSC SMS, I might upload a couple test patterns on here and have them screenshot their video capture of the pattern. As for N64, there’s a low chance I’ll do it, because I’ve heard that original hardware has changing screen resolutions that current emulators don’t emulate, which would make it difficult to run test patterns.

For now, for PS1 games, I suggest making a copy of the Genesis BlastEm preset and doing these changes:

  • Make a copy of the Genesis BlastEm slangp file in the “ntsc” folder.
  • Look for the line near pass 0 or pass 1 that multiplies the width by “8.000000”, and change that to “4.0”
  • After loading the shader preset in your emulator, change the “Signal Res” setting to 4.
  • Change the “Color Carrier Per-Frame Offset” to 0.5.
  • Under the resolution settings, make sure the thing to detect integer-multiplied horizontal resolutions is enabled
  • EDIT: Turn off the Genesis jailbars, because the PlayStation doesn’t have them. Only early NTSC Genesis/MegaDrives and (I assume) late Master Systems have the Genesis jailbars.
  • At this point please save the preset somewhere in case the next instructions are wrong.
  • To get the CRT effect, use the Append feature to append in this exact order: shaders_slang/ntsc/shaders/patchy-ntsc/afterglow-update0, then shaders_slang/crt/CRT_Sanitized/Thick-Mask-CRT-Advanced.
  • To move the easy settings to the top of the list, use the Prepend feature with ntsc/shaders/patchy-ntsc/allowed-settings/allowed-settings (or whatever it’s called).
  • In CRT-advanced settings, I like to scroll down to the scanline settings and change the setting for something that sounds like “scanline shape bright pixels” from 1.0 to 0.75, which makes the scanlines a little bit harder to see

Just a warning, you absolutely will get crap performance while the in the PS1’s startup sequence, but it’ll become bearable again when the console switches to 240p. As long as it is in 240p and not 480p/480i, you’ll get reasonable performance.

EDIT: Make sure you turn off Genesis jailbars for the PS1 settings.

Hi @PlainOldPants! Firstly, congrats for your achievement with these presets and shaders, It’s a hell of a collection of technical details I don’t understand! :stuck_out_tongue:

Initially I tested the first version and it was very slow on my system, because it was expanding some framebuffers to 8x more or less, so I let it on stand by for a while. Then I tested your last version and you’ve speed things up to a manageable way on my end. So liked it very much.

I intend to use some of it on my presets. I began trying the snes system, which raised this first question: what’s the difference between ntsc/patchy-snes.slangp and Patchy_Presets/SNES-SignalOnly.slangp? (I see they use different number of shaders, but I couldn’t notice any difference visually.)

Second, which one is recommended if I decide to prepend it to some crt preset?

I’ve tested the first with crt-royale-fast and got this:

Compared to standard ntsc I had before:

Is that red push normal or am I doing something wrong?

2 Likes

Thanks. I sure wish it was as accurate as you’re making it sound, but to be honest, I only have so much knowledge. If you read my code, I’m sure you won’t have much of a problem figuring out how I did the effect. The key is to filter the signal both when encoding and when decoding.

Just for now, on Genesis, you might like Guest’s NTSC better. Theirs is set up to artificially retain sharpness and to only add rainbows in places where it looks good. The way I might reach both those same goals in the future without compromising so much on accuracy is with an adaptive comb filter, like the one in shaders_slang/nes_raw_palette/cgwg-famicom-geom.

There are still some performance issues with my implementation:

  • Currently, the shader has terrible performance whenever a game switches to 480i/480p. I’ll have to fix this by adding interlacing support.
  • Appending crt-hyllian after my presets also causes a performance drop. I don’t get this problem with crt-guest-advanced or crt-royale.
  • RF noise is slow because it has to add up about 500 randomly generated sine waves in a for-loop. I did this so that the noise would move across the screen at the correct rates like real hardware. To disable noise, set the cable to 0 (composite).
  • My entire code is just very messy, with some places that can just blatantly be better optimized and cleaned up. It started getting this bad after my fall semester started up.

The difference between the presets in patchy_presets and elsewhere is that the patchy_presets ones add 4 additional passes. At the beginning, there’s a dummy pass added to rearrange the settings and move the commonly used ones to the top of the list. At the end are 3 passes for CRT-guest-advanced afterglow with a fix to make it glow the output of my shaders shader, instead of using OriginalHistory which gets the game’s output directly.

So the main difference is that the SignalOnly presets add afterglow.

I recommend prepending the patchy-snes preset and making your own dummy shader to reorder the settings, but knowing how your shaders are, my default color settings probably aren’t what you want.

The main color settings you’ll want to mess with are:

  • Built-in test patterns (This is actually very useful)
  • R-Y/G-Y/B-Y matrix (0 is the same RGB colors, 1 might not have existed on real CRTs, 2 and 3 are JP, 4 thru 8 are US (7 is the Sony CXA2025AS US, like the NES palette), 9 lets you set the settings yourself)
  • Tint
  • Brightness
  • Color
  • White point
  • Chromatic adaptation
  • Phosphors

You can use Chthon’s program called gamutthingy to add more phosphor gamut LUTs. I’ll soon add a color temperature white point setting, since Grade suggests about 8500K.

I’m not sure about this, but maybe it’s better to keep Terrible Gamut Mode turned off. Just a thought.

And for signal quality, mess with:

  • the various B-Y R-Y filter options (on the leaky integrator, only change the rate)
  • (7) Easy Sharpness (or whatever it’s called)
  • the 2-chip SNES RGB blur amount (I do not own a real SNES, so someone will have to figure out the right blur amount for this)
  • For noise, just change the random seed and the overall severity.

The red push is caused by the “R-Y/G-Y/B-Y formula” setting. You can set it to 0 to turn it off, which will get you closer to the developer’s colors. Apparently, a lot of CRTs in NTSC regions in the 90s were messing with their YIQ matrix to correct from 1953 NTSC color to P22 color, and they had different corrections in Japan than elsewhere. The NES palette called “Sony CXA2025AS US” does exactly this. This happened because of the SMPTE standard still allowing the use of old NTSC hardware, while Japan also had 9300K as its standard reference white. By the 90s, PAL CRTs did not mess with their YUV decoding at all.

To be honest, I haven’t done as much research about these color corrections as I would like yet. My preset settings for the YIQ correction are sourced from just a few random chips’ documentation, but I really need to just sit down and look up a bunch of them. The trick is to search up a bunch of CRTs on Facebook Marketplace and on CRT Database, search for their service manuals online, and if you can find the service manual, search the TV’s jungle chip online and see if you can find its official paper with the R-Y and G-Y settings. It’s a good idea to pay attention to the year that the CRT was made in too. My code converts these settings into a decoding matrix.

4 Likes

Fwiw, the PAL Telefunken I have (from ca. 2000) exhibits a notable difference when displaying NTSC compared to PAL signals, amazingly, this also transfers to RGB 60 Hz signals, which I haven’t observed on the other two TV CRTs I own(ed, one was lost some months ago).

Thank you for the answers.

I’ve put formula to 0 as you recommended and the red push was gone.

There’s a gentle interference in your ntsc version that presents nicely in movement along fringing. I like it.

1 Like

I’ve seen in your Sanitized folder that you chose a very heavy mask to use. Maybe this is the cause of slowness. I tend to use small masks for 1080p displays.

@sonkun’s CRT pictures reminded me that none of my consoles looked like “2-phase” composite on my CRT, so I decided to take some pictures of my own Wii and PS1. I’m glad I did, because this confirms to me that they do have the “2 phase” pattern. I didn’t realize this because my CRT’s comb filter was removing a lot of the 2 phase artifacts.

Here’s a video of how my Wii and PS1 look on my CRT. My HDMI to Composite converter had a similar result on Sonic 1’s waterfall (seriously a cursed image), but it’s not in the video. https://youtube.com/watch?v=LcVa2Lpdpbo

And here are some video captures of my PS1 from my Dazzle DVC100 on OBS, which also has a comb filter. First is the checkerboard, which still has its artifacts. Second is the vertical bars, which get their artifacts comb filtered out better.

In standard NTSC, one line of the video signal is exactly 227.5 color carrier cycles long. That’s what this “2 phase” composite video is. You end up with the color carrier being offset by 180 degrees each line, so it repeats every 2 lines.

The Genesis/MegaDrive has a different pattern in its composite. It leaves the color carrier at the same offset on every line, instead of rotating 180 degrees. I don’t have my Genesis here with me, so here’s how the Genesis looks in my shader with a basic non-adaptive 2-line comb filter. First is the checkerboard, and second is the vertical bars.

So, on the Genesis, we get the opposite effect. The checkerboard pattern is mostly left intact, and the vertical bars get a rainbow pattern.

So: to emulate the Genesis’ composite signal rainbows without ruining checkerboard patterns and other parts of the screen, you have to use an adaptive comb filter.

About “3 phase”, this comes from the NES and SNES. I don’t have a real SNES to confirm this, but on the NES at least, the color carrier is 1.5 pixels wide, and every signal line is 341 pixels. That means there are 227.3333… color carrier cycles per line, resulting in the 3 phase pattern. My current SNES settings have this just ever so slightly off from this, but they’re very close.

4 Likes

Nice. I’m glad my posts inspired this research here. Interesting information you posted.

2 Likes

I just made a small edit to cgwg-famicom-geom to support SNES. The difference is that cgwg-famicom-geom has an adaptive comb filter implementation, while mine is notch filter based.

Edit: Something I didn’t implement on my converted cgwg-famicom-geom is the SNES’s blurry RGB. It should be a tiny bit blurrier horizontally, but you get the point. Everything just became a whole lot sharper.

Edit 2: Download at https://www.mediafire.com/file/mjx94ds59os8xxx/snes-clean.zip/file , based on the names of the folders and files, it should be obvious where to put them.

1 Like

PC-Engine/TurboGrafx-16/Turbo Duo also does 3 phase as well as 2 phase, at least according to NTSC Adaptive and CRT-Guest-Advanced-NTSC shaders.

It utilizes multiple resolutions often, sort of like the PSX.

1 Like

Even some Mega Drive games do 3phase. First example I can think of is Virtua Racing.

1 Like

Please be really careful about this. While I don’t know whether or not the PC-Engine has this same “3 phase” pattern as the NES and SNES (To be honest, I haven’t looked at the PC-Engine’s composite), I seriously don’t believe that any revision of the Model 1 and 2 Genesis/MegaDrives were ever outputting a 3 phase pattern, ever. My Genesis doesn’t even output 2-phase.

I seriously don’t mean any offense to anyone here, but the following line of code is how NTSC-adaptive determines whether to use its 3-phase or 2-phase pattern:

   float phase = (global.ntsc_phase < 1.5) ? ((OriginalSize > 300.0) ? 2.0 : 3.0) : ((global.ntsc_phase > 2.5) ? 3.0 : 2.0);

In other words, it’s only looking at the horizontal resolution of the screen. If it’s 300 pixels or less, it’s 3-phase. If it’s 301 pixels or more, it’s 2-phase. There’s no complicated magic to determine whether the real console would output 3-phase or 2-phase. There’s not even an option for the Genesis/MegaDrive’s signal, which I like to call “1 phase”.

These terms “2 phase” and “3 phase” originate from an older NTSC implementation called Maister NTSC, which used precomputed, hardcoded filters from MATLAB for better performance and clarity. NTSC-Adaptive uses those same filters and phase offsets, but with additional features to improve the overall effect, like the anti-ringing, sharpening, and rainbow banding settings, still with clean, fast code. Doing some archeology, these MATLAB-generated filters are over 10 years old: https://github.com/libretro/common-shaders/commit/02d056220939892a5a4b2fbfd6d83101c318aed7#diff-88b173c57ef901ae0104e2f3533403d5bd10eea1359ff186a689c577bef94b49R6 https://github.com/libretro/common-shaders/commit/c31348649421c085c2c0c6013d3ca57fa9718e0e#diff-0b4d32fb579074853dc6d2d41a2a6b645c40597ee1385eb518ddeebd9adcdd6eR45

This weirdness with the NTSC shaders in shaders_slang, combined with this frustratingly long list of NES palettes, is what ultimately led me to get a real NES and Genesis with EverDrives in the first place. As a 2000s person, I’d only ever played these games through emulation, so I didn’t know what they really looked like when they came out.

2 Likes

Which is why I want to get my hands on original hardware again myself. Seeing Virtua Racing like that indeed throws me off, that pic alone makes me want to see how it outputs on a model 1 Gens with RF output. Composite didn’t exist to me back in the 90’s literally until the 5th generation consoles came on the scene with the composite cable packaged in the box, every system I owned before that all came packaged with the RF cable so that was my experience. I have the main 3 systems of the 5th generation (saturn, ps1 and n64) right now all with their respective original composite cables and a crt to play any one of them for testing purposes, it’s the systems before that generation that I haven’t seen in ages on a crt that I need to see again on real hardware.

I can’t load Virtua Racing on my EverDrive X3 since it needs some special chip, but here’s the 240p test suite with 320px and 256px resolutions. https://youtube.com/watch?v=tN-B6PNGwLI It is a “1 phase” pattern.

We can also see that this RF-only 1989 CRT has no comb filter, because the rainbow banding doesn’t disappear on the checkerboard pattern. CRTs with a comb filter filter out the rainbow banding from checkerboard patterns, but not from vertical bar patterns.

2 Likes

Least I know which game I’m getting first when I get a Mega Drive again. I’m more curious than ever to see Virtua Racing on a crt playing on the actual system. Guess it will still vary on the kind of crt I hook it up to as well.

1 Like

This is why I made sure to qualify my statement and have in the past questioned whether or not the logic behind determining the correct phase for the systems used by the NTSC shaders was in fact correct.

I’m sure I can dig up my old posts with those questions.

So definitely no offense taken here. We’re actually on the same page.

Hi @PlainOldPants, as for Sega Master System, I’ve tried using your Patchy-Genesis.slangp inside ntsc folder, but for some reason, it didn’t look like I remember. I had a Master System in the 90’s. Surprisingly, using Patchy-snes.slangp I managed to get something very good and it remind me exactly the sms visual of that time. I had to change some params, though, because the default interference/noise was just too much for what I remember. It’s important to tell that at the time I was used to fine tunning my RF consoles to the best settings, so noise was minimized and my father had a 20" Panasonic CRT TV at the time, and it probably was too good in picture.

So, here’s my preset for master system the way I remember. Noise is noticeable only in some dark color shades. Fringing is subtle, so that it doesn’t distract you. No idea if I’m doing something stupid about the parameters, but here it is, anyway:

shaders = "16"
feedback_pass = "0"
shader0 = "shaders_slang/ntsc/shaders/patchy-ntsc/patchy-ntsc-encode-y-c.slang"
filter_linear0 = "false"
wrap_mode0 = "clamp_to_border"
frame_count_mod0 = "1000"
mipmap_input0 = "false"
alias0 = ""
float_framebuffer0 = "true"
srgb_framebuffer0 = "false"
scale_type_x0 = "source"
scale_x0 = "4.000000"
scale_type_y0 = "source"
scale_y0 = "1.000000"
shader1 = "shaders_slang/ntsc/shaders/patchy-ntsc/patchy-ntsc-combine-y-c.slang"
filter_linear1 = "false"
wrap_mode1 = "clamp_to_border"
frame_count_mod1 = "1000"
mipmap_input1 = "false"
alias1 = ""
float_framebuffer1 = "true"
srgb_framebuffer1 = "false"
scale_type_x1 = "source"
scale_x1 = "1.000000"
scale_type_y1 = "source"
scale_y1 = "1.000000"
shader2 = "shaders_slang/ntsc/shaders/patchy-ntsc/patchy-ntsc-noise.slang"
filter_linear2 = "false"
wrap_mode2 = "clamp_to_border"
frame_count_mod2 = "1000"
mipmap_input2 = "false"
alias2 = ""
float_framebuffer2 = "true"
srgb_framebuffer2 = "false"
scale_type_x2 = "source"
scale_x2 = "1.000000"
scale_type_y2 = "source"
scale_y2 = "1.000000"
shader3 = "shaders_slang/ntsc/shaders/patchy-ntsc/patchy-ntsc-separate-y-c.slang"
filter_linear3 = "false"
wrap_mode3 = "clamp_to_border"
frame_count_mod3 = "1000"
mipmap_input3 = "false"
alias3 = ""
float_framebuffer3 = "true"
srgb_framebuffer3 = "false"
scale_type_x3 = "source"
scale_x3 = "1.000000"
scale_type_y3 = "source"
scale_y3 = "1.000000"
shader4 = "shaders_slang/ntsc/shaders/patchy-ntsc/patchy-ntsc-decode-y-rmy-bmy.slang"
filter_linear4 = "false"
wrap_mode4 = "clamp_to_border"
frame_count_mod4 = "1000"
mipmap_input4 = "false"
alias4 = ""
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/ntsc/shaders/patchy-ntsc/patchy-ntsc-eotf.slang"
filter_linear5 = "false"
wrap_mode5 = "clamp_to_border"
frame_count_mod5 = "1000"
mipmap_input5 = "false"
alias5 = ""
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/ntsc/shaders/patchy-ntsc/trilinearLUT-switchable.slang"
filter_linear6 = "false"
wrap_mode6 = "clamp_to_border"
frame_count_mod6 = "1000"
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/ntsc/shaders/patchy-ntsc/linear-to-srgb.slang"
filter_linear7 = "false"
wrap_mode7 = "clamp_to_border"
frame_count_mod7 = "1000"
mipmap_input7 = "false"
alias7 = ""
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/crt-royale/src-fast/crt-royale-first-pass-linearize-crt-gamma-bob-fields.slang"
filter_linear8 = "false"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
alias8 = "ORIG_LINEARIZED"
float_framebuffer8 = "false"
srgb_framebuffer8 = "true"
scale_type_x8 = "source"
scale_x8 = "1.000000"
scale_type_y8 = "source"
scale_y8 = "1.000000"
shader9 = "shaders_slang/crt/shaders/crt-royale/src-fast/crt-royale-scanlines-vertical-interlacing.slang"
filter_linear9 = "true"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "false"
alias9 = "VERTICAL_SCANLINES"
float_framebuffer9 = "false"
srgb_framebuffer9 = "true"
scale_type_x9 = "source"
scale_x9 = "1.000000"
scale_type_y9 = "viewport"
scale_y9 = "1.000000"
shader10 = "shaders_slang/crt/shaders/crt-royale/src-fast/crt-royale-mask-resize-vertical.slang"
filter_linear10 = "true"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
alias10 = ""
float_framebuffer10 = "false"
srgb_framebuffer10 = "false"
scale_type_x10 = "absolute"
scale_x10 = "64"
scale_type_y10 = "viewport"
scale_y10 = "0.062500"
shader11 = "shaders_slang/crt/shaders/crt-royale/src-fast/crt-royale-mask-resize-horizontal.slang"
filter_linear11 = "false"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
alias11 = "MASK_RESIZE"
float_framebuffer11 = "false"
srgb_framebuffer11 = "false"
scale_type_x11 = "viewport"
scale_x11 = "0.062500"
scale_type_y11 = "source"
scale_y11 = "1.000000"
shader12 = "shaders_slang/crt/shaders/crt-royale/src-fast/crt-royale-scanlines-horizontal-apply-mask.slang"
filter_linear12 = "true"
wrap_mode12 = "clamp_to_border"
mipmap_input12 = "false"
alias12 = "MASKED_SCANLINES"
float_framebuffer12 = "false"
srgb_framebuffer12 = "true"
scale_type_x12 = "viewport"
scale_x12 = "1.000000"
scale_type_y12 = "viewport"
scale_y12 = "1.000000"
shader13 = "shaders_slang/crt/shaders/crt-royale/src-fast/crt-royale-brightpass.slang"
filter_linear13 = "true"
wrap_mode13 = "clamp_to_border"
mipmap_input13 = "false"
alias13 = "BRIGHTPASS"
float_framebuffer13 = "false"
srgb_framebuffer13 = "true"
scale_type_x13 = "viewport"
scale_x13 = "1.000000"
scale_type_y13 = "viewport"
scale_y13 = "1.000000"
shader14 = "shaders_slang/crt/shaders/crt-royale/src-fast/crt-royale-bloom-vertical.slang"
filter_linear14 = "true"
wrap_mode14 = "clamp_to_border"
mipmap_input14 = "false"
alias14 = ""
float_framebuffer14 = "false"
srgb_framebuffer14 = "true"
scale_type_x14 = "source"
scale_x14 = "1.000000"
scale_type_y14 = "source"
scale_y14 = "1.000000"
shader15 = "shaders_slang/crt/shaders/crt-royale/src-fast/crt-royale-bloom-horizontal-reconstitute.slang"
filter_linear15 = "true"
wrap_mode15 = "clamp_to_edge"
mipmap_input15 = "false"
alias15 = ""
float_framebuffer15 = "false"
srgb_framebuffer15 = "true"
scale_type_x15 = "source"
scale_x15 = "1.000000"
scale_type_y15 = "source"
scale_y15 = "1.000000"

pn_signal_res = "4.000000"
pn_width_uncropped = "256.000000"
pn_height_uncropped = "240.000000"
pn_rgb_blur_enable = "1.000000"
pn_scanline_dur = "47.700000"
pn_color_init_offset = "0.000000"
pn_color_line_offset = "0.333333"
pn_color_screen_offset = "0.333333"
pn_color_screen_offset_modulo = "2.000000"
pn_modulator_luma_filter_type = "-1.000000"
pn_modulator_chroma_filter_type = "0.000000"
pn_demodulator_std = "0.000000"
pn_gamma_type = "0.000000"
pn_connection_type = "-1.000000"
pn_noise_severity = "0.400000"
pn_noise_counter = "200.000000"

beam_min_sigma = "0.150000"
beam_max_sigma = "0.270000"
mask_type = "1.000000"


textures = "PhosphorSamplerLUT1;PhosphorSamplerLUT2;PhosphorSamplerLUT3;PhosphorSamplerLUT4;PhosphorSamplerLUT5;PhosphorSamplerLUT6;mask_grille_texture_small;mask_slot_texture_small;mask_shadow_texture_small"
PhosphorSamplerLUT1 = "shaders_slang/ntsc/shaders/patchy-ntsc/P22_80s_D65.png"
PhosphorSamplerLUT1_wrap_mode = "clamp_to_border"
PhosphorSamplerLUT1_mipmap = "false"
PhosphorSamplerLUT2 = "shaders_slang/ntsc/shaders/patchy-ntsc/P22_90s_D65.png"
PhosphorSamplerLUT2_wrap_mode = "clamp_to_border"
PhosphorSamplerLUT2_mipmap = "false"
PhosphorSamplerLUT3 = "shaders_slang/ntsc/shaders/patchy-ntsc/P22_J_D65.png"
PhosphorSamplerLUT3_wrap_mode = "clamp_to_border"
PhosphorSamplerLUT3_mipmap = "false"
PhosphorSamplerLUT4 = "shaders_slang/ntsc/shaders/patchy-ntsc/TrinitronP22_D65.png"
PhosphorSamplerLUT4_wrap_mode = "clamp_to_border"
PhosphorSamplerLUT4_mipmap = "false"
PhosphorSamplerLUT5 = "shaders_slang/ntsc/shaders/patchy-ntsc/P22_J_D93.png"
PhosphorSamplerLUT5_wrap_mode = "clamp_to_border"
PhosphorSamplerLUT5_mipmap = "false"
PhosphorSamplerLUT6 = "shaders_slang/ntsc/shaders/patchy-ntsc/TrinitronP22_D93.png"
PhosphorSamplerLUT6_wrap_mode = "clamp_to_border"
PhosphorSamplerLUT6_mipmap = "false"
mask_grille_texture_small = "shaders_slang/crt/shaders/crt-royale/TileableLinearApertureGrille15Wide8And5d5SpacingResizeTo64BGR.png"
mask_grille_texture_small_wrap_mode = "clamp_to_border"
mask_grille_texture_small_mipmap = "false"
mask_slot_texture_small = "shaders_slang/crt/shaders/crt-royale/TileableLinearSlotMaskTall15Wide9And4d5Horizontal9d14VerticalSpacingResizeTo64BGRshifted.png"
mask_slot_texture_small_wrap_mode = "clamp_to_border"
mask_slot_texture_small_mipmap = "false"
mask_shadow_texture_small = "shaders_slang/crt/shaders/crt-royale/TileableLinearShadowMaskEDPResizeTo64.png"
mask_shadow_texture_small_wrap_mode = "clamp_to_border"
mask_shadow_texture_small_mipmap = "false"

Screens: https://ibb.co/album/V3mb4p

3 Likes

There is no good NTSC Master System footage online at all. All the Master System gameplay videos on YouTube either are over RGB, over a Genesis’s composite, over an unspecified console’s (probably a Genesis’s) composite, or just recorded by a camera in shitty quality. I just need someone to upload a video capture of the SMS, preferrably an earlier one without the CXA1145. Prove to me that the NTSC SMS isn’t some 4chan hoax.

I can’t find a schematic for the NTSC Master System either, but there is a schematic for the PAL master system floating around. It has the same Sony CXA1145 setup as the early Genesis consoles, with the same inductor/capacitor filters on the signal, but I’ve read elsewhere that earlier NTSC Master Systems have a superior circuit using an older Sony chip.

That doesn’t necessarily mean that late NTSC Master System consoles had the same composite as the Genesis. Considering the Master System has a width of 256 pixels, there’s a good possibility it has the same phase pattern as the SNES, just with reduced artifacts and increased blur.

What that does mean @Hyllian is that you probably want to turn off the bilinear RGB blur (that’s really just a SNES thing), and change the modulator luma filter type to -2 (if that’s even in my latest upload), unless this looks too different from what you remember. For colors that look more like Grade, you can change my shader’s white point to 9300K, enable chromatic adaptation, and set the phosphors to either P22-J or Trinitron P22.

There are also 2 more tiny fixes I need to make in my code, particularly the Master System’s “blue lift” and the exact right SNES color carrier frequency–My 3-phase pattern currently is just slightly wrong. Once I do these 2 fixes, I’ll upload my latest version. This update is also going to calibrate the optional US red pushes better than before, and it’s going to add Grade’s 8500K white point.

1 Like

The No Swear Gamer records from hardware, you could ask him about specifics via Youtube.

Here’s another composite capture, from Japanese hardware: https://www.youtube.com/watch?v=9MHZDmmnkao

And here is another composite capture.The description says it’s “the original Master System”, there are also links where the same game (Shinobi) is demonstrated using the composite outputs of the Analogue NT Mini and the Genesis 1. https://www.youtube.com/watch?v=qLWZoEgjNnU

3 Likes

Thank you a lot. I saw a couple from The No Swear Gamer and didn’t know whether it was an original SMS or a Genesis, but those other 2 are probably original SMS consoles. They look like they’re the same as the Genesis’ video signal, except, comparing these two videos https://www.youtube.com/watch?v=creDKP43oCI https://www.youtube.com/watch?v=qLWZoEgjNnU the SMS and Genesis have different colors.

@Hyllian I’m questioning your memory a little bit. All of these videos have the Genesis “1-phase” pattern.

I did a quick search and found a PC-Engine video: https://www.youtube.com/watch?v=-sCRJ8ZhoUk It is a “2-phase” pattern.

For PS1, I’m not even going to look up videos. I’m just going to capture my real hardware.

I won’t start working on this stuff just yet. I have other things I need to dedicate more time to at the moment. All I’ll do for now is that tiny 3-phase fix and Grade’s SMS non-linear blue lift. After those things, one more thing in addition to trying to match these consoles is copying cgwg-famicom-geom’s adaptive comb filter.

(Edit: I’m already forgetting the color gamut conversions that I discussed with Chthon last month. The plan is to bake the entire color grading process into an LUT, including the demodulator settings, the gamma, and the phosphor gamut. It’ll be a big jump in quality, but… at that point, someone may as well get a CRT-compatible (!) colorimeter and just sample an entire LUT that way.)

2 Likes