Skip to content

Instantly share code, notes, and snippets.

@wareya
Last active August 27, 2023 20:05
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wareya/381f83c8e84f56a87173bb9fd1047030 to your computer and use it in GitHub Desktop.
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
// 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