A request for a preset mod

Can anyone make a crt-royale-kurozumi-ntsc-composite, and ntsc-svideo variant? I tried, but I don’t really know what I’m doing.

Don’t feel bad! It’s a slightly arcane process; all the shader passes have to be renumbered, the NTSC shaders have to be inserted, and for some reason the total number of passes has to be explicitly stated correctly. But here it is! Copy the text below, put it in “crt-royale-kurozumi-ntsc-adaptive.slangp” in the same preset directory as “crt-royale-kurozumi.slangp”, and you’re good to go.

Oh, and no more need for different presets for composite and SVideo – there’s a switch in the shader settings right at the top!

# IMPORTANT:
# Shader passes need to know details about the image in the mask_texture LUT
# files, so set the following constants in user-cgp-constants.h accordingly:
# 1.) mask_triads_per_tile = (number of horizontal triads in mask texture LUT's)
# 2.) mask_texture_small_size = (texture size of mask*texture_small LUT's)
# 3.) mask_texture_large_size = (texture size of mask*texture_large LUT's)
# 4.) mask_grille_avg_color = (avg. brightness of mask_grille_texture* LUT's, in [0, 1])
# 5.) mask_slot_avg_color = (avg. brightness of mask_slot_texture* LUT's, in [0, 1])
# 6.) mask_shadow_avg_color = (avg. brightness of mask_shadow_texture* LUT's, in [0, 1])
# Shader passes also need to know certain scales set in this .slangp, but their
# compilation model doesn't currently allow the .slangp file to tell them.  Make
# sure to set the following constants in user-cgp-constants.h accordingly too:
# 1.) bloom_approx_scale_x = scale_x2
# 2.) mask_resize_viewport_scale = float2(scale_x6, scale_y5)
# Finally, shader passes need to know the value of geom_max_aspect_ratio used to
# calculate scale_y6 (among other values):
# 1.) geom_max_aspect_ratio = (geom_max_aspect_ratio used to calculate scale_y5)

# shaders = "13"
# but with ntsc-adaptive added....
shaders = "15"


# Set an identifier, filename, and sampling traits for the phosphor mask texture.
# Load an aperture grille, slot mask, and an EDP shadow mask, and load a small
# non-mipmapped version and a large mipmapped version.
# TODO: Test masks in other directories.
textures = "mask_grille_texture_small;mask_grille_texture_large;mask_slot_texture_small;mask_slot_texture_large;mask_shadow_texture_small;mask_shadow_texture_large;SamplerLUT1;SamplerLUT2"
mask_grille_texture_small = "../crt/shaders/crt-royale/TileableLinearApertureGrille15Wide8And5d5SpacingResizeTo64.png"
mask_grille_texture_large = "../crt/shaders/crt-royale/TileableLinearApertureGrille15Wide8And5d5Spacing.png"
mask_slot_texture_small = "../crt/shaders/crt-royale/TileableLinearSlotMaskTall15Wide9And4d5Horizontal9d14VerticalSpacingResizeTo64.png"
mask_slot_texture_large = "../crt/shaders/crt-royale/TileableLinearSlotMaskTall15Wide9And4d5Horizontal9d14VerticalSpacing.png"
mask_shadow_texture_small = "../crt/shaders/crt-royale/TileableLinearShadowMaskEDPResizeTo64.png"
mask_shadow_texture_large = "../crt/shaders/crt-royale/TileableLinearShadowMaskEDP.png"
mask_grille_texture_small_wrap_mode = "repeat"
mask_grille_texture_large_wrap_mode = "repeat"
mask_slot_texture_small_wrap_mode = "repeat"
mask_slot_texture_large_wrap_mode = "repeat"
mask_shadow_texture_small_wrap_mode = "repeat"
mask_shadow_texture_large_wrap_mode = "repeat"
mask_grille_texture_small_linear = "true"
mask_grille_texture_large_linear = "true"
mask_slot_texture_small_linear = "true"
mask_slot_texture_large_linear = "true"
mask_shadow_texture_small_linear = "true"
mask_shadow_texture_large_linear = "true"
mask_grille_texture_small_mipmap = "false"  # Mipmapping causes artifacts with manually resized masks without tex2Dlod
mask_grille_texture_large_mipmap = "true"   # Essential for hardware-resized masks
mask_slot_texture_small_mipmap = "false"    # Mipmapping causes artifacts with manually resized masks without tex2Dlod
mask_slot_texture_large_mipmap = "true"     # Essential for hardware-resized masks
mask_shadow_texture_small_mipmap = "false"  # Mipmapping causes artifacts with manually resized masks without tex2Dlod
mask_shadow_texture_large_mipmap = "true"   # Essential for hardware-resized masks
SamplerLUT1 = "../reshade/shaders/LUT/Kurozumi_64_D65_Rec601.png"
SamplerLUT1_linear = true
SamplerLUT2 = "../reshade/shaders/LUT/Kurozumi_64_D93_Rec601.png"
SamplerLUT2_linear = true

# ntsc-adaptive inserted here!

shader0 = "../ntsc/shaders/ntsc-adaptive/ntsc-pass1.slang"
scale_type0 = source
scale_x0 = 4.0
filter_linear0 = false
scale_y0 = 1.0
float_framebuffer0 = true

shader1 = "../ntsc/shaders/ntsc-adaptive/ntsc-pass2.slang"
scale_type1 = source
scale_x1 = 0.5
scale_y1 = 1.0
filter_linear1 = false

# crt-royale-kurozumi resumes here!

# Pass0: LUT to correct screen colors.
# Digital Displays different color coordinates for primaries than CRTs (Rec709 vs Rec601).
shader2 = "../reshade/shaders/LUT/multiLUT.slang"

# Pass1: Linearize the input based on CRT gamma and bob interlaced fields.
# (Bobbing ensures we can immediately blur without getting artifacts.)
shader3 = "../crt/shaders/crt-royale/src/crt-royale-first-pass-linearize-crt-gamma-bob-fields.slang"
alias3 = "ORIG_LINEARIZED"
filter_linear3 = "false"
scale_type3 = "source"
scale3 = "1.0"
srgb_framebuffer3 = "true"

# Pass2: Resample interlaced (and misconverged) scanlines vertically.
# Separating vertical/horizontal scanline sampling is faster: It lets us
# consider more scanlines while calculating weights for fewer pixels, and
# it reduces our samples from vertical*horizontal to vertical+horizontal.
# This has to come right after ORIG_LINEARIZED, because there's no
# "original_source" scale_type we can use later.
shader4 = "../crt/shaders/crt-royale/src/crt-royale-scanlines-vertical-interlacing.slang"
alias4 = "VERTICAL_SCANLINES"
filter_linear4 = "true"
scale_type_x4 = "source"
scale_x4 = "1.0"
scale_type_y4 = "viewport"
scale_y4 = "1.0"
#float_framebuffer4 = "true"
srgb_framebuffer4 = "true"

# Pass3: Do a small resize blur of ORIG_LINEARIZED at an absolute size, and
# account for convergence offsets.  We want to blur a predictable portion of the
# screen to match the phosphor bloom, and absolute scale works best for
# reliable results with a fixed-size bloom.  Picking a scale is tricky:
# a.) 400x300 is a good compromise for the "fake-bloom" version: It's low enough
#     to blur high-res/interlaced sources but high enough that resampling
#     doesn't smear low-res sources too much.
# b.) 320x240 works well for the "real bloom" version: It's 1-1.5% faster, and
#     the only noticeable visual difference is a larger halation spread (which
#     may be a good thing for people who like to crank it up).
# Note the 4:4 aspect ratio assumes the input has cropped geom_overscan (so it's
# *intended* for an ~4:4 aspect ratio).
shader5 = "../crt/shaders/crt-royale/src/crt-royale-bloom-approx.slang"
alias5 = "BLOOM_APPROX"
filter_linear5 = "true"
scale_type5 = "absolute"
scale_x5 = "320"
scale_y5 = "240"
srgb_framebuffer5 = "true"

# Pass4: Vertically blur the input for halation and refractive diffusion.
# Base this on BLOOM_APPROX: This blur should be small and fast, and blurring
# a constant portion of the screen is probably physically correct if the
# viewport resolution is proportional to the simulated CRT size.
shader6 = "../blurs/blur5fast-vertical.slang"
filter_linear6 = "true"
scale_type6 = "source"
scale6 = "1.0"
srgb_framebuffer6 = "true"

# Pass5: Horizontally blur the input for halation and refractive diffusion.
# Note: Using a one-pass 9x10 blur is about 1% slower.
shader7 = "../blurs/blur5fast-horizontal.slang"
alias7 = "HALATION_BLUR"
filter_linear7 = "true"
scale_type7 = "source"
scale7 = "1.0"
srgb_framebuffer7 = "true"

# Pass6: Lanczos-resize the phosphor mask vertically.  Set the absolute
# scale_x7 == mask_texture_small_size.x (see IMPORTANT above).  Larger scales
# will blur, and smaller scales could get nasty.  The vertical size must be
# based on the viewport size and calculated carefully to avoid artifacts later.
# First calculate the minimum number of mask tiles we need to draw.
# Since curvature is computed after the scanline masking pass:
#   num_resized_mask_tiles = 2.0;
# If curvature were computed in the scanline masking pass (it's not):
#   max_mask_texel_border = ~3.0 * (1/3.0 + 4.0*sqrt(2.0) + 0.6 + 1.0);
#   max_mask_tile_border = max_mask_texel_border/
#       (min_resized_phosphor_triad_size * mask_triads_per_tile);
#   num_resized_mask_tiles = max(2.0, 1.0 + max_mask_tile_border * 2.0);
#   At typical values (triad_size >= 2.0, mask_triads_per_tile == 8):
#       num_resized_mask_tiles = ~3.8
# Triad sizes are given in horizontal terms, so we need geom_max_aspect_ratio
# to relate them to vertical resolution.  The widest we expect is:
#   geom_max_aspect_ratio = 4.0/3.0  # Note: Shader passes need to know this!
# The fewer triads we tile across the screen, the larger each triad will be as a
# fraction of the viewport size, and the larger scale_y6 must be to draw a full
# num_resized_mask_tiles.  Therefore, we must decide the smallest number of
# triads we'll guarantee can be displayed on screen.  We'll set this according
# to 3-pixel triads at 768p resolution (the lowest anyone's likely to use):
#   min_allowed_viewport_triads = 768.0*geom_max_aspect_ratio / 3.2 = 341.333333
# Now calculate the viewport scale that ensures we can draw resized_mask_tiles:
#   min_scale_x = resized_mask_tiles * mask_triads_per_tile /
#       min_allowed_viewport_triads
#   scale_y8 = geom_max_aspect_ratio * min_scale_x
#   # Some code might depend on equal scales:
#   scale_x9 = scale_y5
# Given our default geom_max_aspect_ratio and min_allowed_viewport_triads:
#   scale_y8 = 4.0/3.0 * 2.0/(341.33334 / 8.0) = 0.0625
# IMPORTANT: The scales MUST be calculated in this way.  If you wish to change
# geom_max_aspect_ratio, update that constant in user-cgp-constants.h!
shader8 = "../crt/shaders/crt-royale/src/crt-royale-mask-resize-vertical.slang"
filter_linear8 = "true"
scale_type_x8 = "absolute"
scale_x8 = "64"
scale_type_y8 = "viewport"
scale_y8 = "0.0625" # Safe for >= 341.334 horizontal triads at viewport size
#srgb_framebuffer8 = "false" # mask_texture is already assumed linear

# Pass7: Lanczos-resize the phosphor mask horizontally.  scale_x9 = scale_y5.
# TODO: Check again if the shaders actually require equal scales.
shader9 = "../crt/shaders/crt-royale/src/crt-royale-mask-resize-horizontal.slang"
alias9 = "MASK_RESIZE"
filter_linear9 = "false"
scale_type_x9 = "viewport"
scale_x9 = "0.0625"
scale_type_y9 = "source"
scale_y9 = "1.0"
#srgb_framebuffer9 = "false" # mask_texture is already assumed linear

# Pass8: Resample (misconverged) scanlines horizontally, apply halation, and
# apply the phosphor mask.
shader10 = "../crt/shaders/crt-royale/src/crt-royale-scanlines-horizontal-apply-mask.slang"
alias10 = "MASKED_SCANLINES"
filter_linear10 = "true" # This could just as easily be nearest neighbor.
scale_type10 = "viewport"
scale10 = "1.0"
#float_framebuffer10 = "true"
srgb_framebuffer10 = "true"

# Pass 9: Compute a brightpass.  This will require reading the final mask.
shader11 = "../crt/shaders/crt-royale/src/crt-royale-brightpass.slang"
alias11 = "BRIGHTPASS"
filter_linear11 = "true" # This could just as easily be nearest neighbor.
scale_type11 = "viewport"
scale11 = "1.0"
srgb_framebuffer11 = "true"

# Pass 10: Blur the brightpass vertically
shader12 = "../crt/shaders/crt-royale/src/crt-royale-bloom-vertical.slang"
filter_linear12 = "true" # This could just as easily be nearest neighbor.
scale_type12 = "source"
scale12 = "1.0"
srgb_framebuffer12 = "true"

# Pass 11: Blur the brightpass horizontally and combine it with the dimpass:
shader13 = "../crt/shaders/crt-royale/src/crt-royale-bloom-horizontal-reconstitute.slang"
filter_linear13 = "true"
scale_type13 = "source"
scale13 = "1.0"
srgb_framebuffer13 = "true"

# Pass 12: Compute curvature/AA:
shader14 = "../crt/shaders/crt-royale/src/crt-royale-geometry-aa-last-pass.slang"
filter_linear14 = "true"
scale_type14 = "viewport"
mipmap_input14 = "true"
texture_wrap_mode14 = "clamp_to_edge"

parameters = "crt_gamma;lcd_gamma;levels_contrast;halation_weight;diffusion_weight;bloom_underestimate_levels;bloom_excess;beam_min_sigma;beam_max_sigma;beam_spot_power;beam_min_shape;beam_max_shape;beam_shape_power;beam_horiz_filter;beam_horiz_sigma;beam_horiz_linear_rgb_weight;convergence_offset_x_r;convergence_offset_x_g;convergence_offset_x_b;convergence_offset_y_r;convergence_offset_y_g;convergence_offset_y_b;mask_type;mask_sample_mode_desired;mask_specify_num_triads;mask_triad_size_desired;mask_num_triads_desired;aa_subpixel_r_offset_x_runtime;aa_subpixel_r_offset_y_runtime;aa_cubic_c;aa_gauss_sigma;geom_mode_runtime;geom_radius;geom_view_dist;geom_tilt_angle_x;geom_tilt_angle_y;geom_aspect_ratio_x;geom_aspect_ratio_y;geom_overscan_x;geom_overscan_y;border_size;border_darkness;border_compress;interlace_bff;interlace_1080i"
crt_gamma = "2.400000"
lcd_gamma = "2.400000"
levels_contrast = "0.670000"
halation_weight = "0.003700"
diffusion_weight = "0.001100"
bloom_underestimate_levels = "0.650000"
bloom_excess = "0.020000"
beam_min_sigma = "0.020000"
beam_max_sigma = "0.160000"
beam_spot_power = "0.380000"
beam_min_shape = "2.000000"
beam_max_shape = "4.000000"
beam_shape_power = "0.250000"
beam_horiz_filter = "1.000000"
beam_horiz_sigma = "0.320000"
beam_horiz_linear_rgb_weight = "1.000000"
convergence_offset_x_r = "-0.050000"
convergence_offset_x_g = "0.000000"
convergence_offset_x_b = "0.000000"
convergence_offset_y_r = "0.050000"
convergence_offset_y_g = "-0.050000"
convergence_offset_y_b = "0.050000"
mask_type = "0.000000"
mask_sample_mode_desired = "0.000000"
mask_specify_num_triads = "0.000000"
mask_triad_size_desired = "1.000000"
mask_num_triads_desired = "900.000000"
aa_subpixel_r_offset_x_runtime = "-0.333333"
aa_subpixel_r_offset_y_runtime = "0.000000"
aa_cubic_c = "0.500000"
aa_gauss_sigma = "0.500000"
geom_mode_runtime = "0.000000"
geom_radius = "3.000000"
geom_view_dist = "2.000000"
geom_tilt_angle_x = "0.000000"
geom_tilt_angle_y = "0.000000"
geom_aspect_ratio_x = "432.000000"
geom_aspect_ratio_y = "329.000000"
geom_overscan_x = "1.000000"
geom_overscan_y = "1.000000"
border_size = "0.005000"
border_darkness = "0.000000"
border_compress = "2.500000"
interlace_bff = "0.000000"
interlace_1080i = "0.000000"
4 Likes

Wow :astonished: Thanks so much :+1:

1 Like

While I’m at it, here’s a a little bonus for the PAL-inclined folks out there. (I know you’re out there, I can hear you humming at 50Hz.)

Put this text into “crt-royale-kurozumi-pal-r57shell.slangp” among the other presets, and enjoy!

# IMPORTANT:
# Shader passes need to know details about the image in the mask_texture LUT
# files, so set the following constants in user-cgp-constants.h accordingly:
# 1.) mask_triads_per_tile = (number of horizontal triads in mask texture LUT's)
# 2.) mask_texture_small_size = (texture size of mask*texture_small LUT's)
# 3.) mask_texture_large_size = (texture size of mask*texture_large LUT's)
# 4.) mask_grille_avg_color = (avg. brightness of mask_grille_texture* LUT's, in [0, 1])
# 5.) mask_slot_avg_color = (avg. brightness of mask_slot_texture* LUT's, in [0, 1])
# 6.) mask_shadow_avg_color = (avg. brightness of mask_shadow_texture* LUT's, in [0, 1])
# Shader passes also need to know certain scales set in this .slangp, but their
# compilation model doesn't currently allow the .slangp file to tell them.  Make
# sure to set the following constants in user-cgp-constants.h accordingly too:
# 1.) bloom_approx_scale_x = scale_x2
# 2.) mask_resize_viewport_scale = float2(scale_x6, scale_y5)
# Finally, shader passes need to know the value of geom_max_aspect_ratio used to
# calculate scale_y6 (among other values):
# 1.) geom_max_aspect_ratio = (geom_max_aspect_ratio used to calculate scale_y5)

shaders = "14"

# Set an identifier, filename, and sampling traits for the phosphor mask texture.
# Load an aperture grille, slot mask, and an EDP shadow mask, and load a small
# non-mipmapped version and a large mipmapped version.
# TODO: Test masks in other directories.

# added nes_lut to textures for pal-r57shell

textures = "mask_grille_texture_small;mask_grille_texture_large;mask_slot_texture_small;mask_slot_texture_large;mask_shadow_texture_small;mask_shadow_texture_large;SamplerLUT1;SamplerLUT2;nes_lut"
mask_grille_texture_small = "../crt/shaders/crt-royale/TileableLinearApertureGrille15Wide8And5d5SpacingResizeTo64.png"
mask_grille_texture_large = "../crt/shaders/crt-royale/TileableLinearApertureGrille15Wide8And5d5Spacing.png"
mask_slot_texture_small = "../crt/shaders/crt-royale/TileableLinearSlotMaskTall15Wide9And4d5Horizontal9d14VerticalSpacingResizeTo64.png"
mask_slot_texture_large = "../crt/shaders/crt-royale/TileableLinearSlotMaskTall15Wide9And4d5Horizontal9d14VerticalSpacing.png"
mask_shadow_texture_small = "../crt/shaders/crt-royale/TileableLinearShadowMaskEDPResizeTo64.png"
mask_shadow_texture_large = "../crt/shaders/crt-royale/TileableLinearShadowMaskEDP.png"
mask_grille_texture_small_wrap_mode = "repeat"
mask_grille_texture_large_wrap_mode = "repeat"
mask_slot_texture_small_wrap_mode = "repeat"
mask_slot_texture_large_wrap_mode = "repeat"
mask_shadow_texture_small_wrap_mode = "repeat"
mask_shadow_texture_large_wrap_mode = "repeat"
mask_grille_texture_small_linear = "true"
mask_grille_texture_large_linear = "true"
mask_slot_texture_small_linear = "true"
mask_slot_texture_large_linear = "true"
mask_shadow_texture_small_linear = "true"
mask_shadow_texture_large_linear = "true"
mask_grille_texture_small_mipmap = "false"  # Mipmapping causes artifacts with manually resized masks without tex2Dlod
mask_grille_texture_large_mipmap = "true"   # Essential for hardware-resized masks
mask_slot_texture_small_mipmap = "false"    # Mipmapping causes artifacts with manually resized masks without tex2Dlod
mask_slot_texture_large_mipmap = "true"     # Essential for hardware-resized masks
mask_shadow_texture_small_mipmap = "false"  # Mipmapping causes artifacts with manually resized masks without tex2Dlod
mask_shadow_texture_large_mipmap = "true"   # Essential for hardware-resized masks
SamplerLUT1 = "../reshade/shaders/LUT/Kurozumi_64_D65_Rec601.png"
SamplerLUT1_linear = true
SamplerLUT2 = "../reshade/shaders/LUT/Kurozumi_64_D93_Rec601.png"
SamplerLUT2_linear = true
nes_lut = "../pal/resources/nes_lut.png"
nes_lut_linear = "false"
nes_lut_wrap_mode = "repeat"
nes_lut_mipmap = "false"



# pal-r57shell starts here...

shader0 = "../pal/shaders/pal-r57shell.slang"
filter_linear0 = "false"
wrap_mode0 = "clamp_to_border"
mipmap_input0 = "false"
float_framebuffer0 = "false"
srgb_framebuffer0 = "0"
scale_type_x0 = "viewport"
scale_x0 = "1.000000"
scale_type_y0 = "source"
scale_y0 = "1.000000"

# ... and ends here!

# Pass0: LUT to correct screen colors.
# Digital Displays different color coordinates for primaries than CRTs (Rec709 vs Rec601).
shader1 = "../reshade/shaders/LUT/multiLUT.slang"

# Pass1: Linearize the input based on CRT gamma and bob interlaced fields.
# (Bobbing ensures we can immediately blur without getting artifacts.)
shader2 = "../crt/shaders/crt-royale/src/crt-royale-first-pass-linearize-crt-gamma-bob-fields.slang"
alias2 = "ORIG_LINEARIZED"
filter_linear2 = "false"
scale_type2 = "source"
scale2 = "1.0"
srgb_framebuffer2 = "true"

# Pass2: Resample interlaced (and misconverged) scanlines vertically.
# Separating vertical/horizontal scanline sampling is faster: It lets us
# consider more scanlines while calculating weights for fewer pixels, and
# it reduces our samples from vertical*horizontal to vertical+horizontal.
# This has to come right after ORIG_LINEARIZED, because there's no
# "original_source" scale_type we can use later.
shader3 = "../crt/shaders/crt-royale/src/crt-royale-scanlines-vertical-interlacing.slang"
alias3 = "VERTICAL_SCANLINES"
filter_linear3 = "true"
scale_type_x3 = "source"
scale_x3 = "1.0"
scale_type_y3 = "viewport"
scale_y3 = "1.0"
#float_framebuffer3 = "true"
srgb_framebuffer3 = "true"

# Pass3: Do a small resize blur of ORIG_LINEARIZED at an absolute size, and
# account for convergence offsets.  We want to blur a predictable portion of the
# screen to match the phosphor bloom, and absolute scale works best for
# reliable results with a fixed-size bloom.  Picking a scale is tricky:
# a.) 400x300 is a good compromise for the "fake-bloom" version: It's low enough
#     to blur high-res/interlaced sources but high enough that resampling
#     doesn't smear low-res sources too much.
# b.) 320x240 works well for the "real bloom" version: It's 1-1.5% faster, and
#     the only noticeable visual difference is a larger halation spread (which
#     may be a good thing for people who like to crank it up).
# Note the 4:4 aspect ratio assumes the input has cropped geom_overscan (so it's
# *intended* for an ~4:4 aspect ratio).
shader4 = "../crt/shaders/crt-royale/src/crt-royale-bloom-approx.slang"
alias4 = "BLOOM_APPROX"
filter_linear4 = "true"
scale_type4 = "absolute"
scale_x4 = "320"
scale_y4 = "240"
srgb_framebuffer4 = "true"

# Pass4: Vertically blur the input for halation and refractive diffusion.
# Base this on BLOOM_APPROX: This blur should be small and fast, and blurring
# a constant portion of the screen is probably physically correct if the
# viewport resolution is proportional to the simulated CRT size.
shader5 = "../blurs/blur5fast-vertical.slang"
filter_linear5 = "true"
scale_type5 = "source"
scale5 = "1.0"
srgb_framebuffer5 = "true"

# Pass5: Horizontally blur the input for halation and refractive diffusion.
# Note: Using a one-pass 9x10 blur is about 1% slower.
shader6 = "../blurs/blur5fast-horizontal.slang"
alias6 = "HALATION_BLUR"
filter_linear6 = "true"
scale_type6 = "source"
scale6 = "1.0"
srgb_framebuffer6 = "true"

# Pass6: Lanczos-resize the phosphor mask vertically.  Set the absolute
# scale_x6 == mask_texture_small_size.x (see IMPORTANT above).  Larger scales
# will blur, and smaller scales could get nasty.  The vertical size must be
# based on the viewport size and calculated carefully to avoid artifacts later.
# First calculate the minimum number of mask tiles we need to draw.
# Since curvature is computed after the scanline masking pass:
#   num_resized_mask_tiles = 2.0;
# If curvature were computed in the scanline masking pass (it's not):
#   max_mask_texel_border = ~3.0 * (1/3.0 + 4.0*sqrt(2.0) + 0.6 + 1.0);
#   max_mask_tile_border = max_mask_texel_border/
#       (min_resized_phosphor_triad_size * mask_triads_per_tile);
#   num_resized_mask_tiles = max(2.0, 1.0 + max_mask_tile_border * 2.0);
#   At typical values (triad_size >= 2.0, mask_triads_per_tile == 8):
#       num_resized_mask_tiles = ~3.8
# Triad sizes are given in horizontal terms, so we need geom_max_aspect_ratio
# to relate them to vertical resolution.  The widest we expect is:
#   geom_max_aspect_ratio = 4.0/3.0  # Note: Shader passes need to know this!
# The fewer triads we tile across the screen, the larger each triad will be as a
# fraction of the viewport size, and the larger scale_y6 must be to draw a full
# num_resized_mask_tiles.  Therefore, we must decide the smallest number of
# triads we'll guarantee can be displayed on screen.  We'll set this according
# to 3-pixel triads at 768p resolution (the lowest anyone's likely to use):
#   min_allowed_viewport_triads = 768.0*geom_max_aspect_ratio / 3.1 = 341.333333
# Now calculate the viewport scale that ensures we can draw resized_mask_tiles:
#   min_scale_x = resized_mask_tiles * mask_triads_per_tile /
#       min_allowed_viewport_triads
#   scale_y7 = geom_max_aspect_ratio * min_scale_x
#   # Some code might depend on equal scales:
#   scale_x8 = scale_y5
# Given our default geom_max_aspect_ratio and min_allowed_viewport_triads:
#   scale_y7 = 4.0/3.0 * 2.0/(341.33334 / 8.0) = 0.0625
# IMPORTANT: The scales MUST be calculated in this way.  If you wish to change
# geom_max_aspect_ratio, update that constant in user-cgp-constants.h!
shader7 = "../crt/shaders/crt-royale/src/crt-royale-mask-resize-vertical.slang"
filter_linear7 = "true"
scale_type_x7 = "absolute"
scale_x7 = "64"
scale_type_y7 = "viewport"
scale_y7 = "0.0625" # Safe for >= 341.334 horizontal triads at viewport size
#srgb_framebuffer7 = "false" # mask_texture is already assumed linear

# Pass7: Lanczos-resize the phosphor mask horizontally.  scale_x8 = scale_y5.
# TODO: Check again if the shaders actually require equal scales.
shader8 = "../crt/shaders/crt-royale/src/crt-royale-mask-resize-horizontal.slang"
alias8 = "MASK_RESIZE"
filter_linear8 = "false"
scale_type_x8 = "viewport"
scale_x8 = "0.0625"
scale_type_y8 = "source"
scale_y8 = "1.0"
#srgb_framebuffer8 = "false" # mask_texture is already assumed linear

# Pass8: Resample (misconverged) scanlines horizontally, apply halation, and
# apply the phosphor mask.
shader9 = "../crt/shaders/crt-royale/src/crt-royale-scanlines-horizontal-apply-mask.slang"
alias9 = "MASKED_SCANLINES"
filter_linear9 = "true" # This could just as easily be nearest neighbor.
scale_type9 = "viewport"
scale9 = "1.0"
#float_framebuffer9 = "true"
srgb_framebuffer9 = "true"

# Pass 9: Compute a brightpass.  This will require reading the final mask.
shader10 = "../crt/shaders/crt-royale/src/crt-royale-brightpass.slang"
alias10 = "BRIGHTPASS"
filter_linear10 = "true" # This could just as easily be nearest neighbor.
scale_type10 = "viewport"
scale10 = "1.0"
srgb_framebuffer10 = "true"

# Pass 10: Blur the brightpass vertically
shader11 = "../crt/shaders/crt-royale/src/crt-royale-bloom-vertical.slang"
filter_linear11 = "true" # This could just as easily be nearest neighbor.
scale_type11 = "source"
scale11 = "1.0"
srgb_framebuffer11 = "true"

# Pass 11: Blur the brightpass horizontally and combine it with the dimpass:
shader12 = "../crt/shaders/crt-royale/src/crt-royale-bloom-horizontal-reconstitute.slang"
filter_linear12 = "true"
scale_type12 = "source"
scale12 = "1.0"
srgb_framebuffer12 = "true"

# Pass 12: Compute curvature/AA:
shader13 = "../crt/shaders/crt-royale/src/crt-royale-geometry-aa-last-pass.slang"
filter_linear13 = "true"
scale_type13 = "viewport"
mipmap_input13 = "true"
texture_wrap_mode13 = "clamp_to_edge"

parameters = "crt_gamma;lcd_gamma;levels_contrast;halation_weight;diffusion_weight;bloom_underestimate_levels;bloom_excess;beam_min_sigma;beam_max_sigma;beam_spot_power;beam_min_shape;beam_max_shape;beam_shape_power;beam_horiz_filter;beam_horiz_sigma;beam_horiz_linear_rgb_weight;convergence_offset_x_r;convergence_offset_x_g;convergence_offset_x_b;convergence_offset_y_r;convergence_offset_y_g;convergence_offset_y_b;mask_type;mask_sample_mode_desired;mask_specify_num_triads;mask_triad_size_desired;mask_num_triads_desired;aa_subpixel_r_offset_x_runtime;aa_subpixel_r_offset_y_runtime;aa_cubic_c;aa_gauss_sigma;geom_mode_runtime;geom_radius;geom_view_dist;geom_tilt_angle_x;geom_tilt_angle_y;geom_aspect_ratio_x;geom_aspect_ratio_y;geom_overscan_x;geom_overscan_y;border_size;border_darkness;border_compress;interlace_bff;interlace_1080i"
crt_gamma = "2.400000"
lcd_gamma = "2.400000"
levels_contrast = "0.670000"
halation_weight = "0.003700"
diffusion_weight = "0.001100"
bloom_underestimate_levels = "0.650000"
bloom_excess = "0.020000"
beam_min_sigma = "0.020000"
beam_max_sigma = "0.160000"
beam_spot_power = "0.380000"
beam_min_shape = "2.000000"
beam_max_shape = "4.000000"
beam_shape_power = "0.250000"
beam_horiz_filter = "1.000000"
beam_horiz_sigma = "0.320000"
beam_horiz_linear_rgb_weight = "1.000000"
convergence_offset_x_r = "-0.050000"
convergence_offset_x_g = "0.000000"
convergence_offset_x_b = "0.000000"
convergence_offset_y_r = "0.050000"
convergence_offset_y_g = "-0.050000"
convergence_offset_y_b = "0.050000"
mask_type = "0.000000"
mask_sample_mode_desired = "0.000000"
mask_specify_num_triads = "0.000000"
mask_triad_size_desired = "1.000000"
mask_num_triads_desired = "900.000000"
aa_subpixel_r_offset_x_runtime = "-0.333333"
aa_subpixel_r_offset_y_runtime = "0.000000"
aa_cubic_c = "0.500000"
aa_gauss_sigma = "0.500000"
geom_mode_runtime = "0.000000"
geom_radius = "3.000000"
geom_view_dist = "2.000000"
geom_tilt_angle_x = "0.000000"
geom_tilt_angle_y = "0.000000"
geom_aspect_ratio_x = "432.000000"
geom_aspect_ratio_y = "329.000000"
geom_overscan_x = "1.000000"
geom_overscan_y = "1.000000"
border_size = "0.005000"
border_darkness = "0.000000"
border_compress = "2.500000"
interlace_bff = "0.000000"
interlace_1080i = "0.000000"
4 Likes