RetroArch-Wii-U-Slang-Shaders/scalefx/shaders/scalefx-pass2.ppslang
2020-04-26 18:03:54 -05:00

160 lines
4.3 KiB
Text

#version 450
layout(push_constant)uniform Push
{
vec4 SourceSize;
} params;
layout(set = 0, binding = 0, std140)uniform UBO
{
mat4 MVP;
} global;
#pragma stagevertex
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 stagefragment
layout(location = 0)in vec2 vTexCoord;
layout(location = 0)out vec4 FragColor;
layout(binding = 1)uniform sampler2D Source;
layout(binding = 2)uniform sampler2D scalefx_pass0;
vec4 dom(vec3 x, vec3 y, vec3 z, vec3 w){
return 2 * vec4(x . y, y . y, z . y, w . y)-(vec4(x . x, y . x, z . x, w . x)+ vec4(x . z, y . z, z . z, w . z));
}
float clear(vec2 crn, vec2 a, vec2 b){
return(crn . x >= max(min(a . x, a . y), min(b . x, b . y)))&&(crn . y >= max(min(a . x, b . y), min(b . x, a . y)))? 1. : 0.;
}
void main()
{
vec4 A = textureOffset(scalefx_pass0, vTexCoord, ivec2(- 1, - 1)), B = textureOffset(scalefx_pass0, vTexCoord, ivec2(0, - 1));
vec4 D = textureOffset(scalefx_pass0, vTexCoord, ivec2(- 1, 0)), E = textureOffset(scalefx_pass0, vTexCoord, ivec2(0, 0)), F = textureOffset(scalefx_pass0, vTexCoord, ivec2(1, 0));
vec4 G = textureOffset(scalefx_pass0, vTexCoord, ivec2(- 1, 1)), H = textureOffset(scalefx_pass0, vTexCoord, ivec2(0, 1)), I = textureOffset(scalefx_pass0, vTexCoord, ivec2(1, 1));
vec4 As = textureOffset(Source, vTexCoord, ivec2(- 1, - 1)), Bs = textureOffset(Source, vTexCoord, ivec2(0, - 1)), Cs = textureOffset(Source, vTexCoord, ivec2(1, - 1));
vec4 Ds = textureOffset(Source, vTexCoord, ivec2(- 1, 0)), Es = textureOffset(Source, vTexCoord, ivec2(0, 0)), Fs = textureOffset(Source, vTexCoord, ivec2(1, 0));
vec4 Gs = textureOffset(Source, vTexCoord, ivec2(- 1, 1)), Hs = textureOffset(Source, vTexCoord, ivec2(0, 1)), Is = textureOffset(Source, vTexCoord, ivec2(1, 1));
vec4 jSx = vec4(As . z, Bs . w, Es . x, Ds . y), jDx = dom(As . yzw, Bs . zwx, Es . wxy, Ds . xyz);
vec4 jSy = vec4(Bs . z, Cs . w, Fs . x, Es . y), jDy = dom(Bs . yzw, Cs . zwx, Fs . wxy, Es . xyz);
vec4 jSz = vec4(Es . z, Fs . w, Is . x, Hs . y), jDz = dom(Es . yzw, Fs . zwx, Is . wxy, Hs . xyz);
vec4 jSw = vec4(Ds . z, Es . w, Hs . x, Gs . y), jDw = dom(Ds . yzw, Es . zwx, Hs . wxy, Gs . xyz);
vec4 zero4 = vec4(0);
vec4 jx = min((1 - step(jDx, zero4))*(step(jDx . yzwx, zero4)* step(jDx . wxyz, zero4)+(1 - step(jDx + jDx . zwxy, jDx . yzwx + jDx . wxyz))), 1);
vec4 jy = min((1 - step(jDy, zero4))*(step(jDy . yzwx, zero4)* step(jDy . wxyz, zero4)+(1 - step(jDy + jDy . zwxy, jDy . yzwx + jDy . wxyz))), 1);
vec4 jz = min((1 - step(jDz, zero4))*(step(jDz . yzwx, zero4)* step(jDz . wxyz, zero4)+(1 - step(jDz + jDz . zwxy, jDz . yzwx + jDz . wxyz))), 1);
vec4 jw = min((1 - step(jDw, zero4))*(step(jDw . yzwx, zero4)* step(jDw . wxyz, zero4)+(1 - step(jDw + jDw . zwxy, jDw . yzwx + jDw . wxyz))), 1);
vec4 res;
res . x = min(jx . z +(1 -(jx . y))*(1 -(jx . w))*(1 - step(jSx . z, 0))*(jx . x +(1 - step(jSx . x + jSx . z, jSx . y + jSx . w))), 1);
res . y = min(jy . w +(1 -(jy . z))*(1 -(jy . x))*(1 - step(jSy . w, 0))*(jy . y +(1 - step(jSy . y + jSy . w, jSy . x + jSy . z))), 1);
res . z = min(jz . x +(1 -(jz . w))*(1 -(jz . y))*(1 - step(jSz . x, 0))*(jz . z +(1 - step(jSz . x + jSz . z, jSz . y + jSz . w))), 1);
res . w = min(jw . y +(1 -(jw . x))*(1 -(jw . z))*(1 - step(jSw . y, 0))*(jw . w +(1 - step(jSw . y + jSw . w, jSw . x + jSw . z))), 1);
res = min(res *(vec4(jx . z, jy . w, jz . x, jw . y)+(1 -(res . wxyz * res . yzwx))), 1);
vec4 clr;
clr . x = clear(vec2(D . z, E . x), vec2(D . w, E . y), vec2(A . w, D . y));
clr . y = clear(vec2(F . x, E . z), vec2(E . w, E . y), vec2(B . w, F . y));
clr . z = clear(vec2(H . z, I . x), vec2(E . w, H . y), vec2(H . w, I . y));
clr . w = clear(vec2(H . x, G . z), vec2(D . w, H . y), vec2(G . w, G . y));
vec4 h = vec4(min(D . w, A . w), min(E . w, B . w), min(E . w, H . w), min(D . w, G . w));
vec4 v = vec4(min(E . y, D . y), min(E . y, F . y), min(H . y, I . y), min(H . y, G . y));
vec4 orien =(1 - step(h + vec4(D . w, E . w, E . w, D . w), v + vec4(E . y, E . y, H . y, H . y)));
vec4 hori =(1 - step(v, h))* clr;
vec4 vert =(1 - step(h, v))* clr;
FragColor =(res + 2 * hori + 4 * vert + 8 * orien)/ 15;
}