From 4aa0679176575794c12b9b8ed0fea612e8603bb7 Mon Sep 17 00:00:00 2001 From: hizzlekizzle Date: Fri, 30 Dec 2016 08:28:09 -0600 Subject: [PATCH] add default auto-pre-scale to sharp-bilinear --- retro/shaders/sharp-bilinear.slang | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/retro/shaders/sharp-bilinear.slang b/retro/shaders/sharp-bilinear.slang index 1831675..4c5766d 100644 --- a/retro/shaders/sharp-bilinear.slang +++ b/retro/shaders/sharp-bilinear.slang @@ -2,15 +2,19 @@ layout(push_constant) uniform Push { + vec4 OutputSize; + vec4 OriginalSize; + vec4 SourceSize; float SHARP_BILINEAR_PRE_SCALE; -} param; + float AUTO_PRESCALE; +} params; + +#pragma parameter SHARP_BILINEAR_PRE_SCALE "Sharp Bilinear Prescale" 4.0 1.0 10.0 1.0 +#pragma parameter AUTO_PRESCALE "Automatic Prescale" 1.0 0.0 1.0 1.0 layout(std140, set = 0, binding = 0) uniform UBO { mat4 MVP; - vec4 OutputSize; - vec4 OriginalSize; - vec4 SourceSize; } global; /* @@ -22,8 +26,6 @@ layout(std140, set = 0, binding = 0) uniform UBO * sharper image than plain bilinear. */ -#pragma parameter SHARP_BILINEAR_PRE_SCALE "Sharp Bilinear Prescale" 4.0 1.0 10.0 1.0 - #pragma stage vertex layout(location = 0) in vec4 Position; layout(location = 1) in vec2 TexCoord; @@ -45,15 +47,16 @@ void main() vec2 texel = vTexCoord * global.SourceSize.xy; vec2 texel_floored = floor(texel); vec2 s = fract(texel); - float region_range = 0.5 - 0.5 / param.SHARP_BILINEAR_PRE_SCALE; + float scale = (AUTO_PRESCALE > 0.5) ? floor(params.OutputSize.y / params.SourceSize.y) : params.SHARP_BILINEAR_PRE_SCALE; + float region_range = 0.5 - 0.5 / scale; // Figure out where in the texel to sample to get correct pre-scaled bilinear. // Uses the hardware bilinear interpolator to avoid having to sample 4 times manually. vec2 center_dist = s - 0.5; - vec2 f = (center_dist - clamp(center_dist, -region_range, region_range)) * param.SHARP_BILINEAR_PRE_SCALE + 0.5; + vec2 f = (center_dist - clamp(center_dist, -region_range, region_range)) * scale + 0.5; vec2 mod_texel = texel_floored + f; FragColor = vec4(texture(Source, mod_texel / global.SourceSize.xy).rgb, 1.0); -} \ No newline at end of file +}