add some royale parameters

This commit is contained in:
hunterk 2016-08-30 14:57:13 -05:00
parent ae8692aa04
commit abda62a6aa
10 changed files with 128 additions and 123 deletions

View file

@ -352,4 +352,4 @@ void main()
} }
// Encode and output the blurred image: // Encode and output the blurred image:
FragColor = vec4(color, 1.0); FragColor = vec4(color, 1.0);
} }

View file

@ -116,15 +116,15 @@ void main()
brightpass_tex_uv).rgb; brightpass_tex_uv).rgb;
const vec3 dimpass = intensity_dim - brightpass; const vec3 dimpass = intensity_dim - brightpass;
const vec3 phosphor_bloom = (dimpass + blurred_brightpass) * const vec3 phosphor_bloom = (dimpass + blurred_brightpass) *
mask_amplify * undim_factor * levels_contrast; mask_amplify * undim_factor * params.levels_contrast;
// Sample the halation texture, and let some light bleed into refractive // Sample the halation texture, and let some light bleed into refractive
// diffusion. Conceptually this occurs before the phosphor bloom, but // diffusion. Conceptually this occurs before the phosphor bloom, but
// adding it in earlier passes causes black crush in the diffusion colors. // adding it in earlier passes causes black crush in the diffusion colors.
const vec3 diffusion_color = levels_contrast * tex2D_linearize( const vec3 diffusion_color = params.levels_contrast * tex2D_linearize(
HALATION_BLUR, halation_tex_uv).rgb; HALATION_BLUR, halation_tex_uv).rgb;
const vec3 final_bloom = mix(phosphor_bloom, const vec3 final_bloom = mix(phosphor_bloom,
diffusion_color, diffusion_weight); diffusion_color, params.diffusion_weight);
// Encode and output the bloomed image: // Encode and output the bloomed image:
FragColor = encode_output(vec4(final_bloom, 1.0)); FragColor = encode_output(vec4(final_bloom, 1.0));

View file

@ -92,12 +92,12 @@ void main()
const float undim_factor = 1.0/auto_dim_factor; const float undim_factor = 1.0/auto_dim_factor;
const float mask_amplify = get_mask_amplify(); const float mask_amplify = get_mask_amplify();
const vec3 intensity = intensity_dim * undim_factor * mask_amplify * const vec3 intensity = intensity_dim * undim_factor * mask_amplify *
levels_contrast; params.levels_contrast;
// Sample BLOOM_APPROX to estimate what a straight blur of masked scanlines // Sample BLOOM_APPROX to estimate what a straight blur of masked scanlines
// would look like, so we can estimate how much energy we'll receive from // would look like, so we can estimate how much energy we'll receive from
// blooming neighbors: // blooming neighbors:
const vec3 phosphor_blur_approx = levels_contrast * tex2D_linearize( const vec3 phosphor_blur_approx = params.levels_contrast * tex2D_linearize(
BLOOM_APPROX, blur3x3_tex_uv).rgb; BLOOM_APPROX, blur3x3_tex_uv).rgb;
// Compute the blur weight for the center texel and the maximum energy we // Compute the blur weight for the center texel and the maximum energy we
@ -111,15 +111,15 @@ void main()
// because it actually gets better results (on top of being very simple), // because it actually gets better results (on top of being very simple),
// but adjust all intensities for the user's desired underestimate factor: // but adjust all intensities for the user's desired underestimate factor:
const vec3 area_contrib_underestimate = const vec3 area_contrib_underestimate =
bloom_underestimate_levels * max_area_contribution_approx; params.bloom_underestimate_levels * max_area_contribution_approx;
const vec3 intensity_underestimate = const vec3 intensity_underestimate =
bloom_underestimate_levels * intensity; params.bloom_underestimate_levels * intensity;
// Calculate the blur_ratio, the ratio of intensity we want to blur: // Calculate the blur_ratio, the ratio of intensity we want to blur:
#ifdef BRIGHTPASS_AREA_BASED #ifdef BRIGHTPASS_AREA_BASED
// This area-based version changes blur_ratio more smoothly and blurs // This area-based version changes blur_ratio more smoothly and blurs
// more, clipping less but offering less phosphor differentiation: // more, clipping less but offering less phosphor differentiation:
const vec3 phosphor_blur_underestimate = bloom_underestimate_levels * const vec3 phosphor_blur_underestimate = params.bloom_underestimate_levels *
phosphor_blur_approx; phosphor_blur_approx;
const vec3 soft_intensity = max(intensity_underestimate, const vec3 soft_intensity = max(intensity_underestimate,
phosphor_blur_underestimate * mask_amplify); phosphor_blur_underestimate * mask_amplify);
@ -136,7 +136,7 @@ void main()
// Calculate the brightpass based on the auto-dimmed, unamplified, masked // Calculate the brightpass based on the auto-dimmed, unamplified, masked
// scanlines, encode if necessary, and return! // scanlines, encode if necessary, and return!
const vec3 brightpass = intensity_dim * const vec3 brightpass = intensity_dim *
mix(blur_ratio, vec3(1.0), bloom_excess); mix(blur_ratio, vec3(1.0), params.bloom_excess);
FragColor = encode_output(vec4(brightpass, 1.0)); FragColor = encode_output(vec4(brightpass, 1.0));
} }

View file

@ -140,7 +140,7 @@ void main()
// Get an optimal eye position based on geom_view_dist, viewport_aspect, // Get an optimal eye position based on geom_view_dist, viewport_aspect,
// and CRT radius/rotation: // and CRT radius/rotation:
#ifdef RUNTIME_GEOMETRY_MODE #ifdef RUNTIME_GEOMETRY_MODE
const float geom_mode = geom_mode_runtime; geom_mode = params.geom_mode_runtime;
#else #else
const float geom_mode = geom_mode_static; const float geom_mode = geom_mode_static;
#endif #endif
@ -178,7 +178,7 @@ void main()
const mat3x3 global_to_local = geom_global_to_local_static; const mat3x3 global_to_local = geom_global_to_local_static;
#endif #endif
#ifdef RUNTIME_GEOMETRY_MODE #ifdef RUNTIME_GEOMETRY_MODE
const float geom_mode = geom_mode_runtime; geom_mode = params.geom_mode_runtime;
#else #else
const float geom_mode = geom_mode_static; const float geom_mode = geom_mode_static;
#endif #endif

View file

@ -115,13 +115,13 @@ void main()
const vec2 src_tex_uv = fract(src_tex_uv_wrap); const vec2 src_tex_uv = fract(src_tex_uv_wrap);
vec3 pixel_color; vec3 pixel_color;
// If mask_type is static, this branch will be resolved statically. // If mask_type is static, this branch will be resolved statically.
if(mask_type < 0.5) if(params.mask_type < 0.5)
{ {
pixel_color = downsample_vertical_sinc_tiled( pixel_color = downsample_vertical_sinc_tiled(
mask_grille_texture_large, src_tex_uv, mask_resize_src_lut_size, mask_grille_texture_large, src_tex_uv, mask_resize_src_lut_size,
src_dy, resize_magnification_scale.y, 1.0); src_dy, resize_magnification_scale.y, 1.0);
} }
else if(mask_type < 1.5) else if(params.mask_type < 1.5)
{ {
pixel_color = downsample_vertical_sinc_tiled( pixel_color = downsample_vertical_sinc_tiled(
mask_slot_texture_large, src_tex_uv, mask_resize_src_lut_size, mask_slot_texture_large, src_tex_uv, mask_resize_src_lut_size,
@ -169,13 +169,13 @@ void main()
const vec2 src_tex_uv = fract(src_tex_uv_wrap); const vec2 src_tex_uv = fract(src_tex_uv_wrap);
vec3 pixel_color; vec3 pixel_color;
// If mask_type is static, this branch will be resolved statically. // If mask_type is static, this branch will be resolved statically.
if(mask_type < 0.5) if(params.mask_type < 0.5)
{ {
pixel_color = downsample_vertical_sinc_tiled( pixel_color = downsample_vertical_sinc_tiled(
mask_grille_texture_small, src_tex_uv, mask_resize_src_lut_size, mask_grille_texture_small, src_tex_uv, mask_resize_src_lut_size,
src_dy, resize_magnification_scale.y, 1.0); src_dy, resize_magnification_scale.y, 1.0);
} }
else if(mask_type < 1.5) else if(params.mask_type < 1.5)
{ {
pixel_color = downsample_vertical_sinc_tiled( pixel_color = downsample_vertical_sinc_tiled(
mask_slot_texture_small, src_tex_uv, mask_resize_src_lut_size, mask_slot_texture_small, src_tex_uv, mask_resize_src_lut_size,

View file

@ -163,12 +163,12 @@ void main()
if(sample_orig_luts) if(sample_orig_luts)
{ {
// If mask_type is static, this branch will be resolved statically. // If mask_type is static, this branch will be resolved statically.
if(mask_type < 0.5) if(params.mask_type < 0.5)
{ {
phosphor_mask_sample = tex2D_linearize( phosphor_mask_sample = tex2D_linearize(
mask_grille_texture_large, mask_tex_uv).rgb; mask_grille_texture_large, mask_tex_uv).rgb;
} }
else if(mask_type < 1.5) else if(params.mask_type < 1.5)
{ {
phosphor_mask_sample = tex2D_linearize( phosphor_mask_sample = tex2D_linearize(
mask_slot_texture_large, mask_tex_uv).rgb; mask_slot_texture_large, mask_tex_uv).rgb;
@ -242,7 +242,7 @@ void main()
// full brightness, not minimal blurring. To fix it, base blend_ratio // full brightness, not minimal blurring. To fix it, base blend_ratio
// on a max area intensity only so it varies more smoothly: // on a max area intensity only so it varies more smoothly:
const vec3 phosphor_blur_underestimate = const vec3 phosphor_blur_underestimate =
phosphor_blur_approx * bloom_underestimate_levels; phosphor_blur_approx * params.bloom_underestimate_levels;
const vec3 area_max_underestimate = const vec3 area_max_underestimate =
phosphor_blur_underestimate * mask_amplify; phosphor_blur_underestimate * mask_amplify;
#ifdef PHOSPHOR_BLOOM_FAKE_WITH_SIMPLE_BLEND #ifdef PHOSPHOR_BLOOM_FAKE_WITH_SIMPLE_BLEND
@ -258,9 +258,9 @@ void main()
// the phosphor emission, but I haven't found a way to make the // the phosphor emission, but I haven't found a way to make the
// brightness correct across the whole color range, especially with // brightness correct across the whole color range, especially with
// different bloom_underestimate_levels values.) // different bloom_underestimate_levels values.)
const float desired_triad_size = mix(mask_triad_size_desired, const float desired_triad_size = mix(params.mask_triad_size_desired,
registers.OutputSize.x/mask_num_triads_desired, registers.OutputSize.x/params.mask_num_triads_desired,
mask_specify_num_triads); params.mask_specify_num_triads);
const float bloom_sigma = get_min_sigma_to_blur_triad( const float bloom_sigma = get_min_sigma_to_blur_triad(
desired_triad_size, bloom_diff_thresh); desired_triad_size, bloom_diff_thresh);
const float center_weight = get_center_weight(bloom_sigma); const float center_weight = get_center_weight(bloom_sigma);
@ -268,7 +268,7 @@ void main()
max(vec3(0.0), phosphor_blur_approx - max(vec3(0.0), phosphor_blur_approx -
center_weight * phosphor_emission); center_weight * phosphor_emission);
const vec3 area_contrib_underestimate = const vec3 area_contrib_underestimate =
bloom_underestimate_levels * max_area_contribution_approx; params.bloom_underestimate_levels * max_area_contribution_approx;
const vec3 blend_ratio_temp = const vec3 blend_ratio_temp =
((vec3(1.0) - area_contrib_underestimate) / ((vec3(1.0) - area_contrib_underestimate) /
area_max_underestimate - vec3(1.0)) / (center_weight - 1.0); area_max_underestimate - vec3(1.0)) / (center_weight - 1.0);
@ -277,13 +277,13 @@ void main()
// min/max/clamp are BIZARRELY broken with lerp (optimization bug?), // min/max/clamp are BIZARRELY broken with lerp (optimization bug?),
// and this redundant sequence avoids bugs, at least on nVidia cards: // and this redundant sequence avoids bugs, at least on nVidia cards:
const vec3 blend_ratio_clamped = max(clamp(blend_ratio_temp, 0.0, 1.0), 0.0); const vec3 blend_ratio_clamped = max(clamp(blend_ratio_temp, 0.0, 1.0), 0.0);
const vec3 blend_ratio = mix(blend_ratio_clamped, vec3(1.0), bloom_excess); const vec3 blend_ratio = mix(blend_ratio_clamped, vec3(1.0), params.bloom_excess);
// Blend the blurred and unblurred images: // Blend the blurred and unblurred images:
const vec3 phosphor_emission_unclipped = const vec3 phosphor_emission_unclipped =
mix(phosphor_emission, phosphor_blur_approx, blend_ratio); mix(phosphor_emission, phosphor_blur_approx, blend_ratio);
// Simulate refractive diffusion by reusing the halation sample. // Simulate refractive diffusion by reusing the halation sample.
const vec3 pixel_color = mix(phosphor_emission_unclipped, const vec3 pixel_color = mix(phosphor_emission_unclipped,
halation_color, diffusion_weight); halation_color, params.diffusion_weight);
#else #else
const vec3 pixel_color = phosphor_emission_dim; const vec3 pixel_color = phosphor_emission_dim;
#endif #endif

View file

@ -60,7 +60,7 @@ vec2 intersect_sphere(const vec3 view_vec, const vec3 eye_pos_vec)
// Quadratic formula coefficients (b_over_2 is guaranteed negative): // Quadratic formula coefficients (b_over_2 is guaranteed negative):
const float a = dot(view_vec, view_vec); const float a = dot(view_vec, view_vec);
const float b_over_2 = dot(view_vec, eye_pos_vec); // * 2.0 factored out const float b_over_2 = dot(view_vec, eye_pos_vec); // * 2.0 factored out
const float c = dot(eye_pos_vec, eye_pos_vec) - geom_radius*geom_radius; const float c = dot(eye_pos_vec, eye_pos_vec) - params.geom_radius*params.geom_radius;
return quadratic_solve(a, b_over_2, c); return quadratic_solve(a, b_over_2, c);
} }
@ -77,7 +77,7 @@ vec2 intersect_cylinder(const vec3 view_vec, const vec3 eye_pos_vec)
// Real-Time Collision Detection, p. 195-196, and this version // Real-Time Collision Detection, p. 195-196, and this version
// uses LaGrange's identity to reduce operations. // uses LaGrange's identity to reduce operations.
// Arbitrary "cylinder top" reference point for an infinite cylinder: // Arbitrary "cylinder top" reference point for an infinite cylinder:
const vec3 cylinder_top_vec = vec3(0.0, geom_radius, 0.0); const vec3 cylinder_top_vec = vec3(0.0, params.geom_radius, 0.0);
const vec3 cylinder_axis_vec = vec3(0.0, 1.0, 0.0);//vec3(0.0, 2.0*geom_radius, 0.0); const vec3 cylinder_axis_vec = vec3(0.0, 1.0, 0.0);//vec3(0.0, 2.0*geom_radius, 0.0);
const vec3 top_to_eye_vec = eye_pos_vec - cylinder_top_vec; const vec3 top_to_eye_vec = eye_pos_vec - cylinder_top_vec;
const vec3 axis_x_view = cross(cylinder_axis_vec, view_vec); const vec3 axis_x_view = cross(cylinder_axis_vec, view_vec);
@ -86,7 +86,7 @@ vec2 intersect_cylinder(const vec3 view_vec, const vec3 eye_pos_vec)
const float a = dot(axis_x_view, axis_x_view); const float a = dot(axis_x_view, axis_x_view);
const float b_over_2 = dot(axis_x_top_to_eye, axis_x_view); const float b_over_2 = dot(axis_x_top_to_eye, axis_x_view);
const float c = dot(axis_x_top_to_eye, axis_x_top_to_eye) - const float c = dot(axis_x_top_to_eye, axis_x_top_to_eye) -
geom_radius*geom_radius;//*dot(cylinder_axis_vec, cylinder_axis_vec); params.geom_radius*params.geom_radius;//*dot(cylinder_axis_vec, cylinder_axis_vec);
return quadratic_solve(a, b_over_2, c); return quadratic_solve(a, b_over_2, c);
} }
@ -100,7 +100,7 @@ vec2 cylinder_xyz_to_uv(const vec3 intersection_pos_local,
// Start with a numerically robust arc length calculation. // Start with a numerically robust arc length calculation.
const float angle_from_image_center = atan(intersection_pos_local.z, const float angle_from_image_center = atan(intersection_pos_local.z,
intersection_pos_local.x); intersection_pos_local.x);
const float signed_arc_len = angle_from_image_center * geom_radius; const float signed_arc_len = angle_from_image_center * params.geom_radius;
// Get a uv-mapping where [-0.5, 0.5] maps to a "square" area, then divide // Get a uv-mapping where [-0.5, 0.5] maps to a "square" area, then divide
// by the aspect ratio to stretch the mapping appropriately: // by the aspect ratio to stretch the mapping appropriately:
const vec2 square_uv = vec2(signed_arc_len, -intersection_pos_local.y); const vec2 square_uv = vec2(signed_arc_len, -intersection_pos_local.y);
@ -117,9 +117,9 @@ vec3 cylinder_uv_to_xyz(const vec2 video_uv, const vec2 geom_aspect)
// then calculate an xyz position for the cylindrical mapping above. // then calculate an xyz position for the cylindrical mapping above.
const vec2 square_uv = video_uv * geom_aspect; const vec2 square_uv = video_uv * geom_aspect;
const float arc_len = square_uv.x; const float arc_len = square_uv.x;
const float angle_from_image_center = arc_len / geom_radius; const float angle_from_image_center = arc_len / params.geom_radius;
const float x_pos = sin(angle_from_image_center) * geom_radius; const float x_pos = sin(angle_from_image_center) * params.geom_radius;
const float z_pos = cos(angle_from_image_center) * geom_radius; const float z_pos = cos(angle_from_image_center) * params.geom_radius;
// Or: z = sqrt(geom_radius**2 - x**2) // Or: z = sqrt(geom_radius**2 - x**2)
// Or: z = geom_radius/sqrt(1.0 + tan(angle)**2), x = z * tan(angle) // Or: z = geom_radius/sqrt(1.0 + tan(angle)**2), x = z * tan(angle)
const vec3 intersection_pos_local = vec3(x_pos, -square_uv.y, z_pos); const vec3 intersection_pos_local = vec3(x_pos, -square_uv.y, z_pos);
@ -143,12 +143,12 @@ vec2 sphere_xyz_to_uv(const vec3 intersection_pos_local,
// sphere intersection point and the image center using a method posted by // sphere intersection point and the image center using a method posted by
// Roger Stafford on comp.soft-sys.matlab: // Roger Stafford on comp.soft-sys.matlab:
// https://groups.google.com/d/msg/comp.soft-sys.matlab/zNbUui3bjcA/c0HV_bHSx9cJ // https://groups.google.com/d/msg/comp.soft-sys.matlab/zNbUui3bjcA/c0HV_bHSx9cJ
const vec3 image_center_pos_local = vec3(0.0, 0.0, geom_radius); const vec3 image_center_pos_local = vec3(0.0, 0.0, params.geom_radius);
const float cp_len = const float cp_len =
length(cross(intersection_pos_local, image_center_pos_local)); length(cross(intersection_pos_local, image_center_pos_local));
const float dp = dot(intersection_pos_local, image_center_pos_local); const float dp = dot(intersection_pos_local, image_center_pos_local);
const float angle_from_image_center = atan(dp, cp_len); const float angle_from_image_center = atan(dp, cp_len);
const float arc_len = angle_from_image_center * geom_radius; const float arc_len = angle_from_image_center * params.geom_radius;
// Get a uv-mapping where [-0.5, 0.5] maps to a "square" area, then divide // Get a uv-mapping where [-0.5, 0.5] maps to a "square" area, then divide
// by the aspect ratio to stretch the mapping appropriately: // by the aspect ratio to stretch the mapping appropriately:
const vec2 square_uv_unit = normalize(vec2(intersection_pos_local.x, const vec2 square_uv_unit = normalize(vec2(intersection_pos_local.x,
@ -172,12 +172,12 @@ vec3 sphere_uv_to_xyz(const vec2 video_uv, const vec2 geom_aspect)
//float arc_len = length(square_uv); //float arc_len = length(square_uv);
const vec2 square_uv_unit = normalize(square_uv); const vec2 square_uv_unit = normalize(square_uv);
const float arc_len = square_uv.y/square_uv_unit.y; const float arc_len = square_uv.y/square_uv_unit.y;
const float angle_from_image_center = arc_len / geom_radius; const float angle_from_image_center = arc_len / params.geom_radius;
const float xy_dist_from_sphere_center = const float xy_dist_from_sphere_center =
sin(angle_from_image_center) * geom_radius; sin(angle_from_image_center) * params.geom_radius;
//vec2 xy_pos = xy_dist_from_sphere_center * (square_uv/FIX_ZERO(arc_len)); //vec2 xy_pos = xy_dist_from_sphere_center * (square_uv/FIX_ZERO(arc_len));
const vec2 xy_pos = xy_dist_from_sphere_center * square_uv_unit; const vec2 xy_pos = xy_dist_from_sphere_center * square_uv_unit;
const float z_pos = cos(angle_from_image_center) * geom_radius; const float z_pos = cos(angle_from_image_center) * params.geom_radius;
const vec3 intersection_pos_local = vec3(xy_pos.x, -xy_pos.y, z_pos); const vec3 intersection_pos_local = vec3(xy_pos.x, -xy_pos.y, z_pos);
return intersection_pos_local; return intersection_pos_local;
} }
@ -192,7 +192,7 @@ vec2 sphere_alt_xyz_to_uv(const vec3 intersection_pos_local,
// See cylinder_xyz_to_uv() for implementation details (very similar). // See cylinder_xyz_to_uv() for implementation details (very similar).
const vec2 angle_from_image_center = atan((intersection_pos_local.zz), const vec2 angle_from_image_center = atan((intersection_pos_local.zz),
vec2(intersection_pos_local.x, -intersection_pos_local.y)); vec2(intersection_pos_local.x, -intersection_pos_local.y));
const vec2 signed_arc_len = angle_from_image_center * geom_radius; const vec2 signed_arc_len = angle_from_image_center * params.geom_radius;
const vec2 video_uv = signed_arc_len / geom_aspect; const vec2 video_uv = signed_arc_len / geom_aspect;
return video_uv; return video_uv;
} }
@ -205,9 +205,9 @@ vec3 sphere_alt_uv_to_xyz(const vec2 video_uv, const vec2 geom_aspect)
// See cylinder_uv_to_xyz() for implementation details (very similar). // See cylinder_uv_to_xyz() for implementation details (very similar).
const vec2 square_uv = video_uv * geom_aspect; const vec2 square_uv = video_uv * geom_aspect;
const vec2 arc_len = square_uv; const vec2 arc_len = square_uv;
const vec2 angle_from_image_center = arc_len / geom_radius; const vec2 angle_from_image_center = arc_len / params.geom_radius;
const vec2 xy_pos = sin(angle_from_image_center) * geom_radius; const vec2 xy_pos = sin(angle_from_image_center) * params.geom_radius;
const float z_pos = sqrt(geom_radius*geom_radius - dot(xy_pos, xy_pos)); const float z_pos = sqrt(params.geom_radius*params.geom_radius - dot(xy_pos, xy_pos));
return vec3(xy_pos.x, -xy_pos.y, z_pos); return vec3(xy_pos.x, -xy_pos.y, z_pos);
} }
@ -309,7 +309,7 @@ vec3 get_ideal_global_eye_pos_for_points(vec3 eye_pos,
// offset_ul and offset_dr represent the farthest we can move the // offset_ul and offset_dr represent the farthest we can move the
// eye_pos up-left and down-right. Save the min of all offset_dr's // eye_pos up-left and down-right. Save the min of all offset_dr's
// and the max of all offset_ul's (since it's negative). // and the max of all offset_ul's (since it's negative).
float abs_radius = abs(geom_radius); // In case anyone gets ideas. ;) float abs_radius = abs(params.geom_radius); // In case anyone gets ideas. ;)
vec2 offset_dr_min = vec2(10.0 * abs_radius, 10.0 * abs_radius); vec2 offset_dr_min = vec2(10.0 * abs_radius, 10.0 * abs_radius);
vec2 offset_ul_max = vec2(-10.0 * abs_radius, -10.0 * abs_radius); vec2 offset_ul_max = vec2(-10.0 * abs_radius, -10.0 * abs_radius);
for(int i = 0; i < num_points; i++) for(int i = 0; i < num_points; i++)
@ -317,9 +317,9 @@ vec3 get_ideal_global_eye_pos_for_points(vec3 eye_pos,
const vec2 flipy = vec2(1.0, -1.0); const vec2 flipy = vec2(1.0, -1.0);
vec3 eyespace_xyz = eyespace_coords[i]; vec3 eyespace_xyz = eyespace_coords[i];
vec2 offset_dr = eyespace_xyz.xy - vec2(-0.5) * vec2 offset_dr = eyespace_xyz.xy - vec2(-0.5) *
(geom_aspect * -eyespace_xyz.z) / (geom_view_dist * flipy); (geom_aspect * -eyespace_xyz.z) / (params.geom_view_dist * flipy);
vec2 offset_ul = eyespace_xyz.xy - vec2(0.5) * vec2 offset_ul = eyespace_xyz.xy - vec2(0.5) *
(geom_aspect * -eyespace_xyz.z) / (geom_view_dist * flipy); (geom_aspect * -eyespace_xyz.z) / (params.geom_view_dist * flipy);
offset_dr_min = min(offset_dr_min, offset_dr); offset_dr_min = min(offset_dr_min, offset_dr);
offset_ul_max = max(offset_ul_max, offset_ul); offset_ul_max = max(offset_ul_max, offset_ul);
} }
@ -347,13 +347,13 @@ vec3 get_ideal_global_eye_pos_for_points(vec3 eye_pos,
// We'll vectorize the actual computation. Take the maximum of // We'll vectorize the actual computation. Take the maximum of
// these four for a single offset, and continue taking the max // these four for a single offset, and continue taking the max
// for every point (use max because offset.z is negative). // for every point (use max because offset.z is negative).
float offset_z_max = -10.0 * geom_radius * geom_view_dist; float offset_z_max = -10.0 * params.geom_radius * params.geom_view_dist;
for(int i = 0; i < num_points; i++) for(int i = 0; i < num_points; i++)
{ {
vec3 eyespace_xyz_flipy = eyespace_coords[i] * vec3 eyespace_xyz_flipy = eyespace_coords[i] *
vec3(1.0, -1.0, 1.0); vec3(1.0, -1.0, 1.0);
vec4 offset_zzzz = eyespace_xyz_flipy.zzzz + vec4 offset_zzzz = eyespace_xyz_flipy.zzzz +
(eyespace_xyz_flipy.xyxy * geom_view_dist) / (eyespace_xyz_flipy.xyxy * params.geom_view_dist) /
(vec4(-0.5, -0.5, 0.5, 0.5) * vec4(geom_aspect, geom_aspect)); (vec4(-0.5, -0.5, 0.5, 0.5) * vec4(geom_aspect, geom_aspect));
// Ignore offsets that push positive x/y values to opposite // Ignore offsets that push positive x/y values to opposite
// boundaries, and vice versa, and don't let the camera move // boundaries, and vice versa, and don't let the camera move
@ -379,14 +379,14 @@ vec3 get_ideal_global_eye_pos(const mat3x3 local_to_global,
{ {
// Start with an initial eye_pos that includes the entire primitive // Start with an initial eye_pos that includes the entire primitive
// (sphere or cylinder) in its field-of-view: // (sphere or cylinder) in its field-of-view:
const vec3 high_view = vec3(0.0, geom_aspect.y, -geom_view_dist); const vec3 high_view = vec3(0.0, geom_aspect.y, -params.geom_view_dist);
const vec3 low_view = high_view * vec3(1.0, -1.0, 1.0); const vec3 low_view = high_view * vec3(1.0, -1.0, 1.0);
const float len_sq = dot(high_view, high_view); const float len_sq = dot(high_view, high_view);
const float fov = abs(acos(dot(high_view, low_view)/len_sq)); const float fov = abs(acos(dot(high_view, low_view)/len_sq));
// Trigonometry/similar triangles say distance = geom_radius/sin(fov/2): // Trigonometry/similar triangles say distance = geom_radius/sin(fov/2):
const float eye_z_spherical = geom_radius/sin(fov*0.5); const float eye_z_spherical = params.geom_radius/sin(fov*0.5);
vec3 eye_pos = vec3(0.0, 0.0, eye_z_spherical); vec3 eye_pos = vec3(0.0, 0.0, eye_z_spherical);
if (geom_mode < 2.5) eye_pos = vec3(0.0, 0.0, max(geom_view_dist, eye_z_spherical)); if (geom_mode < 2.5) eye_pos = vec3(0.0, 0.0, max(params.geom_view_dist, eye_z_spherical));
// Get global xyz coords of extreme sample points on the simulated CRT // Get global xyz coords of extreme sample points on the simulated CRT
// screen. Start with the center, edge centers, and corners of the // screen. Start with the center, edge centers, and corners of the
@ -602,7 +602,7 @@ vec2 get_curved_video_uv_coords_and_tangent_matrix(
// units of the viewport's physical diagonal size. // units of the viewport's physical diagonal size.
const vec2 view_uv = (flat_video_uv - vec2(0.5)) * geom_aspect; const vec2 view_uv = (flat_video_uv - vec2(0.5)) * geom_aspect;
const vec3 view_vec_global = const vec3 view_vec_global =
vec3(view_uv.x, -view_uv.y, -geom_view_dist); vec3(view_uv.x, -view_uv.y, -params.geom_view_dist);
// Transform the view vector into the CRT's local coordinate frame, convert // Transform the view vector into the CRT's local coordinate frame, convert
// to video_uv coords, and get the local 3D intersection position: // to video_uv coords, and get the local 3D intersection position:
const vec3 view_vec_local = (view_vec_global * global_to_local); const vec3 view_vec_local = (view_vec_global * global_to_local);
@ -674,11 +674,11 @@ float get_border_dim_factor(const vec2 video_uv, const vec2 geom_aspect)
const vec2 edge_dists = min(video_uv, vec2(1.0) - video_uv) * const vec2 edge_dists = min(video_uv, vec2(1.0) - video_uv) *
geom_aspect; geom_aspect;
const vec2 border_penetration = const vec2 border_penetration =
max(vec2(border_size) - edge_dists, vec2(0.0)); max(vec2(params.border_size) - edge_dists, vec2(0.0));
const float penetration_ratio = length(border_penetration)/border_size; const float penetration_ratio = length(border_penetration)/params.border_size;
const float border_escape_ratio = max(1.0 - penetration_ratio, 0.0); const float border_escape_ratio = max(1.0 - penetration_ratio, 0.0);
const float border_dim_factor = const float border_dim_factor =
pow(border_escape_ratio, border_darkness) * max(1.0, border_compress); pow(border_escape_ratio, params.border_darkness) * max(1.0, params.border_compress);
return min(border_dim_factor, 1.0); return min(border_dim_factor, 1.0);
} }

View file

@ -1,55 +1,58 @@
#ifndef PARAMS_INC
#define PARAMS_INC
layout(std140, set = 0, binding = 0) uniform UBO layout(std140, set = 0, binding = 0) uniform UBO
{ {
mat4 MVP; mat4 MVP;
float crt_gamma; // float crt_gamma;
float lcd_gamma; // float lcd_gamma;
float levels_contrast; float levels_contrast;
float halation_weight; float halation_weight;
float diffusion_weight; float diffusion_weight;
float bloom_underestimate_levels; float bloom_underestimate_levels;
float bloom_excess; float bloom_excess;
float beam_min_sigma; float beam_min_sigma;
float beam_max_sigma; float beam_max_sigma;
float beam_spot_power; float beam_spot_power;
float beam_min_shape; float beam_min_shape;
float beam_max_shape; float beam_max_shape;
float beam_shape_power; float beam_shape_power;
float beam_horiz_filter; float beam_horiz_filter;
float beam_horiz_sigma; float beam_horiz_sigma;
float beam_horiz_linear_rgb_weight; // float beam_horiz_linear_rgb_weight;
float convergence_offset_x_r; float convergence_offset_x_r;
float convergence_offset_x_g; float convergence_offset_x_g;
float convergence_offset_x_b; float convergence_offset_x_b;
float convergence_offset_y_r; float convergence_offset_y_r;
float convergence_offset_y_g; float convergence_offset_y_g;
float convergence_offset_y_b; float convergence_offset_y_b;
float mask_type; float mask_type;
float mask_sample_mode_desired; float mask_sample_mode_desired;
float mask_specify_num_triads; float mask_specify_num_triads;
float mask_triad_size_desired; float mask_triad_size_desired;
float mask_num_triads_desired; float mask_num_triads_desired;
float aa_subpixel_r_offset_x_runtime; // float aa_subpixel_r_offset_x_runtime;
float aa_subpixel_r_offset_y_runtime; // float aa_subpixel_r_offset_y_runtime;
float aa_cubic_c; float aa_cubic_c;
float aa_gauss_sigma; float aa_gauss_sigma;
float geom_mode_runtime; float geom_mode_runtime;
float geom_radius; float geom_radius;
float geom_view_dist; float geom_view_dist;
float geom_tilt_angle_x; float geom_tilt_angle_x;
float geom_tilt_angle_y; float geom_tilt_angle_y;
float geom_aspect_ratio_x; float geom_aspect_ratio_x;
float geom_aspect_ratio_y; float geom_aspect_ratio_y;
float geom_overscan_x; float geom_overscan_x;
float geom_overscan_y; float geom_overscan_y;
float border_size; float border_size;
float border_darkness; float border_darkness;
float border_compress; float border_compress;
float interlace_1080i; float interlace_1080i;
} params; } params;
// Set shader params for all passes here: // Set shader params for all passes here:
#pragma parameter crt_gamma "crt_gamma" 2.5 1.0 5.0 0.025 //#pragma parameter crt_gamma "crt_gamma" 2.5 1.0 5.0 0.025
#pragma parameter lcd_gamma "lcd_gamma" 2.2 1.0 5.0 0.025 //#pragma parameter lcd_gamma "lcd_gamma" 2.2 1.0 5.0 0.025
#pragma parameter levels_contrast "levels_contrast" 1.0 0.0 4.0 0.015625 #pragma parameter levels_contrast "levels_contrast" 1.0 0.0 4.0 0.015625
#pragma parameter halation_weight "halation_weight" 0.0 0.0 1.0 0.005 #pragma parameter halation_weight "halation_weight" 0.0 0.0 1.0 0.005
#pragma parameter diffusion_weight "diffusion_weight" 0.075 0.0 1.0 0.005 #pragma parameter diffusion_weight "diffusion_weight" 0.075 0.0 1.0 0.005
@ -63,7 +66,7 @@ layout(std140, set = 0, binding = 0) uniform UBO
#pragma parameter beam_shape_power "beam_shape_power" 0.25 0.01 16.0 0.01 #pragma parameter beam_shape_power "beam_shape_power" 0.25 0.01 16.0 0.01
#pragma parameter beam_horiz_filter "beam_horiz_filter" 0.0 0.0 2.0 1.0 #pragma parameter beam_horiz_filter "beam_horiz_filter" 0.0 0.0 2.0 1.0
#pragma parameter beam_horiz_sigma "beam_horiz_sigma" 0.35 0.0 0.67 0.005 #pragma parameter beam_horiz_sigma "beam_horiz_sigma" 0.35 0.0 0.67 0.005
#pragma parameter beam_horiz_linear_rgb_weight "beam_horiz_linear_rgb_weight" 1.0 0.0 1.0 0.01 //#pragma parameter beam_horiz_linear_rgb_weight "beam_horiz_linear_rgb_weight" 1.0 0.0 1.0 0.01
#pragma parameter convergence_offset_x_r "convergence_offset_x_r" 0.0 -4.0 4.0 0.05 #pragma parameter convergence_offset_x_r "convergence_offset_x_r" 0.0 -4.0 4.0 0.05
#pragma parameter convergence_offset_x_g "convergence_offset_x_g" 0.0 -4.0 4.0 0.05 #pragma parameter convergence_offset_x_g "convergence_offset_x_g" 0.0 -4.0 4.0 0.05
#pragma parameter convergence_offset_x_b "convergence_offset_x_b" 0.0 -4.0 4.0 0.05 #pragma parameter convergence_offset_x_b "convergence_offset_x_b" 0.0 -4.0 4.0 0.05
@ -75,8 +78,8 @@ layout(std140, set = 0, binding = 0) uniform UBO
#pragma parameter mask_specify_num_triads "mask_specify_num_triads" 0.0 0.0 1.0 1.0 #pragma parameter mask_specify_num_triads "mask_specify_num_triads" 0.0 0.0 1.0 1.0
#pragma parameter mask_triad_size_desired "mask_triad_size_desired" 3.0 1.0 18.0 0.125 #pragma parameter mask_triad_size_desired "mask_triad_size_desired" 3.0 1.0 18.0 0.125
#pragma parameter mask_num_triads_desired "mask_num_triads_desired" 480.0 342.0 1920.0 1.0 #pragma parameter mask_num_triads_desired "mask_num_triads_desired" 480.0 342.0 1920.0 1.0
#pragma parameter aa_subpixel_r_offset_x_runtime "aa_subpixel_r_offset_x" -0.333333333 -0.333333333 0.333333333 0.333333333 //#pragma parameter aa_subpixel_r_offset_x_runtime "aa_subpixel_r_offset_x" -0.333333333 -0.333333333 0.333333333 0.333333333
#pragma parameter aa_subpixel_r_offset_y_runtime "aa_subpixel_r_offset_y" 0.0 -0.333333333 0.333333333 0.333333333 //#pragma parameter aa_subpixel_r_offset_y_runtime "aa_subpixel_r_offset_y" 0.0 -0.333333333 0.333333333 0.333333333
#pragma parameter aa_cubic_c "antialias_cubic_sharpness" 0.5 0.0 4.0 0.015625 #pragma parameter aa_cubic_c "antialias_cubic_sharpness" 0.5 0.0 4.0 0.015625
#pragma parameter aa_gauss_sigma "antialias_gauss_sigma" 0.5 0.0625 1.0 0.015625 #pragma parameter aa_gauss_sigma "antialias_gauss_sigma" 0.5 0.0625 1.0 0.015625
#pragma parameter geom_mode_runtime "geom_mode" 0.0 0.0 3.0 1.0 #pragma parameter geom_mode_runtime "geom_mode" 0.0 0.0 3.0 1.0
@ -91,4 +94,6 @@ layout(std140, set = 0, binding = 0) uniform UBO
#pragma parameter border_size "border_size" 0.015 0.0000001 0.5 0.005 #pragma parameter border_size "border_size" 0.015 0.0000001 0.5 0.005
#pragma parameter border_darkness "border_darkness" 2.0 0.0 16.0 0.0625 #pragma parameter border_darkness "border_darkness" 2.0 0.0 16.0 0.0625
#pragma parameter border_compress "border_compress" 2.5 1.0 64.0 0.0625 #pragma parameter border_compress "border_compress" 2.5 1.0 64.0 0.0625
#pragma parameter interlace_1080i "interlace_1080i" 0.0 0.0 1.0 1.0 #pragma parameter interlace_1080i "interlace_1080i" 0.0 0.0 1.0 1.0
#endif

View file

@ -237,9 +237,9 @@ vec2 get_resized_mask_tile_size(const vec2 estimated_viewport_size,
// If mask_specify_num_triads is 1.0/true and estimated_viewport_size.x is // If mask_specify_num_triads is 1.0/true and estimated_viewport_size.x is
// wrong, the user preference will be misinterpreted: // wrong, the user preference will be misinterpreted:
const float desired_tile_size_x = mask_triads_per_tile * mix( const float desired_tile_size_x = mask_triads_per_tile * mix(
mask_triad_size_desired, params.mask_triad_size_desired,
estimated_viewport_size.x / mask_num_triads_desired, estimated_viewport_size.x / params.mask_num_triads_desired,
mask_specify_num_triads); params.mask_specify_num_triads);
if(get_mask_sample_mode() > 0.5) if(get_mask_sample_mode() > 0.5)
{ {
// We don't need constraints unless we're sampling MASK_RESIZE. // We don't need constraints unless we're sampling MASK_RESIZE.

View file

@ -189,8 +189,8 @@
// 2.) C = 0.5 (default) is Catmull-Rom; higher C's apply sharpening. // 2.) C = 0.5 (default) is Catmull-Rom; higher C's apply sharpening.
// 3.) C = 1.0/3.0 is the Mitchell-Netravali filter. // 3.) C = 1.0/3.0 is the Mitchell-Netravali filter.
// 4.) C = 0.0 is a soft spline filter. // 4.) C = 0.0 is a soft spline filter.
const float aa_cubic_c = 0.5; // const float aa_cubic_c = 0.5;
const float aa_gauss_sigma = 0.5 / aa_pixel_diameter; // const float aa_gauss_sigma = 0.5 / aa_pixel_diameter;
// Users may override the subpixel offset accessor function with their own. // Users may override the subpixel offset accessor function with their own.
// A function is used for compatibility with scalar runtime shader params. // A function is used for compatibility with scalar runtime shader params.
vec2 get_aa_subpixel_r_offset() vec2 get_aa_subpixel_r_offset()
@ -235,14 +235,14 @@ void assign_aa_cubic_constants()
#ifdef RUNTIME_ANTIALIAS_WEIGHTS #ifdef RUNTIME_ANTIALIAS_WEIGHTS
if(aa_filter > 5.5 && aa_filter < 7.5) if(aa_filter > 5.5 && aa_filter < 7.5)
{ {
aa_cubic_b = 1.0 - 2.0*aa_cubic_c; aa_cubic_b = 1.0 - 2.0*params.aa_cubic_c;
cubic_branch1_x3_coeff = 12.0 - 9.0*aa_cubic_b - 6.0*aa_cubic_c; cubic_branch1_x3_coeff = 12.0 - 9.0*aa_cubic_b - 6.0*params.aa_cubic_c;
cubic_branch1_x2_coeff = -18.0 + 12.0*aa_cubic_b + 6.0*aa_cubic_c; cubic_branch1_x2_coeff = -18.0 + 12.0*aa_cubic_b + 6.0*params.aa_cubic_c;
cubic_branch1_x0_coeff = 6.0 - 2.0 * aa_cubic_b; cubic_branch1_x0_coeff = 6.0 - 2.0 * aa_cubic_b;
cubic_branch2_x3_coeff = -aa_cubic_b - 6.0 * aa_cubic_c; cubic_branch2_x3_coeff = -aa_cubic_b - 6.0 * params.aa_cubic_c;
cubic_branch2_x2_coeff = 6.0*aa_cubic_b + 30.0*aa_cubic_c; cubic_branch2_x2_coeff = 6.0*aa_cubic_b + 30.0*params.aa_cubic_c;
cubic_branch2_x1_coeff = -12.0*aa_cubic_b - 48.0*aa_cubic_c; cubic_branch2_x1_coeff = -12.0*aa_cubic_b - 48.0*params.aa_cubic_c;
cubic_branch2_x0_coeff = 8.0*aa_cubic_b + 24.0*aa_cubic_c; cubic_branch2_x0_coeff = 8.0*aa_cubic_b + 24.0*params.aa_cubic_c;
} }
#endif #endif
} }
@ -306,7 +306,7 @@ float eval_tent_filter(const float dist)
float eval_gaussian_filter(const float dist) float eval_gaussian_filter(const float dist)
{ {
return exp(-(dist*dist) / (2.0*aa_gauss_sigma*aa_gauss_sigma)); return exp(-(dist*dist) / (2.0*params.aa_gauss_sigma*params.aa_gauss_sigma));
} }
float eval_cubic_filter(const float dist) float eval_cubic_filter(const float dist)
@ -315,14 +315,14 @@ float eval_cubic_filter(const float dist)
#ifndef RUNTIME_ANTIALIAS_WEIGHTS #ifndef RUNTIME_ANTIALIAS_WEIGHTS
// When runtime weights are used, these values are instead written to // When runtime weights are used, these values are instead written to
// global uniforms at the beginning of each tex2Daa* call. // global uniforms at the beginning of each tex2Daa* call.
const float aa_cubic_b = 1.0 - 2.0*aa_cubic_c; const float aa_cubic_b = 1.0 - 2.0*params.aa_cubic_c;
const float cubic_branch1_x3_coeff = 12.0 - 9.0*aa_cubic_b - 6.0*aa_cubic_c; const float cubic_branch1_x3_coeff = 12.0 - 9.0*aa_cubic_b - 6.0*params.aa_cubic_c;
const float cubic_branch1_x2_coeff = -18.0 + 12.0*aa_cubic_b + 6.0*aa_cubic_c; const float cubic_branch1_x2_coeff = -18.0 + 12.0*aa_cubic_b + 6.0*params.aa_cubic_c;
const float cubic_branch1_x0_coeff = 6.0 - 2.0 * aa_cubic_b; const float cubic_branch1_x0_coeff = 6.0 - 2.0 * aa_cubic_b;
const float cubic_branch2_x3_coeff = -aa_cubic_b - 6.0 * aa_cubic_c; const float cubic_branch2_x3_coeff = -aa_cubic_b - 6.0 * params.aa_cubic_c;
const float cubic_branch2_x2_coeff = 6.0*aa_cubic_b + 30.0*aa_cubic_c; const float cubic_branch2_x2_coeff = 6.0*aa_cubic_b + 30.0*params.aa_cubic_c;
const float cubic_branch2_x1_coeff = -12.0*aa_cubic_b - 48.0*aa_cubic_c; const float cubic_branch2_x1_coeff = -12.0*aa_cubic_b - 48.0*params.aa_cubic_c;
const float cubic_branch2_x0_coeff = 8.0*aa_cubic_b + 24.0*aa_cubic_c; const float cubic_branch2_x0_coeff = 8.0*aa_cubic_b + 24.0*params.aa_cubic_c;
#endif #endif
const float abs_dist = abs(dist); const float abs_dist = abs(dist);
// Compute the cubic based on the Horner's method formula in: // Compute the cubic based on the Horner's method formula in: