mirror of
https://github.com/italicsjenga/slang-shaders.git
synced 2024-11-22 15:51:30 +11:00
some ports from GLSL (#466)
* some ports from glsl * add ntsc-feather * Add files via upload * Rename ntsc/shaders/ntsc-feather.slang to ntsc/shaders/ntsc-simple/ntsc-feather.slang * Update zfast_crt_composite.slang 1:1 with GLSL
This commit is contained in:
parent
6485e4c610
commit
89530c1dec
|
@ -19,18 +19,21 @@ layout(push_constant) uniform Push
|
||||||
vec4 OriginalSize;
|
vec4 OriginalSize;
|
||||||
vec4 OutputSize;
|
vec4 OutputSize;
|
||||||
uint FrameCount;
|
uint FrameCount;
|
||||||
float pi, blurx, blury, HIGHSCANAMOUNT1, HIGHSCANAMOUNT2, MASK_DARK, MASK_FADE, sat, FLICK;
|
float pi, blurx, blury, HIGHSCANAMOUNT1, HIGHSCANAMOUNT2, MASK_DARK, MASK_FADE, sat, FLICK,TYPE,Curvature;
|
||||||
} params;
|
} params;
|
||||||
|
|
||||||
#pragma parameter blurx "Convergence X-Axis" 0.45 -1.0 2.0 0.05
|
#pragma parameter Curvature "Curvature" 1.0 0.0 1.0 1.0
|
||||||
#pragma parameter blury "Convergence Y-Axis" -0.25 -1.0 1.0 0.05
|
#pragma parameter blurx "Convergence X-Axis" 0.85 -1.0 2.0 0.05
|
||||||
|
#pragma parameter blury "Convergence Y-Axis" -0.10 -1.0 1.0 0.05
|
||||||
#pragma parameter HIGHSCANAMOUNT1 "Scanline Amount (Low)" 0.4 0.0 1.0 0.05
|
#pragma parameter HIGHSCANAMOUNT1 "Scanline Amount (Low)" 0.4 0.0 1.0 0.05
|
||||||
#pragma parameter HIGHSCANAMOUNT2 "Scanline Amount (High)" 0.3 0.0 1.0 0.05
|
#pragma parameter HIGHSCANAMOUNT2 "Scanline Amount (High)" 0.3 0.0 1.0 0.05
|
||||||
|
#pragma parameter TYPE "Mask Type" 0.0 0.0 1.0 1.0
|
||||||
#pragma parameter MASK_DARK "Mask Effect Amount" 0.3 0.0 1.0 0.05
|
#pragma parameter MASK_DARK "Mask Effect Amount" 0.3 0.0 1.0 0.05
|
||||||
#pragma parameter MASK_FADE "Mask/Scanline Fade" 0.7 0.0 1.0 0.05
|
#pragma parameter MASK_FADE "Mask/Scanline Fade" 0.7 0.0 1.0 0.05
|
||||||
#pragma parameter sat "Saturation" 1.0 0.0 3.0 0.05
|
#pragma parameter sat "Saturation" 1.0 0.0 3.0 0.05
|
||||||
#pragma parameter FLICK "Flicker" 10.0 0.0 50.0 1.0
|
#pragma parameter FLICK "Flicker" 10.0 0.0 50.0 1.0
|
||||||
|
|
||||||
|
|
||||||
#define pi 3.14159
|
#define pi 3.14159
|
||||||
#define blurx params.blurx
|
#define blurx params.blurx
|
||||||
#define blury params.blury
|
#define blury params.blury
|
||||||
|
@ -41,9 +44,13 @@ float pi, blurx, blury, HIGHSCANAMOUNT1, HIGHSCANAMOUNT2, MASK_DARK, MASK_FADE,
|
||||||
#define MASK_FADE params.MASK_FADE
|
#define MASK_FADE params.MASK_FADE
|
||||||
#define sat params.sat
|
#define sat params.sat
|
||||||
#define FLICK params.FLICK
|
#define FLICK params.FLICK
|
||||||
|
#define Curvature params.Curvature
|
||||||
|
#define TYPE params.TYPE
|
||||||
|
|
||||||
#define SourceSize params.SourceSize
|
#define SourceSize params.SourceSize
|
||||||
#define OriginalSize params.OriginalSize
|
#define OriginalSize params.OriginalSize
|
||||||
#define OutputSize params.OutputSize
|
#define OutputSize params.OutputSize
|
||||||
|
#define scale vec4(SourceSize.xy/OriginalSize.xy,OriginalSize.xy/SourceSize.xy)
|
||||||
|
|
||||||
layout(std140, set = 0, binding = 0) uniform UBO
|
layout(std140, set = 0, binding = 0) uniform UBO
|
||||||
{
|
{
|
||||||
|
@ -55,18 +62,22 @@ layout(location = 0) in vec4 Position;
|
||||||
layout(location = 1) in vec2 TexCoord;
|
layout(location = 1) in vec2 TexCoord;
|
||||||
layout(location = 0) out vec2 vTexCoord;
|
layout(location = 0) out vec2 vTexCoord;
|
||||||
layout(location = 1) out float maskFade;
|
layout(location = 1) out float maskFade;
|
||||||
|
layout(location = 2) out float omega;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = global.MVP * Position;
|
gl_Position = global.MVP * Position;
|
||||||
vTexCoord = TexCoord*1.0001;
|
vTexCoord = TexCoord*1.0001;
|
||||||
maskFade = 0.3333*MASK_FADE;
|
maskFade = 0.3333*MASK_FADE;
|
||||||
|
omega = 2.0*pi*SourceSize.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#pragma stage fragment
|
#pragma stage fragment
|
||||||
layout(location = 0) in vec2 vTexCoord;
|
layout(location = 0) in vec2 vTexCoord;
|
||||||
layout(location = 1) in float maskFade;
|
layout(location = 1) in float maskFade;
|
||||||
|
layout(location = 2) in float omega;
|
||||||
|
|
||||||
layout(location = 0) out vec4 FragColor;
|
layout(location = 0) out vec4 FragColor;
|
||||||
layout(set = 0, binding = 2) uniform sampler2D Source;
|
layout(set = 0, binding = 2) uniform sampler2D Source;
|
||||||
|
|
||||||
|
@ -75,13 +86,36 @@ layout(set = 0, binding = 2) uniform sampler2D Source;
|
||||||
#define iTimer (float(params.FrameCount)*2.0)
|
#define iTimer (float(params.FrameCount)*2.0)
|
||||||
#define flicker FLICK/1000.0
|
#define flicker FLICK/1000.0
|
||||||
|
|
||||||
|
// Distortion of scanlines, and end of screen alpha.
|
||||||
|
vec2 Warp(vec2 pos)
|
||||||
|
{
|
||||||
|
pos = pos*2.0-1.0;
|
||||||
|
pos *= vec2(1.0 + (pos.y*pos.y)*0.03, 1.0 + (pos.x*pos.x)*0.05);
|
||||||
|
|
||||||
|
return pos*0.5 + 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
vec2 pos = vTexCoord;
|
vec2 pos,corn;
|
||||||
float cent = floor(vTexCoord.y*SourceSize.y)+0.5;
|
if (Curvature == 1.0)
|
||||||
|
{
|
||||||
|
pos = Warp(vTexCoord.xy);
|
||||||
|
corn = min(pos,vec2(1.0)-pos); // This is used to mask the rounded
|
||||||
|
corn.x = 0.00001/corn.x; // corners later on
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else pos = vTexCoord;
|
||||||
|
float OGL2Pos = pos.y*SourceSize.y;
|
||||||
|
float cent = floor(OGL2Pos)+0.5;
|
||||||
float ycoord = cent*SourceSize.w;
|
float ycoord = cent*SourceSize.w;
|
||||||
pos = vec2(vTexCoord.x,ycoord);
|
ycoord = mix(pos.y,ycoord,0.6);
|
||||||
|
pos = vec2(pos.x,ycoord);
|
||||||
|
|
||||||
|
|
||||||
vec3 sample1 = sin(iTimer)*flicker + texture(Source,vec2(pos.x + blur_x, pos.y - blur_y)).rgb;
|
vec3 sample1 = sin(iTimer)*flicker + texture(Source,vec2(pos.x + blur_x, pos.y - blur_y)).rgb;
|
||||||
vec3 sample2 = 0.5*texture(Source,pos).rgb;
|
vec3 sample2 = 0.5*texture(Source,pos).rgb;
|
||||||
vec3 sample3 = sin(iTimer)*flicker + texture(Source,vec2(pos.x - blur_x, pos.y + blur_y)).rgb;
|
vec3 sample3 = sin(iTimer)*flicker + texture(Source,vec2(pos.x - blur_x, pos.y + blur_y)).rgb;
|
||||||
|
@ -90,23 +124,33 @@ void main()
|
||||||
sample1.g*0.25 + sample2.g + sample3.g*0.25,
|
sample1.g*0.25 + sample2.g + sample3.g*0.25,
|
||||||
sample2.b + sample3.b*0.5);
|
sample2.b + sample3.b*0.5);
|
||||||
|
|
||||||
|
vec3 interl = colour;
|
||||||
vec3 lumweight=vec3(0.22,0.71,0.07);
|
vec3 lumweight=vec3(0.22,0.71,0.07);
|
||||||
float lum = dot(colour,lumweight);
|
float lumsat = dot(colour,lumweight);
|
||||||
|
|
||||||
vec3 graycolour = vec3(lum);
|
vec3 graycolour = vec3(lumsat);
|
||||||
colour = vec3(mix(graycolour,colour.rgb,sat));
|
colour = vec3(mix(graycolour,colour.rgb,sat));
|
||||||
|
|
||||||
float SCANAMOUNT = mix(HIGHSCANAMOUNT1,HIGHSCANAMOUNT2,max(max(colour.r,colour.g),colour.b));
|
float SCANAMOUNT = mix(HIGHSCANAMOUNT1,HIGHSCANAMOUNT2,max(max(colour.r,colour.g),colour.b));
|
||||||
|
|
||||||
float scanLine = SCANAMOUNT * sin(fract(vTexCoord.y*SourceSize.y)*3.14159)+1.0-SCANAMOUNT;
|
|
||||||
|
|
||||||
if (OriginalSize.y > 400.0) scanLine = 1.0;
|
if (OriginalSize.y > 400.0) {
|
||||||
|
colour ;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
colour *= SCANAMOUNT * sin(fract(OGL2Pos)*3.14159)+1.0-SCANAMOUNT;
|
||||||
|
colour *= SCANAMOUNT * sin(fract(1.0-OGL2Pos)*3.14159)+1.0-SCANAMOUNT;
|
||||||
|
colour *= SCANAMOUNT * sin(fract(1.0+OGL2Pos)*3.14159)+1.0-SCANAMOUNT;
|
||||||
|
}
|
||||||
|
|
||||||
float whichmask = fract(vTexCoord.x*OutputSize.x*0.4999);
|
float steps; if (TYPE == 0.0) steps = 0.5; else steps = 0.3333;
|
||||||
float mask = 1.0 + float(whichmask < 0.5) * -MASK_DARK;
|
float whichmask = fract(vTexCoord.x*OutputSize.x*steps);
|
||||||
|
float mask = 1.0 + float(whichmask < steps) * -MASK_DARK;
|
||||||
|
|
||||||
|
colour.rgb = mix(mask*colour, colour, dot(colour.rgb,vec3(maskFade)));
|
||||||
|
|
||||||
|
if (Curvature == 1.0 && corn.y < corn.x || Curvature == 1.0 && corn.x < 0.00001 )
|
||||||
|
colour = vec3(0.0);
|
||||||
|
|
||||||
colour *= colour;
|
|
||||||
colour.rgb *= mix(mask*scanLine, scanLine, dot(colour.rgb,vec3(maskFade)));
|
|
||||||
colour = sqrt(colour);
|
|
||||||
FragColor.rgb = colour.rgb;
|
FragColor.rgb = colour.rgb;
|
||||||
}
|
}
|
||||||
|
|
8
interpolation/half_res.slangp
Normal file
8
interpolation/half_res.slangp
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
shaders = "1"
|
||||||
|
feedback_pass = "0"
|
||||||
|
shader0 = "../stock.slang"
|
||||||
|
filter_linear0 = false
|
||||||
|
scale_type_x0 = "source"
|
||||||
|
scale_x0 = "1.0"
|
||||||
|
scale_type_y0 = "source"
|
||||||
|
scale_y0 = "0.5"
|
6
ntsc/ntsc-feather.slangp
Normal file
6
ntsc/ntsc-feather.slangp
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
shaders = 1
|
||||||
|
shader0 = shaders/ntsc-simple/ntsc-feather.slang
|
||||||
|
filter_linear0 = true
|
||||||
|
|
||||||
|
|
||||||
|
|
146
ntsc/shaders/ntsc-simple/ntsc-feather.slang
Normal file
146
ntsc/shaders/ntsc-simple/ntsc-feather.slang
Normal file
|
@ -0,0 +1,146 @@
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
|
||||||
|
layout(push_constant) uniform Push
|
||||||
|
{
|
||||||
|
float MASK;
|
||||||
|
float COMPOSITE_LOWPASS;
|
||||||
|
float COL_BLEED;
|
||||||
|
float NTSC_COL;
|
||||||
|
|
||||||
|
} params;
|
||||||
|
|
||||||
|
|
||||||
|
#pragma parameter MASK "Color Subcarrier Artifacts" 0.08 0.0 1.0 0.01
|
||||||
|
#pragma parameter COMPOSITE_LOWPASS "Composite Lowpass" 0.8 0.0 2.0 0.05
|
||||||
|
#pragma parameter COL_BLEED "Chroma Bleed" 1.4 0.0 2.0 0.05
|
||||||
|
#pragma parameter NTSC_COL "NTSC Colors " 0.0 0.0 1.0 1.0
|
||||||
|
|
||||||
|
#define MASK params.MASK
|
||||||
|
#define COMPOSITE_LOWPASS params.COMPOSITE_LOWPASS
|
||||||
|
#define COL_BLEED params.COL_BLEED
|
||||||
|
#define NTSC_COL params.NTSC_COL
|
||||||
|
#define PI 3.141592
|
||||||
|
|
||||||
|
layout(std140, set = 0, binding = 0) uniform UBO
|
||||||
|
{
|
||||||
|
mat4 MVP;
|
||||||
|
vec4 OutputSize;
|
||||||
|
vec4 OriginalSize;
|
||||||
|
vec4 SourceSize;
|
||||||
|
uint FrameCount;
|
||||||
|
|
||||||
|
} global;
|
||||||
|
|
||||||
|
|
||||||
|
#define OutputSize global.OutputSize
|
||||||
|
#define SourceSize global.SourceSize
|
||||||
|
#define OriginalSize global.OriginalSize
|
||||||
|
#define FrameCount global.FrameCount
|
||||||
|
|
||||||
|
|
||||||
|
#pragma stage vertex
|
||||||
|
layout(location = 0) in vec4 Position;
|
||||||
|
layout(location = 1) in vec2 TexCoord;
|
||||||
|
layout(location = 0) out vec2 vTexCoord;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = global.MVP * Position;
|
||||||
|
vTexCoord = TexCoord * 1.0001;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#pragma stage fragment
|
||||||
|
layout(location = 0) in vec2 vTexCoord;
|
||||||
|
layout(location = 0) out vec4 FragColor;
|
||||||
|
layout(set = 0, binding = 2) uniform sampler2D Source;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mat3 RGBtoYIQ = mat3(
|
||||||
|
0.2989, 0.5870, 0.1140,
|
||||||
|
0.5959, -0.2744, -0.3216,
|
||||||
|
0.2115, -0.5229, 0.3114);
|
||||||
|
|
||||||
|
mat3 YIQtoRGB = mat3(
|
||||||
|
1.0, 0.956, 0.6210,
|
||||||
|
1.0, -0.2720, -0.6474,
|
||||||
|
1.0, -1.1060, 1.7046);
|
||||||
|
|
||||||
|
const mat3 NTSC = mat3(
|
||||||
|
1.8088923, -0.6480268, -0.0833558,
|
||||||
|
0.4062922 , 0.6175271, -0.0038849,
|
||||||
|
-0.0025872, -0.103848 , 1.182318);
|
||||||
|
|
||||||
|
#define Time sin(float(FrameCount))
|
||||||
|
|
||||||
|
float phase = OriginalSize.x<300.0 ? 4.0*PI/15.0 : PI/3.0;
|
||||||
|
#define SC MASK*sin(vTexCoord.x*SourceSize.x*phase)+1.0-MASK
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
|
||||||
|
vec2 cent = floor(vTexCoord*SourceSize.xy)+0.5;
|
||||||
|
vec2 coords = cent*SourceSize.zw;
|
||||||
|
coords = vec2(mix(vTexCoord.x,coords.x,0.2),coords.y);
|
||||||
|
|
||||||
|
vec3 res = texture(Source,coords).rgb; res *= RGBtoYIQ;
|
||||||
|
float onetexel = SourceSize.z*COMPOSITE_LOWPASS;
|
||||||
|
float bleed = SourceSize.z*COL_BLEED;
|
||||||
|
vec3 resr = texture(Source,coords-(vec2(2.0*bleed,0.0))).rgb; resr *= RGBtoYIQ;
|
||||||
|
vec3 resru = texture(Source,coords-(vec2(onetexel,0.0))).rgb; resru *= RGBtoYIQ;
|
||||||
|
vec3 resrr = texture(Source,coords-(vec2(3.0*bleed,0.0))).rgb; resrr *= RGBtoYIQ;
|
||||||
|
|
||||||
|
vec3 resl = texture(Source,coords+(vec2(2.0*bleed,0.0))).rgb; resl *= RGBtoYIQ;
|
||||||
|
vec3 reslu = texture(Source,coords+(vec2(bleed,0.0))).rgb; reslu *= RGBtoYIQ;
|
||||||
|
vec3 resll = texture(Source,coords+(vec2(3.0*bleed,0.0))).rgb; resll *= RGBtoYIQ;
|
||||||
|
|
||||||
|
//color bleed
|
||||||
|
res.gb += (resr.gb+resl.gb+resrr.gb+resll.gb+reslu.gb+resru.gb); res.gb /= 7.0;
|
||||||
|
//overall bluriness
|
||||||
|
res.r = (res.r + resru.r)/2.0;
|
||||||
|
|
||||||
|
vec3 checker = texture(Source,vTexCoord - vec2(0.25/OriginalSize.x,0.0)).rgb; checker *= RGBtoYIQ;
|
||||||
|
vec3 checkerl = texture(Source,vTexCoord + vec2(0.1/OriginalSize.x,0.0)).rgb; checkerl *= RGBtoYIQ;
|
||||||
|
|
||||||
|
float diff = res.g-checker.g;
|
||||||
|
float diffl = res.g-checkerl.g;
|
||||||
|
float ydiff = res.r-checker.r;
|
||||||
|
float ydiffl = res.r-checkerl.r;
|
||||||
|
|
||||||
|
float x = mod(floor(vTexCoord.x*SourceSize.x),2.0);
|
||||||
|
float y = mod(floor(vTexCoord.y*SourceSize.y),2.0);
|
||||||
|
|
||||||
|
|
||||||
|
//Color subcarrier pattern
|
||||||
|
if (y == 0.0 && x == 0.0 && Time < 0.0 && diff > 0.0 || y == 0.0 && x == 1.0 && Time > 0.0 && diff > 0.0)
|
||||||
|
|
||||||
|
res.b *= SC; // ok
|
||||||
|
|
||||||
|
else if (y == 1.0 && x == 1.0 && Time < 0.0 && diff > 0.0 || y == 1.0 && x == 0.0 && Time > 0.0 && diff > 0.0)
|
||||||
|
|
||||||
|
res.b *= SC; // ok
|
||||||
|
|
||||||
|
else if (y == 0.0 && x == 0.0 && Time < 0.0 && ydiff < 0.0 || y == 0.0 && x == 1.0 && Time > 0.0 && ydiff < 0.0)
|
||||||
|
|
||||||
|
res.r *= SC; // ok
|
||||||
|
|
||||||
|
else if (y == 1.0 && x == 1.0 && Time < 0.0 && ydiff < 0.0 || y == 1.0 && x == 0.0 && Time > 0.0 && ydiff < 0.0)
|
||||||
|
res.r *= SC; // ok
|
||||||
|
|
||||||
|
else if (y == 0.0 && x == 0.0 && Time < 0.0 && ydiffl < 0.0 || y == 0.0 && x == 1.0 && Time > 0.0 && ydiffl < 0.0)
|
||||||
|
|
||||||
|
res.r *= SC;
|
||||||
|
|
||||||
|
else if (y == 1.0 && x == 1.0 && Time < 0.0 && ydiffl < 0.0 || y == 1.0 && x == 0.0 && Time > 0.0 && ydiffl < 0.0)
|
||||||
|
res.r *= SC;
|
||||||
|
|
||||||
|
//for testing
|
||||||
|
//if (ydiffl < 0.0) res = vec3(0.0);
|
||||||
|
|
||||||
|
///
|
||||||
|
res *= YIQtoRGB;
|
||||||
|
if (NTSC_COL == 1.0)res *= NTSC;
|
||||||
|
FragColor = vec4(res,1.0);
|
||||||
|
}
|
Loading…
Reference in a new issue