From 202d0c7684bcb2824774972e9922a3b686cb940c Mon Sep 17 00:00:00 2001 From: hunterk Date: Thu, 30 Nov 2017 09:03:34 -0600 Subject: [PATCH] crt-royale fixes --- ...oyale-scanlines-vertical-interlacing.slang | 40 +++++++++---------- crt/shaders/crt-royale/src/params.inc | 2 +- .../crt-royale/src/scanline-functions.h | 12 +++--- include/gamma-management.h | 27 +++++++------ presets/crt-royale-kurozumi.slangp | 38 +++++++++++++----- 5 files changed, 66 insertions(+), 53 deletions(-) diff --git a/crt/shaders/crt-royale/src/crt-royale-scanlines-vertical-interlacing.slang b/crt/shaders/crt-royale/src/crt-royale-scanlines-vertical-interlacing.slang index 423ed38..befca65 100755 --- a/crt/shaders/crt-royale/src/crt-royale-scanlines-vertical-interlacing.slang +++ b/crt/shaders/crt-royale/src/crt-royale-scanlines-vertical-interlacing.slang @@ -91,8 +91,6 @@ layout(location = 0) out vec2 tex_uv; layout(location = 1) out vec2 uv_step; // uv size of a texel (x) and scanline (y) layout(location = 2) out vec2 il_step_multiple; // (1, 1) = progressive, (1, 2) = interlaced layout(location = 3) out float pixel_height_in_scanlines; // Height of an output pixel in scanlines -layout(location = 4) out float sigma_range; -layout(location = 5) out float shape_range; void main() { @@ -111,10 +109,11 @@ void main() // values. Compute {sigma, shape}_range outside of scanline_contrib() so // they aren't computed once per scanline (6 times per fragment and up to // 18 times per vertex): - const float sigma_range = max(beam_max_sigma, beam_min_sigma) - - beam_min_sigma; - const float shape_range = max(beam_max_shape, beam_min_shape) - - beam_min_shape; + // TODO/FIXME: if these aren't used, why are they calculated? commenting for now +// const floatsigma_range = max(beam_max_sigma, beam_min_sigma) - +// beam_min_sigma; +// const float shape_range = max(beam_max_shape, beam_min_shape) - +// beam_min_shape; // We need the pixel height in scanlines for antialiased/integral sampling: const float ph = (video_size_.y / IN.output_size.y) / @@ -128,8 +127,6 @@ layout(location = 0) in vec2 tex_uv; layout(location = 1) in vec2 uv_step; // uv size of a texel (x) and scanline (y) layout(location = 2) in vec2 il_step_multiple; // (1, 1) = progressive, (1, 2) = interlaced layout(location = 3) in float pixel_height_in_scanlines; // Height of an output pixel in scanlines -layout(location = 4) in float sigma_range; -layout(location = 5) in float shape_range; layout(location = 0) out vec4 FragColor; layout(set = 0, binding = 2) uniform sampler2D Source; #define input_texture Source @@ -224,29 +221,28 @@ void main() // Calculate {sigma, shape}_range outside of scanline_contrib so it's only // done once per pixel (not 6 times) with runtime params. Don't reuse the // vertex shader calculations, so static versions can be constant-folded. - // TODO/FIXME: nvm, use the ones from the vertex /shrug -/* const float sigma_range = max(beam_max_sigma, beam_min_sigma) - + const float sigma_range = max(beam_max_sigma, beam_min_sigma) - beam_min_sigma; - const float shape_range = max(beam_max_shape, beam_min_shape) - - beam_min_shape;*/ + const float shape_range = max(beam_max_shape, beam_min_shape) - + beam_min_shape; // Calculate and sum final scanline contributions, starting with lines 2/3. // There is no normalization step, because we're not interpolating a // continuous signal. Instead, each scanline is an additive light source. const float3 scanline2_contrib = scanline_contrib(dist2, scanline2_color, ph, sigma_range, shape_range); - const float3 scanline3_contrib = scanline_contrib(abs(float3(1.0) - dist2), + const float3 scanline3_contrib = scanline_contrib(abs(float3(1.0,1.0,1.0) - dist2), scanline3_color, ph, sigma_range, shape_range); float3 scanline_intensity = scanline2_contrib + scanline3_contrib; if(beam_num_scanlines > 5.5) { const float3 scanline0_contrib = - scanline_contrib(dist2 + float3(2.0), scanline0_color, + scanline_contrib(dist2 + float3(2.0,2.0,2.0), scanline0_color, ph, sigma_range, shape_range); const float3 scanline1_contrib = - scanline_contrib(dist2 + float3(1.0), scanline1_color, + scanline_contrib(dist2 + float3(1.0,1.0,1.0), scanline1_color, ph, sigma_range, shape_range); const float3 scanline4_contrib = - scanline_contrib(abs(float3(2.0) - dist2), scanline4_color, + scanline_contrib(abs(float3(2.0,2.0,2.0) - dist2), scanline4_color, ph, sigma_range, shape_range); const float3 scanline5_contrib = scanline_contrib(abs(float3(3.0) - dist2), scanline5_color, @@ -257,13 +253,13 @@ void main() else if(beam_num_scanlines > 4.5) { const float3 scanline1_contrib = - scanline_contrib(dist2 + float3(1.0), scanline1_color, + scanline_contrib(dist2 + float3(1.0,1.0,1.0), scanline1_color, ph, sigma_range, shape_range); const float3 scanline4_contrib = - scanline_contrib(abs(float3(2.0) - dist2), scanline4_color, + scanline_contrib(abs(float3(2.0,2.0,2.0) - dist2), scanline4_color, ph, sigma_range, shape_range); const float3 dist0or5 = lerp( - dist2 + float3(2.0), float3(3.0) - dist2, dist_round); + dist2 + float3(2.0,2.0,2.0), float3(3.0,3.0,3.0) - dist2, dist_round); const float3 scanline0or5_contrib = scanline_contrib( dist0or5, scanline_outside_color, ph, sigma_range, shape_range); scanline_intensity += scanline1_contrib + scanline4_contrib + @@ -272,17 +268,17 @@ void main() else if(beam_num_scanlines > 3.5) { const float3 scanline1_contrib = - scanline_contrib(dist2 + float3(1.0), scanline1_color, + scanline_contrib(dist2 + float3(1.0,1.0,1.0), scanline1_color, ph, sigma_range, shape_range); const float3 scanline4_contrib = - scanline_contrib(abs(float3(2.0) - dist2), scanline4_color, + scanline_contrib(abs(float3(2.0,2.0,2.0) - dist2), scanline4_color, ph, sigma_range, shape_range); scanline_intensity += scanline1_contrib + scanline4_contrib; } else if(beam_num_scanlines > 2.5) { const float3 dist1or4 = lerp( - dist2 + float3(1.0), float3(2.0) - dist2, dist_round); + dist2 + float3(1.0,1.0,1.0), float3(2.0,2.0,2.0) - dist2, dist_round); const float3 scanline1or4_contrib = scanline_contrib( dist1or4, scanline_outside_color, ph, sigma_range, shape_range); scanline_intensity += scanline1or4_contrib; diff --git a/crt/shaders/crt-royale/src/params.inc b/crt/shaders/crt-royale/src/params.inc index 85ce61d..00a847c 100644 --- a/crt/shaders/crt-royale/src/params.inc +++ b/crt/shaders/crt-royale/src/params.inc @@ -13,7 +13,7 @@ #pragma parameter bloom_underestimate_levels "Bloom - Underestimate Levels" 0.8 0.0 5.0 0.01 #define bloom_underestimate_levels global.bloom_underestimate_levels #pragma parameter bloom_excess "Bloom - Excess" 0.0 0.0 1.0 0.005 -#pragma parameter beam_min_sigma "Beam - Min Sigma" 0.15 0.005 1.0 0.005 +#pragma parameter beam_min_sigma "Beam - Min Sigma" 0.02 0.005 1.0 0.005 #define beam_min_sigma global.beam_min_sigma #pragma parameter beam_max_sigma "Beam - Max Sigma" 0.3 0.005 1.0 0.005 #define beam_max_sigma global.beam_max_sigma diff --git a/crt/shaders/crt-royale/src/scanline-functions.h b/crt/shaders/crt-royale/src/scanline-functions.h index 9c4f9e5..a03028c 100644 --- a/crt/shaders/crt-royale/src/scanline-functions.h +++ b/crt/shaders/crt-royale/src/scanline-functions.h @@ -153,9 +153,9 @@ float3 scanline_gaussian_integral_contrib(const float3 dist, return color * 0.5*(integral_high - integral_low)/pixel_height; } -float3 scanline_generalized_gaussian_integral_contrib(const float3 dist, - const float3 color, const float pixel_height, const float sigma_range, - const float shape_range) +float3 scanline_generalized_gaussian_integral_contrib(float3 dist, + float3 color, float pixel_height, float sigma_range, + float shape_range) { // Requires: 1.) Requirements of scanline_gaussian_integral_contrib() // must be met. @@ -222,9 +222,9 @@ float3 scanline_gaussian_sampled_contrib(const float3 dist, const float3 color, } } -float3 scanline_generalized_gaussian_sampled_contrib(const float3 dist, - const float3 color, const float pixel_height, const float sigma_range, - const float shape_range) +float3 scanline_generalized_gaussian_sampled_contrib(float3 dist, + float3 color, float pixel_height, float sigma_range, + float shape_range) { // See scanline_generalized_gaussian_integral_contrib() for details! // generalized sample = diff --git a/include/gamma-management.h b/include/gamma-management.h index 424290a..3d7cb19 100644 --- a/include/gamma-management.h +++ b/include/gamma-management.h @@ -301,7 +301,8 @@ inline float4 decode_gamma_input(const float4 color, const float3 gamma) } //TODO/FIXME: I have no idea why replacing the lookup wrappers with this macro fixes the blurs being offset ¯\_(ツ)_/¯ -#define tex2D_linearize(C, D) decode_input(vec4(texture(C, D))) +//#define tex2D_linearize(C, D) decode_input(vec4(texture(C, D))) +// EDIT: it's the 'const' in front of the coords that's doing it /////////////////////////// TEXTURE LOOKUP WRAPPERS ////////////////////////// @@ -376,18 +377,18 @@ inline float4 tex1Dproj_linearize(const sampler1D tex, const float2 tex_coords, inline float4 tex1Dproj_linearize(const sampler1D tex, const float3 tex_coords, const int texel_off) { return decode_input(tex1Dproj(tex, tex_coords, texel_off)); } -/////////* +*/ // tex2D: -inline float4 tex2D_linearize(const sampler2D tex, const float2 tex_coords) +inline float4 tex2D_linearize(const sampler2D tex, float2 tex_coords) { return decode_input(texture(tex, tex_coords)); } -inline float4 tex2D_linearize(const sampler2D tex, const float3 tex_coords) +inline float4 tex2D_linearize(const sampler2D tex, float3 tex_coords) { return decode_input(texture(tex, tex_coords.xy)); } -inline float4 tex2D_linearize(const sampler2D tex, const float2 tex_coords, const int texel_off) +inline float4 tex2D_linearize(const sampler2D tex, float2 tex_coords, int texel_off) { return decode_input(textureLod(tex, tex_coords, texel_off)); } -inline float4 tex2D_linearize(const sampler2D tex, const float3 tex_coords, const int texel_off) +inline float4 tex2D_linearize(const sampler2D tex, float3 tex_coords, int texel_off) { return decode_input(textureLod(tex, tex_coords.xy, texel_off)); } //inline float4 tex2D_linearize(const sampler2D tex, const float2 tex_coords, const float2 dx, const float2 dy) @@ -415,12 +416,12 @@ inline float4 tex2D_linearize(const sampler2D tex, const float3 tex_coords, cons //inline float4 tex2Dfetch_linearize(const sampler2D tex, const int4 tex_coords, const int texel_off) //{ return decode_input(tex2Dfetch(tex, tex_coords, texel_off)); } -*/ + // tex2Dlod: -inline float4 tex2Dlod_linearize(const sampler2D tex, const float4 tex_coords) +inline float4 tex2Dlod_linearize(const sampler2D tex, float4 tex_coords) { return decode_input(textureLod(tex, tex_coords.xy, 0.0)); } -inline float4 tex2Dlod_linearize(const sampler2D tex, const float4 tex_coords, const int texel_off) +inline float4 tex2Dlod_linearize(const sampler2D tex, float4 tex_coords, int texel_off) { return decode_input(textureLod(tex, tex_coords.xy, texel_off)); } /* // tex2Dproj: @@ -533,14 +534,14 @@ inline float4 tex2Dfetch_linearize_gamma(const sampler2D tex, const int4 tex_coo inline float4 tex2Dfetch_linearize_gamma(const sampler2D tex, const int4 tex_coords, const int texel_off, const float3 gamma) { return decode_gamma_input(tex2Dfetch(tex, tex_coords, texel_off), gamma); } -/////////* +*/ // tex2Dlod: -inline float4 tex2Dlod_linearize_gamma(const sampler2D tex, const float4 tex_coords, const float3 gamma) +inline float4 tex2Dlod_linearize_gamma(const sampler2D tex, float4 tex_coords, float3 gamma) { return decode_gamma_input(textureLod(tex, tex_coords.xy, 0.0), gamma); } -inline float4 tex2Dlod_linearize_gamma(const sampler2D tex, const float4 tex_coords, const int texel_off, const float3 gamma) +inline float4 tex2Dlod_linearize_gamma(const sampler2D tex, float4 tex_coords, int texel_off, float3 gamma) { return decode_gamma_input(textureLod(tex, tex_coords.xy, texel_off), gamma); } -*/ + #endif // GAMMA_MANAGEMENT_H diff --git a/presets/crt-royale-kurozumi.slangp b/presets/crt-royale-kurozumi.slangp index 36bb1ed..32779a7 100755 --- a/presets/crt-royale-kurozumi.slangp +++ b/presets/crt-royale-kurozumi.slangp @@ -1,17 +1,17 @@ # IMPORTANT: # Shader passes need to know details about the image in the mask_texture LUT -# files, so set the following constants in user-preset-constants.h accordingly: +# 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 preset, but their -# compilation model doesn't currently allow the preset file to tell them. Make -# sure to set the following constants in user-preset-constants.h accordingly too: +# 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 = vec2(scale_x6, scale_y5) +# 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_y5 (among other values): # 1.) geom_max_aspect_ratio = (geom_max_aspect_ratio used to calculate scale_y5) @@ -145,7 +145,7 @@ srgb_framebuffer4 = "true" # Given our default geom_max_aspect_ratio and min_allowed_viewport_triads: # scale_y5 = 4.0/3.0 * 2.0/(341.33333 / 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-preset-constants.h! +# geom_max_aspect_ratio, update that constant in user-cgp-constants.h! shader5 = "../crt/shaders/crt-royale/src/crt-royale-mask-resize-vertical.slang" filter_linear5 = "true" scale_type_x5 = "absolute" @@ -205,9 +205,9 @@ mipmap_input11 = "true" texture_wrap_mode11 = "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" -interlace_bff = "0.000000" -beam_horiz_filter = "0.000000" -levels_contrast = "0.600000" +crt_gamma = "2.400000" +lcd_gamma = "2.400000" +levels_contrast = "0.740000" halation_weight = "0.004600" diffusion_weight = "0.001000" bloom_underestimate_levels = "0.800000" @@ -218,7 +218,9 @@ beam_spot_power = "0.370000" beam_min_shape = "2.000000" beam_max_shape = "4.000000" beam_shape_power = "0.250000" +beam_horiz_filter = "0.000000" beam_horiz_sigma = "0.545000" +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" @@ -226,11 +228,25 @@ convergence_offset_y_r = "0.100000" convergence_offset_y_g = "-0.050000" convergence_offset_y_b = "0.100000" mask_type = "0.000000" -mask_sample_mode_desired = "1.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" -beam_num_scanlines = "4.000000"