The most accurate CRT experience possible - call to all shader pros

My intention here isn’t to start a big debate over what constitutes “accurate,” but I’d like to make this a community effort if possible.

In order for the emulated phosphors to be as close as possible to the real thing, mask strength 100% is required.

The goal is to get the display as bright as possible and with the correct gamma, color, etc while keeping mask strength at 100%.

For this to work properly, the LCD backlight should be adjusted to 100% and you must have a standard RGB subpixel structure. For this to work with other subpixel structures, the mask code needs a slight alteration.

If done right, the LCD subpixels will work almost exactly like CRT phosphors on an aperture grille CRT. With a retina resolution display (ie, no visible pixel grid at any distance), the results can be so close to the real thing that even a trained eye will have difficulty telling which is the CRT and which is the LCD in a side by side comparison.

These settings are intended for a 1080p display and haven’t been tested with other resolutions. I’m using a custom resolution of 1494x1120 for games that use 224 horizontal lines.

If you can get the phosphors to look the same as how they look on a CRT, and you can match a CRT’s brightness and a CRT’s color and contrast, then this just leaves the problem of blur, but let’s forget about that for now :wink:

The settings I’ve been playing with the most are CRT brightness, gamma in/out, and scanline bright/dark levels.

This is what I’ve got so far…

(must be viewed at original size)

shaders = "40"
shader0 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm/hsm-prep-add-params-standard.slang"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
alias0 = ""
float_framebuffer0 = "false"
srgb_framebuffer0 = "false"
shader1 = "shaders_slang/stock.slang"
filter_linear1 = "false"
wrap_mode1 = "clamp_to_border"
mipmap_input1 = "false"
alias1 = "DerezedPass"
float_framebuffer1 = "false"
srgb_framebuffer1 = "true"
scale_type_x1 = "source"
scale_x1 = "1.000000"
scale_type_y1 = "source"
scale_y1 = "1.000000"
shader2 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm/hsm-prep-info-cache-standard.slang"
filter_linear2 = "true"
wrap_mode2 = "clamp_to_border"
mipmap_input2 = "false"
alias2 = "InfoCachePass"
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/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm/hsm-prep-intro-standard.slang"
filter_linear3 = "false"
wrap_mode3 = "clamp_to_border"
mipmap_input3 = "false"
alias3 = "IntroPass"
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/stock.slang"
wrap_mode4 = "clamp_to_border"
mipmap_input4 = "false"
alias4 = "PreDeDitheringPass"
float_framebuffer4 = "false"
srgb_framebuffer4 = "false"
shader5 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-mdapt/hsm-mdapt-pass0.slang"
wrap_mode5 = "clamp_to_border"
mipmap_input5 = "false"
alias5 = ""
float_framebuffer5 = "false"
srgb_framebuffer5 = "false"
shader6 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-mdapt/hsm-mdapt-pass1.slang"
wrap_mode6 = "clamp_to_border"
mipmap_input6 = "false"
alias6 = ""
float_framebuffer6 = "false"
srgb_framebuffer6 = "false"
shader7 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-mdapt/hsm-mdapt-pass2.slang"
wrap_mode7 = "clamp_to_border"
mipmap_input7 = "false"
alias7 = ""
float_framebuffer7 = "false"
srgb_framebuffer7 = "false"
shader8 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-mdapt/hsm-mdapt-pass3.slang"
wrap_mode8 = "clamp_to_border"
mipmap_input8 = "false"
alias8 = ""
float_framebuffer8 = "false"
srgb_framebuffer8 = "false"
shader9 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-mdapt/hsm-mdapt-pass4.slang"
wrap_mode9 = "clamp_to_border"
mipmap_input9 = "false"
alias9 = ""
float_framebuffer9 = "false"
srgb_framebuffer9 = "false"
shader10 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-sgenpt-mix/hsm-sgenpt-mix.slang"
wrap_mode10 = "clamp_to_border"
mipmap_input10 = "false"
alias10 = ""
float_framebuffer10 = "false"
srgb_framebuffer10 = "false"
shader11 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-ps1dither/hsm-PS1-Undither-BoxBlur.slang"
wrap_mode11 = "clamp_to_border"
mipmap_input11 = "false"
alias11 = ""
float_framebuffer11 = "false"
srgb_framebuffer11 = "false"
shader12 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/hsm-custom-fast-sharpen.slang"
filter_linear12 = "false"
wrap_mode12 = "clamp_to_border"
mipmap_input12 = "false"
alias12 = ""
float_framebuffer12 = "true"
srgb_framebuffer12 = "true"
shader13 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-dogway/hsm-grade.slang"
wrap_mode13 = "clamp_to_border"
mipmap_input13 = "false"
alias13 = ""
float_framebuffer13 = "false"
srgb_framebuffer13 = "false"
shader14 = "shaders_slang/stock.slang"
wrap_mode14 = "clamp_to_border"
mipmap_input14 = "false"
alias14 = "refpass"
float_framebuffer14 = "false"
srgb_framebuffer14 = "false"
shader15 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-scalefx/hsm-scalefx-pass0.slang"
filter_linear15 = "false"
wrap_mode15 = "clamp_to_border"
mipmap_input15 = "false"
alias15 = "scalefx_pass0"
float_framebuffer15 = "true"
srgb_framebuffer15 = "false"
scale_type_x15 = "source"
scale_x15 = "1.000000"
scale_type_y15 = "source"
scale_y15 = "1.000000"
shader16 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-scalefx/hsm-scalefx-pass1.slang"
filter_linear16 = "false"
wrap_mode16 = "clamp_to_border"
mipmap_input16 = "false"
alias16 = ""
float_framebuffer16 = "false"
srgb_framebuffer16 = "false"
scale_type_x16 = "source"
scale_x16 = "1.000000"
scale_type_y16 = "source"
scale_y16 = "1.000000"
shader17 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-scalefx/hsm-scalefx-pass2.slang"
filter_linear17 = "false"
wrap_mode17 = "clamp_to_border"
mipmap_input17 = "false"
alias17 = ""
float_framebuffer17 = "false"
srgb_framebuffer17 = "false"
scale_type_x17 = "source"
scale_x17 = "1.000000"
scale_type_y17 = "source"
scale_y17 = "1.000000"
shader18 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-scalefx/hsm-scalefx-pass3.slang"
filter_linear18 = "false"
wrap_mode18 = "clamp_to_border"
mipmap_input18 = "false"
alias18 = ""
float_framebuffer18 = "false"
srgb_framebuffer18 = "false"
scale_type_x18 = "source"
scale_x18 = "1.000000"
scale_type_y18 = "source"
scale_y18 = "1.000000"
shader19 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-scalefx/hsm-scalefx-pass4.slang"
filter_linear19 = "false"
wrap_mode19 = "clamp_to_border"
mipmap_input19 = "false"
alias19 = ""
float_framebuffer19 = "false"
srgb_framebuffer19 = "false"
scale_type_x19 = "source"
scale_x19 = "3.000000"
scale_type_y19 = "source"
scale_y19 = "3.000000"
shader20 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-gtu/hsm-gtu-pass1.slang"
wrap_mode20 = "clamp_to_border"
mipmap_input20 = "false"
alias20 = ""
float_framebuffer20 = "true"
srgb_framebuffer20 = "false"
scale_type_x20 = "source"
scale_x20 = "1.000000"
scale_type_y20 = "source"
scale_y20 = "1.000000"
shader21 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-gtu/hsm-gtu-pass2.slang"
filter_linear21 = "false"
wrap_mode21 = "clamp_to_border"
mipmap_input21 = "false"
alias21 = ""
float_framebuffer21 = "true"
srgb_framebuffer21 = "false"
scale_type_x21 = "source"
scale_x21 = "1.000000"
scale_type_y21 = "source"
scale_y21 = "1.000000"
shader22 = "shaders_slang/stock.slang"
wrap_mode22 = "clamp_to_border"
mipmap_input22 = "false"
alias22 = "PreCRTPass"
float_framebuffer22 = "false"
srgb_framebuffer22 = "false"
shader23 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/hsm-afterglow0.slang"
filter_linear23 = "false"
wrap_mode23 = "clamp_to_border"
mipmap_input23 = "false"
alias23 = "AfterglowPass"
float_framebuffer23 = "false"
srgb_framebuffer23 = "false"
scale_type_x23 = "source"
scale_x23 = "1.000000"
scale_type_y23 = "source"
scale_y23 = "1.000000"
shader24 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/hsm-pre-shaders-afterglow.slang"
filter_linear24 = "false"
wrap_mode24 = "clamp_to_border"
mipmap_input24 = "true"
alias24 = "PrePass"
float_framebuffer24 = "false"
srgb_framebuffer24 = "false"
scale_type_x24 = "source"
scale_x24 = "1.000000"
scale_type_y24 = "source"
scale_y24 = "1.000000"
shader25 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/hsm-avg-lum.slang"
filter_linear25 = "true"
wrap_mode25 = "clamp_to_border"
mipmap_input25 = "true"
alias25 = "AvgLumPass"
float_framebuffer25 = "false"
srgb_framebuffer25 = "false"
scale_type_x25 = "source"
scale_x25 = "1.000000"
scale_type_y25 = "source"
scale_y25 = "1.000000"
shader26 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/hsm-interlace-and-linearize.slang"
filter_linear26 = "true"
wrap_mode26 = "clamp_to_border"
mipmap_input26 = "false"
alias26 = "LinearizePass"
float_framebuffer26 = "true"
srgb_framebuffer26 = "false"
scale_type_x26 = "source"
scale_x26 = "1.000000"
scale_type_y26 = "source"
scale_y26 = "1.000000"
shader27 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/hsm-gaussian_horizontal.slang"
filter_linear27 = "true"
wrap_mode27 = "clamp_to_border"
mipmap_input27 = "false"
alias27 = ""
float_framebuffer27 = "true"
srgb_framebuffer27 = "false"
scale_type_x27 = "absolute"
scale_x27 = "800"
scale_type_y27 = "source"
scale_y27 = "1.000000"
shader28 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/hsm-gaussian_vertical.slang"
filter_linear28 = "true"
wrap_mode28 = "clamp_to_border"
mipmap_input28 = "false"
alias28 = "GlowPass"
float_framebuffer28 = "true"
srgb_framebuffer28 = "false"
scale_type_x28 = "absolute"
scale_x28 = "800"
scale_type_y28 = "absolute"
scale_y28 = "600"
shader29 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/hsm-bloom_horizontal.slang"
filter_linear29 = "true"
wrap_mode29 = "clamp_to_border"
mipmap_input29 = "false"
alias29 = ""
float_framebuffer29 = "true"
srgb_framebuffer29 = "false"
scale_type_x29 = "absolute"
scale_x29 = "800"
scale_type_y29 = "absolute"
scale_y29 = "600"
shader30 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/hsm-bloom_vertical.slang"
filter_linear30 = "true"
wrap_mode30 = "clamp_to_border"
mipmap_input30 = "false"
alias30 = "BloomPass"
float_framebuffer30 = "true"
srgb_framebuffer30 = "false"
scale_type_x30 = "source"
scale_x30 = "1.000000"
scale_type_y30 = "source"
scale_y30 = "1.000000"
shader31 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/hsm-crt-guest-advanced.slang"
filter_linear31 = "true"
wrap_mode31 = "clamp_to_border"
mipmap_input31 = "false"
alias31 = ""
float_framebuffer31 = "false"
srgb_framebuffer31 = "false"
scale_type_x31 = "viewport"
scale_x31 = "1.000000"
scale_type_y31 = "viewport"
scale_y31 = "1.000000"
shader32 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/hsm-deconvergence.slang"
filter_linear32 = "true"
wrap_mode32 = "clamp_to_border"
mipmap_input32 = "false"
alias32 = ""
float_framebuffer32 = "false"
srgb_framebuffer32 = "false"
scale_type_x32 = "viewport"
scale_x32 = "1.000000"
scale_type_y32 = "viewport"
scale_y32 = "1.000000"
shader33 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm/hsm-prep-post-crt.slang"
wrap_mode33 = "clamp_to_border"
mipmap_input33 = "false"
alias33 = "MBZ_PostCRTPass"
float_framebuffer33 = "false"
srgb_framebuffer33 = "false"
shader34 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm/hsm-linearize-crt.slang"
filter_linear34 = "true"
wrap_mode34 = "clamp_to_border"
mipmap_input34 = "true"
alias34 = "BR_MirrorLowResPass"
float_framebuffer34 = "false"
srgb_framebuffer34 = "false"
scale_type_x34 = "absolute"
scale_x34 = "800"
scale_type_y34 = "absolute"
scale_y34 = "600"
shader35 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm/hsm-blur-outside-screen-horiz.slang"
filter_linear35 = "true"
wrap_mode35 = "clamp_to_border"
mipmap_input35 = "true"
alias35 = ""
float_framebuffer35 = "false"
srgb_framebuffer35 = "false"
shader36 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm/hsm-blur-outside-screen-vert.slang"
filter_linear36 = "true"
wrap_mode36 = "clamp_to_border"
mipmap_input36 = "false"
alias36 = "BR_MirrorBlurredPass"
float_framebuffer36 = "false"
srgb_framebuffer36 = "false"
shader37 = "shaders_slang/blurs/blur9x9.slang"
filter_linear37 = "true"
wrap_mode37 = "clamp_to_border"
mipmap_input37 = "true"
alias37 = "BR_MirrorReflectionDiffusedPass"
float_framebuffer37 = "false"
srgb_framebuffer37 = "false"
scale_type_x37 = "absolute"
scale_x37 = "128"
scale_type_y37 = "absolute"
scale_y37 = "128"
shader38 = "shaders_slang/blurs/blur9x9.slang"
filter_linear38 = "true"
wrap_mode38 = "clamp_to_border"
mipmap_input38 = "true"
alias38 = "BR_MirrorFullscreenGlowPass"
float_framebuffer38 = "false"
srgb_framebuffer38 = "false"
scale_type_x38 = "absolute"
scale_x38 = "12"
scale_type_y38 = "absolute"
scale_y38 = "12"
shader39 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm/hsm-bezel-reflection-standard.slang"
wrap_mode39 = "clamp_to_border"
mipmap_input39 = "false"
alias39 = "BR_CRTAndReflectionPass"
float_framebuffer39 = "true"
srgb_framebuffer39 = "false"
scale_type_x39 = "viewport"
scale_x39 = "1.000000"
scale_type_y39 = "viewport"
scale_y39 = "1.000000"
HSM_INT_SCALE_MODE = "1.000000"
HSM_INT_SCALE_BORDER_MIN_HEIGHT = "0.000000"
HSM_NON_INTEGER_SCALE = "100.169739"
HSM_CURVATURE_MODE = "-1.000000"
HSM_GAMMA_IN_LINEARIZE = "2.399999"
HSM_GAMMA_OUT_CRT = "1.600001"
HSM_POST_CRT_BRIGHTNESS = "700.000000"
HSM_TUBE_BLACK_EDGE_CURVATURE_SCALE = "1000.000000"
HSM_FRM_THICKNESS = "150.000000"
g_gamma_out = "2.550000"
g_crtgamut = "0.000000"
g_vignette = "0.000000"
wp_temperature = "6504.000000"
WP = "-100.000000"
glow = "0.005000"
brightboost = "1.000000"
brightboost1 = "1.000000"
gsl = "1.000000"
beam_min = "1.700000"
beam_max = "1.700000"
beam_size = "1.000000"
vertmask = "0.200000"
scans = "1.000000"
spike = "0.000000"
h_sharp = "4.500000"
s_sharp = "0.000000"
maskstr = "1.000000"
mcut = "1.000000"
masksize = "1.000000"
mask_gamma = "2.399999"
slotwidth = "3.000000"
mclip = "0.000000"
decons = "-0.000000"
textures = "SamplerLUT1;SamplerLUT2;SamplerLUT3;SamplerLUT4;IntroImage;ScreenPlacementImage;ColoredGelImage;TubeStaticReflectionImage;BackgroundImage;BackgroundVertImage;ReflectionMaskImage;FrameTextureImage;CabinetGlassImage;DeviceImage;DeviceVertImage;DecalImage;NightLightingImage;LEDImage;TopLayerImage"
SamplerLUT1 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/lut/trinitron-lut.png"
SamplerLUT1_linear = "true"
SamplerLUT1_wrap_mode = "clamp_to_border"
SamplerLUT1_mipmap = "false"
SamplerLUT2 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/lut/inv-trinitron-lut.png"
SamplerLUT2_linear = "true"
SamplerLUT2_wrap_mode = "clamp_to_border"
SamplerLUT2_mipmap = "false"
SamplerLUT3 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/lut/nec-lut.png"
SamplerLUT3_linear = "true"
SamplerLUT3_wrap_mode = "clamp_to_border"
SamplerLUT3_mipmap = "false"
SamplerLUT4 = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/hsm-guest/lut/ntsc-lut.png"
SamplerLUT4_linear = "true"
SamplerLUT4_wrap_mode = "clamp_to_border"
SamplerLUT4_mipmap = "false"
IntroImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/IntroImage_MegaBezelLogo.png"
IntroImage_linear = "true"
IntroImage_wrap_mode = "clamp_to_border"
IntroImage_mipmap = "false"
ScreenPlacementImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/Placeholder_Transparent_16x16.png"
ScreenPlacementImage_linear = "false"
ScreenPlacementImage_wrap_mode = "clamp_to_border"
ScreenPlacementImage_mipmap = "false"
ColoredGelImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/Placeholder_Transparent_16x16.png"
ColoredGelImage_linear = "true"
ColoredGelImage_wrap_mode = "clamp_to_border"
ColoredGelImage_mipmap = "false"
TubeStaticReflectionImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/TubeGlassOverlayImage_3840x2160.png"
TubeStaticReflectionImage_linear = "true"
TubeStaticReflectionImage_wrap_mode = "clamp_to_border"
TubeStaticReflectionImage_mipmap = "false"
BackgroundImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/BackgroundImage_Carbon_3840x2160.png"
BackgroundImage_linear = "true"
BackgroundImage_wrap_mode = "clamp_to_border"
BackgroundImage_mipmap = "false"
BackgroundVertImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/BackgroundImage_Carbon_3840x2160.png"
BackgroundVertImage_linear = "true"
BackgroundVertImage_wrap_mode = "clamp_to_border"
BackgroundVertImage_mipmap = "false"
ReflectionMaskImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/Placeholder_White_16x16.png"
ReflectionMaskImage_linear = "true"
ReflectionMaskImage_wrap_mode = "clamp_to_border"
ReflectionMaskImage_mipmap = "false"
FrameTextureImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/FrameTexture_2800x2120.png"
FrameTextureImage_linear = "true"
FrameTextureImage_wrap_mode = "clamp_to_border"
FrameTextureImage_mipmap = "false"
CabinetGlassImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/Placeholder_Transparent_16x16.png"
CabinetGlassImage_linear = "true"
CabinetGlassImage_wrap_mode = "clamp_to_border"
CabinetGlassImage_mipmap = "false"
DeviceImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/Placeholder_Transparent_16x16.png"
DeviceImage_linear = "true"
DeviceImage_wrap_mode = "clamp_to_border"
DeviceImage_mipmap = "false"
DeviceVertImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/Placeholder_Transparent_16x16.png"
DeviceVertImage_linear = "true"
DeviceVertImage_wrap_mode = "clamp_to_border"
DeviceVertImage_mipmap = "false"
DecalImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/Placeholder_Transparent_16x16.png"
DecalImage_linear = "true"
DecalImage_wrap_mode = "clamp_to_border"
DecalImage_mipmap = "false"
NightLightingImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/NightLighting_3840x2160.jpg"
NightLightingImage_linear = "true"
NightLightingImage_wrap_mode = "clamp_to_border"
NightLightingImage_mipmap = "false"
LEDImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/Placeholder_Transparent_16x16.png"
LEDImage_linear = "true"
LEDImage_wrap_mode = "clamp_to_border"
LEDImage_mipmap = "false"
TopLayerImage = "shaders_slang/bezel/Mega_Bezel/shaders/HyperspaceMadness/textures/Placeholder_Transparent_16x16.png"
TopLayerImage_linear = "true"
TopLayerImage_wrap_mode = "clamp_to_border"
TopLayerImage_mipmap = "false"

Notes:

The TVL is 540 based on the number of triads and the screen resolution. This makes it similar to a PVM, so I’ve tried to match the beam shape to what I see on PVMs. However, the scanline dark/bright levels also directly affect the overall brightness and saturation of the image and this is taken into consideration as well.

7 Likes

Looking forward to how this develops!

4 Likes

I have one too:

Real Sony Trinitron TV:

And Shader:

3 Likes

Nice, are those the settings I posted above?

1 Like

Not exactly the same settings, but the mask strength is @ 100% like yours.

1 Like

Also be sure to set “keep mask with clipping” to 0.00 or you lose mask strength in the brights.

The goal here is to avoid subpixel artifacts completely, so you have to lose the curvature and you’re very restricted in what masks you can use.

another screenshot

2 Likes

Thanks, I will try this out.

1 Like

you can confirm subpixel structure on your display by taking a picture of the left edge of the screen while it’s displaying 100% white.

Like so:

You can see that the subpixel order is RGB. If it’s something other than this you’ll need a small alteration to the mask code.

1 Like

Here I have gamma in/out at 2.50/1.50. This is one of those games where you can tell if color is going bad really easily. The more you increase post CRT brightness, the more of an adjustment needs to be made to gamma. I’m just looking for the point where you can’t push this any further without breaking the image in some way (basically, crushing blacks, clipping whites, etc).

2 Likes

A white pattern is indeed the best way to evaluate the mask properly. I will look at it when I’m home.

1 Like

Just to clarify, I meant display a 100% white pattern on the screen. No shader effects or anything, just a pure white screen. That way you can determine what the LCD subpixels look like. If it’s something other than RGB, then the magenta/green mask won’t work properly, you might need blue/yellow or red/cyan.

But yes a white screen in-game with shaders applied is also the best way to evaluate the masks :slight_smile:

1 Like

CRT Brightness too high does white clipping. That’s why I don’t go over 200. In most games it is fine and looks just like Blooming of a real CRT.

2 Likes

Ah ok, got it. I have an OLED, which probably has RGBW.

2 Likes

So far I’ve managed to avoid clipping by messing with gamma and scanline brightness levels, but as you can see I’m pushing it pretty hard, I’ve got some “soft clipping” which is tolerable most of the time.

It’s a complex relationship between gamma in/out, scanline bright/dark shape and brightness levels and post-CRT brightness, at some point you can’t increase brightness anymore without increasing scanline darkness or increasing the gap between gamma in/out.

1 Like

Oh yeah, that changes things. In that case just use mask 7(?) or whichever one is the BW Trinitron mask, it’s really your best option with RGBW pixels. It’s kind of a different beast from mask 0, you have to do different compensations.

1 Like

A greyscale pattern is very usable for this. Better than just Eye balling.

1 Like

That’s what I use, mask 7. And the advantage is, that it is brighter than RGB mask. For me honestly it is perfect.

1 Like

Mask 7 can be quite nice, the disadvantage is that you lose the subpixel detail and accuracy of using the magenta/green pattern with RGB subpixels. The only time this really matters is when you’re taking extreme close ups of the screen, but hey, I did say “the most accurate CRT experience possible” :wink: I think the extra detail does something to the overall image that makes it easier on the eyes, but that’s subjective.

2 Likes

And on a real Trinitron you also can’t see the RGB mask from a normal distance, that’s why I think the white mask 7 is fine and leaves much headroom brightness wise. Also I keep the scanlines muted and not thick like on a BVM. That too saves brightness and also matches my taste better. Consumer Low line TV’s have very faint scanlines at best. I leave scanlines at 0 in the shader and it looks very natural.

2 Likes

Just because you can’t see the mask at normal distance doesn’t mean it’s not doing something to the overall image, and I would argue that it does make a difference in the way scanlines look at high contrast edges and vertical edges if there’s deconvergence involved. It’s a lot like a pointilist painting where you move back far enough and you can no longer see the dots, just a smooth image.

What I don’t want this thread to turn into is a debate over preferences, I’ve clearly stated the goal of the thread.

3 Likes