mkxp-sunshine/shader/crt.frag

124 lines
2.7 KiB
GLSL

uniform sampler2D texture;
uniform lowp vec4 tone;
uniform lowp float opacity;
uniform lowp vec4 color;
uniform lowp vec4 modulate;
uniform float bushDepth;
uniform lowp float bushOpacity;
uniform float uTime;
varying vec2 v_texCoord;
const vec3 lumaF = vec3(.299, .587, .114);
const bool simple = false;
const float disort = 0.5;
const float lines_scale = 3.0;
const float lines_fill = 0.075;
const float lines_speed = 0.19;
const float lines_opacity = 0.25;
const float layers_scale = 0.01;
const float layers_fill = 0.5;
const float layers_opacity = 0.25;
const float edge_dark_power = 1.0;
const float edge_dark_dist = 0.05;
const float chromatic_power = 0.0005;
const vec2 scale = vec2(0.85, 0.8);
float distance(vec2 v) {
return sqrt(v.x * v.x + v.y * v.y);
}
void main(){
// ------- crt --------
vec2 uv = v_texCoord;
float layers = 0.0;
vec2 edge_dark = vec2(0);
float edge_dark_res = 0.0;
vec4 frag;
uv -= 0.5;
uv /= scale;
float uv_dist = distance(uv);
uv = mix(uv, vec2(0), uv_dist * -disort) / (1.0 + disort / 2.0);
float lines_uv = (uv.y / lines_scale) - uTime * lines_speed;
float lines = floor(lines_uv + lines_fill) - floor(lines_uv);
lines *= lines_opacity;
if (!simple) {
float layers_uv = (uv.y / layers_scale);
layers = clamp(sin(layers_uv * 3.1415) - (1.0 - layers_fill), 0.0, 1.0);
layers *= layers_opacity;
edge_dark = abs(uv) * 2.0;
edge_dark -= 1.0 - edge_dark_dist;
edge_dark /= edge_dark_dist;
edge_dark = clamp(edge_dark, 0.0, 1.0);
edge_dark *= edge_dark_power;
edge_dark_res = edge_dark.x + edge_dark.y;
uv *= scale;
uv += 0.5;
vec4 frag1 = texture2D(texture, uv + vec2(-1, 1) * chromatic_power);
vec4 frag2 = texture2D(texture, uv + vec2(1, -1) * chromatic_power);
vec4 frag3 = texture2D(texture, uv);
frag = vec4(frag1.r, frag2.g, frag3.b, (frag1.w + frag2.w + frag3.w) / 3.0);
}
else
{
uv *= scale;
uv += 0.5;
frag = texture2D(texture, uv);
}
frag += vec4(lines, lines, lines, 0.0) -
vec4(layers, layers, layers, 0.0) -
vec4(edge_dark_res, edge_dark_res, edge_dark_res, 0.0);
frag.rgb = clamp(frag.rgb, 0.0, 1.0);
// ------- original shit --------
/* Apply gray */
float luma = dot(frag.rgb, lumaF);
frag.rgb = mix(frag.rgb, vec3(luma), tone.w);
/* Apply tone */
frag.rgb += tone.rgb;
/* Apply opacity */
frag.a *= opacity;
/* Apply color */
frag.rgb = mix(frag.rgb, color.rgb, color.a);
/* Apply modulation */
frag *= modulate;
/* Apply bush alpha by mathematical if */
lowp float underBush = float(v_texCoord.y < bushDepth);
frag.a *= clamp(bushOpacity + underBush, 0.0, 1.0);
gl_FragColor = mix(
frag,
vec4(0, 0, 0, 1),
float(uv.x < 0.0) +
float(uv.x > 1.0) +
float(uv.y < 0.0) +
float(uv.y > 1.0)
);
}