From 5dc2001f4bbbf26aed999d1704bb8e617c995270 Mon Sep 17 00:00:00 2001 From: Gregori Francisco Cavichioli Date: Wed, 28 Sep 2022 08:37:33 -0300 Subject: [PATCH] Add Zfast Composite shader --- .../zfast_crt/zfast_crt_composite.slang | 99 +++++++++++++++++++ crt/zfast-crt-composite.slangp | 7 ++ 2 files changed, 106 insertions(+) create mode 100644 crt/shaders/zfast_crt/zfast_crt_composite.slang create mode 100644 crt/zfast-crt-composite.slangp diff --git a/crt/shaders/zfast_crt/zfast_crt_composite.slang b/crt/shaders/zfast_crt/zfast_crt_composite.slang new file mode 100644 index 0000000..d1cd980 --- /dev/null +++ b/crt/shaders/zfast_crt/zfast_crt_composite.slang @@ -0,0 +1,99 @@ +#version 450 +/* + zfast_crt - A very simple CRT shader. + + Copyright (C) 2017 Greg Hogan (SoltanGris42) + edited by metallic 77. + ported to slang by gregoricavichioli & hunterk. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + +*/ + +layout(push_constant) uniform Push +{ + vec4 SourceSize; + vec4 OriginalSize; + vec4 OutputSize; + uint FrameCount; +float pi, blurx, blury, HIGHSCANAMOUNT1, HIGHSCANAMOUNT2, MASK_DARK, MASK_FADE, sat; +} params; + +#pragma parameter blurx "Convergence X-Axis" 0.45 -1.0 2.0 0.05 +#pragma parameter blury "Convergence Y-Axis" -0.25 -1.0 1.0 0.05 +#pragma parameter HIGHSCANAMOUNT1 "Scanline Amount (Low)" 0.3 0.0 1.0 0.05 +#pragma parameter HIGHSCANAMOUNT2 "Scanline Amount (High)" 0.2 0.0 1.0 0.05 +#pragma parameter MASK_DARK "Mask Effect Amount" 0.25 0.0 1.0 0.05 +#pragma parameter MASK_FADE "Mask/Scanline Fade" 0.8 0.0 1.0 0.05 +#pragma parameter sat "Saturation" 1.1 0.0 3.0 0.05 + +#define pi 3.14159 +#define blurx params.blurx +#define blury params.blury +#define HIGHSCANAMOUNT1 params.HIGHSCANAMOUNT1 +#define HIGHSCANAMOUNT2 params.HIGHSCANAMOUNT2 +#define BRIGHTBOOST params.BRIGHTBOOST +#define MASK_DARK params.MASK_DARK +#define MASK_FADE params.MASK_FADE +#define sat params.sat + +layout(std140, set = 0, binding = 0) uniform UBO +{ + mat4 MVP; +} global; + +#pragma stage vertex +layout(location = 0) in vec4 Position; +layout(location = 1) in vec2 TexCoord; +layout(location = 0) out vec2 vTexCoord; +layout(location = 1) out float maskFade; + +void main() +{ + gl_Position = global.MVP * Position; + vTexCoord = TexCoord; + maskFade = 0.3333*MASK_FADE; +} + + +#pragma stage fragment +layout(location = 0) in vec2 vTexCoord; +layout(location = 1) in float maskFade; +layout(location = 0) out vec4 FragColor; +layout(set = 0, binding = 2) uniform sampler2D Source; + +void main() +{ + vec2 pos = vTexCoord.xy; + + vec3 sample1 = texture(Source,vec2(pos.x + blurx/1000.0, pos.y - blury/1000.0)).rgb; + vec3 sample2 = texture(Source,pos).rgb; + vec3 sample3 = texture(Source,vec2(pos.x - blurx/1000.0, pos.y + blury/1000.0)).rgb; + + vec3 colour = vec3 (sample1.r*0.5+sample2.r*0.5, sample1.g*0.25 + sample2.g*0.5 + sample3.g*0.25, sample2.b*0.5 + sample3.b*0.5); + float lum = colour.r*0.4 + colour.g*0.4 + colour.b*0.2; + + vec3 lumweight=vec3(0.3,0.6,0.1); + float gray = dot(colour,lumweight); + vec3 graycolour = vec3(gray); + + //Gamma-like + colour*=mix(0.4,1.0,lum); + + float SCANAMOUNT = mix(HIGHSCANAMOUNT1,HIGHSCANAMOUNT2,lum); + float scanLine = SCANAMOUNT * sin(2.0*pi*pos.y*params.SourceSize.y); + + float whichmask = fract(gl_FragCoord.x*-0.4999); + float mask = 1.0 + float(whichmask < 0.5) * -MASK_DARK; + + //Gamma-like + colour*=mix(2.0,1.0,lum); + + colour = vec3(mix(graycolour,colour.rgb,sat)); + + colour.rgb *= mix(mask*(1.0-scanLine), 1.0-scanLine, dot(colour.rgb,vec3(maskFade))); + FragColor.rgb = colour.rgb; +} diff --git a/crt/zfast-crt-composite.slangp b/crt/zfast-crt-composite.slangp new file mode 100644 index 0000000..ef4f6fd --- /dev/null +++ b/crt/zfast-crt-composite.slangp @@ -0,0 +1,7 @@ +shaders = 1 +shader0 = shaders/zfast_crt/zfast_crt_composite.slang +filter_linear0 = true +wrap_mode0 = clamp_to_border +mipmap_input0 = false +float_framebuffer0 = false +srgb_framebuffer0 = false