mirror of
https://github.com/libretro/slang-shaders.git
synced 2024-11-26 18:10:33 +00:00
crt-royale fixes
This commit is contained in:
parent
eaf306f550
commit
202d0c7684
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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 =
|
||||
|
@ -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
|
||||
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user