Last active
August 27, 2023 20:05
-
-
Save wareya/381f83c8e84f56a87173bb9fd1047030 to your computer and use it in GitHub Desktop.
mpv user shader that gets rid of the scanline filter applied to Kino No Tabi
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// pass to add a second frame area | |
//!HOOK MAINPRESUB | |
//!BIND HOOKED | |
//!HEIGHT HOOKED.h 2 * | |
vec4 hook() | |
{ | |
if(HOOKED_pos.y < 0.5) | |
return HOOKED_tex(vec2(HOOKED_pos.x,HOOKED_pos.y*2.0)); | |
else | |
return HOOKED_tex(vec2(HOOKED_pos.x,HOOKED_pos.y*2.0-1.0)); | |
} | |
// passes to bandpass second frame area | |
// ----- pass 1 | |
//!HOOK MAINPRESUB | |
//!BIND HOOKED | |
#define M(a,b) ((a)*vec4((b),(b),(b),(b))) | |
#define A(a,b) ((a)+vec4((b),(b),(b),(b))) | |
vec4 inner_s(float x, float y) { return HOOKED_tex(vec2(x, y)); } | |
vec4 s(float x, float y) | |
{ x *= HOOKED_pt.x; x += HOOKED_pos.x; y *= HOOKED_pt.y; y += HOOKED_pos.y; /* <- scaling logic */ | |
x=(x<0.0)?0.0:(x>1.0)?1.0:x; y=(y<0.5)?0.5:(y>1.0)?1.0:y; /* <- clamp logic */ | |
return inner_s(x, y); } | |
vec4 z (float x) { return M(s(x,-2.0), -0.25) + M(s(x,0.0), 0.5) + M(s(x,2.0), -0.25); } | |
vec4 hook() | |
{ if(HOOKED_pos.y < 0.5) return HOOKED_tex(vec2(HOOKED_pos.x,HOOKED_pos.y)); | |
else return A(M(M((z(-2.0)+z(-1.0)+z(0.0)+z(1.0)+z(2.0)), 0.2), 0.5), 0.5); // outer add and multiply: fit range of texture | |
} | |
// ----- pass 2 | |
//!HOOK MAINPRESUB | |
//!BIND HOOKED | |
#define M(a,b) ((a)*vec4((b),(b),(b),(b))) | |
#define A(a,b) ((a)+vec4((b),(b),(b),(b))) | |
vec4 inner_s(float x, float y) { return M(A(HOOKED_tex(vec2(x, y)), -0.5), 2.0); } // reading requires changing number space now | |
vec4 s(float x, float y) | |
{ x *= HOOKED_pt.x; x += HOOKED_pos.x; y *= HOOKED_pt.y; y += HOOKED_pos.y; /* <- scaling logic */ | |
x=(x<0.0)?0.0:(x>1.0)?1.0:x; y=(y<0.5)?0.5:(y>1.0)?1.0:y; /* <- clamp logic */ | |
return inner_s(x, y); } | |
vec4 z (float x) { return M(s(x,-2.0), -0.25) + M(s(x,0.0), 0.5) + M(s(x,2.0), -0.25); } | |
vec4 hook() | |
{ if(HOOKED_pos.y < 0.5) return HOOKED_tex(vec2(HOOKED_pos.x,HOOKED_pos.y)); | |
else return A(M(M((z(-4.0)+z(-2.0)+z(0.0)+z(2.0)+z(4.0)), 0.2), 0.5), 0.5); | |
} | |
// ----- pass 3 | |
//!HOOK MAINPRESUB | |
//!BIND HOOKED | |
#define M(a,b) ((a)*vec4((b),(b),(b),(b))) | |
#define A(a,b) ((a)+vec4((b),(b),(b),(b))) | |
vec4 inner_s(float x, float y) { return M(A(HOOKED_tex(vec2(x, y)), -0.5), 2.0); } // reading requires changing number space now | |
vec4 s(float x, float y) | |
{ x *= HOOKED_pt.x; x += HOOKED_pos.x; y *= HOOKED_pt.y; y += HOOKED_pos.y; /* <- scaling logic */ | |
x=(x<0.0)?0.0:(x>1.0)?1.0:x; y=(y<0.5)?0.5:(y>1.0)?1.0:y; /* <- clamp logic */ | |
return inner_s(x, y); } | |
vec4 z (float x) { return M(s(x,-2.0), -0.25) + M(s(x,0.0), 0.5) + M(s(x,2.0), -0.25); } | |
vec4 hook() | |
{ if(HOOKED_pos.y < 0.5) return HOOKED_tex(vec2(HOOKED_pos.x,HOOKED_pos.y)); | |
else return A(M(M((z(-8.0)+z(-4.0)+z(0.0)+z(4.0)+z(8.0)), 0.2), 0.5), 0.5); | |
} | |
// pass to make a highpass image from which to derive information about how much we should filter each area | |
//!HOOK MAINPRESUB | |
//!BIND HOOKED | |
//!HEIGHT HOOKED.h 1.5 * | |
#define ANXIETY 35.0 // strength reduction of the filter near high frequency information like credit text | |
// high frequency information detection area dimensions (square shape) | |
#define SPAN 8.0 | |
// increase this if it's slow but you need a high SPAN (high values reduce quality of high frequency data detection!) | |
#define RATE 2.0 | |
#define M(a,b) ((a)*vec4((b),(b),(b),(b))) | |
#define A(a,b) ((a)+vec4((b),(b),(b),(b))) | |
#define W(x) (1.0-((x*0.9+0.05)*(x*0.9+0.05))) // rudimentary window | |
vec4 s(float x, float y) { return HOOKED_tex(vec2(HOOKED_pos.x+x*HOOKED_pt.x, (HOOKED_pos.y+y*HOOKED_pt.y)*3.0/2.0-1.0)); } | |
#define h1(x,y,w) highpass += M(s(x,y), W(w)); | |
#define h2(x,y,w) highpass -= M(s(x,y), W(w)); | |
vec4 highpass_line(float y) | |
{ vec4 highpass = vec4(0.0,0.0,0.0,0.0); | |
for(float i = -SPAN/2.0; i < SPAN/2.0-0.1; i += 2.0*RATE) | |
{ h1(i, y, i/SPAN*2.0) h2(i+RATE, y, i/SPAN*2.0) } | |
return highpass; | |
} | |
#define h3(y,w) highpass += M(highpass_line(y), W(w)); | |
#define h4(y,w) highpass -= M(highpass_line(y), W(w)); | |
vec4 highpass_scan() | |
{ vec4 highpass = vec4(0.0,0.0,0.0,0.0); | |
for(float i = -SPAN/2.0; i < SPAN/2.0-0.1; i += 2.0*RATE) | |
{ h3(i, i/SPAN*2.0) h4(i+RATE, i/SPAN*2.0) } | |
return highpass; | |
} | |
vec4 hook() | |
{ if(HOOKED_pos.y < (2.0/3.0)) | |
return HOOKED_tex(vec2(HOOKED_pos.x,HOOKED_pos.y*3.0/2.0)); | |
else | |
{ | |
vec4 highpass = highpass_scan(); | |
highpass = abs(highpass); | |
highpass = M(highpass, 1.0/SPAN/SPAN*RATE*RATE); | |
highpass = M(highpass, ANXIETY); | |
if(highpass.x < 0.0) highpass.x = 0.0; | |
if(highpass.y < 0.0) highpass.y = 0.0; | |
if(highpass.z < 0.0) highpass.z = 0.0; | |
if(highpass.w < 0.0) highpass.w = 0.0; | |
if(highpass.x > 1.0) highpass.x = 1.0; | |
if(highpass.y > 1.0) highpass.y = 1.0; | |
if(highpass.z > 1.0) highpass.z = 1.0; | |
if(highpass.w > 1.0) highpass.w = 1.0; | |
highpass = A(M(highpass, -1.0), 1.0); | |
return highpass; | |
} | |
} | |
// pass to make a highpass image from which to derive information about how much we should filter each area | |
//!HOOK MAINPRESUB | |
//!BIND HOOKED | |
//!HEIGHT HOOKED.h 3 / | |
#define TEMPER 128.0 // unwillingness to reduce the strength of the filter near high frequency stuff | |
#define M(a,b) ((a)*vec4((b),(b),(b),(b))) | |
#define A(a,b) ((a)+vec4((b),(b),(b),(b))) | |
vec4 s(float x, float y) { return min(vec4(1.0,1.0,1.0,1.0), M(HOOKED_tex(vec2(HOOKED_pos.x+x*HOOKED_pt.x, (HOOKED_pos.y+y*HOOKED_pt.y*3.0)/3.0+(2.0/3.0))), 1.0/(1.0-(TEMPER/255.0)))); } | |
//vec4 s(float x, float y) { return HOOKED_tex(vec2(HOOKED_pos.x+x*HOOKED_pt.x, (HOOKED_pos.y+y*HOOKED_pt.y)/3.0+(2.0/3.0))); } | |
#define h1(x,y) highpass = min(highpass, s(x,y)); | |
// aggressiveness of where to turn off the filter | |
#define SPANX 4.0 | |
#define SPANY 3.0 | |
vec4 highpass_line(float y) | |
{ vec4 highpass = vec4(1.0,1.0,1.0,1.0); | |
for(float i = -SPANX; i < SPANX-0.1; i += 1.0) | |
h1(i, y) | |
return highpass; | |
} | |
#define h2(y) highpass = min(highpass, highpass_line(y)); | |
vec4 highpass_scan() | |
{ vec4 highpass = vec4(1.0,1.0,1.0,1.0); | |
for(float i = -SPANY; i < SPANY-0.1; i += 1.0) | |
h2(i) | |
return highpass; | |
} | |
vec4 hook() | |
{ | |
vec4 normal = HOOKED_tex(vec2(HOOKED_pos.x,HOOKED_pos.y/3.0)); | |
vec4 bandpass = HOOKED_tex(vec2(HOOKED_pos.x,HOOKED_pos.y/3.0+(1.0/3.0))); | |
vec4 highpass = highpass_scan(); | |
// don't filter the top/bottom few rows of the screen | |
if(HOOKED_pos.y/3.0*HOOKED_size.y < 4.0 || HOOKED_pos.y/3.0*HOOKED_size.y > HOOKED_size.y/3.0-6.0) | |
return normal; | |
else | |
return normal - M(A(bandpass,-0.5),2.0)*highpass; | |
return highpass; | |
//return | |
//return HOOKED_tex(vec2(HOOKED_pos.x,HOOKED_pos.y/2.0)) - M(A(HOOKED_tex(vec2(HOOKED_pos.x,HOOKED_pos.y/2.0+0.5)),-0.5),2.0) * highpass; | |
//return HOOKED_tex(vec2(HOOKED_pos.x,HOOKED_pos.y/2.0+0.5)); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment