mirror of
https://github.com/mr0xb/dotfiles_chezmoi.git
synced 2026-08-27 19:34:57 -04:00
96 lines
3.7 KiB
GLSL
96 lines
3.7 KiB
GLSL
#define PI 3.141592653589793
|
|
|
|
float hash12(vec2 p) {
|
|
vec3 p3 = fract(vec3(p.xyx) * 0.1031);
|
|
p3 += dot(p3, p3.yzx + 33.33);
|
|
return fract((p3.x + p3.y) * p3.z);
|
|
}
|
|
|
|
float diamondSparkle(vec2 uv, float density, float threshold, float speed) {
|
|
vec2 g = uv * vec2(density, density * 0.55);
|
|
vec2 id = floor(g);
|
|
vec2 f = fract(g) - 0.5;
|
|
|
|
float n = hash12(id);
|
|
float gate = step(threshold, n);
|
|
float twinkle = pow(max(0.0, sin(iTime * speed + n * 6.2831853)), 36.0);
|
|
|
|
float diaD = abs(f.x) + abs(f.y);
|
|
float diamond = 1.0 - smoothstep(0.00, 0.10, diaD);
|
|
|
|
float vertical = (1.0 - smoothstep(0.00, 0.012, abs(f.x))) *
|
|
(1.0 - smoothstep(0.00, 0.38, abs(f.y)));
|
|
float horizontal = (1.0 - smoothstep(0.00, 0.012, abs(f.y))) *
|
|
(1.0 - smoothstep(0.00, 0.38, abs(f.x)));
|
|
|
|
return gate * twinkle * (diamond + 0.40 * (vertical + horizontal));
|
|
}
|
|
|
|
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
vec2 uv = fragCoord.xy / iResolution.xy;
|
|
vec2 px = 1.0 / iResolution.xy;
|
|
|
|
// Tiny VHS-ish horizontal wobble.
|
|
float wobble = sin(uv.y * 82.0 + iTime * 2.1) * 0.0008
|
|
+ sin(uv.y * 11.0 - iTime * 0.35) * 0.0012;
|
|
|
|
vec2 uvR = clamp(uv + vec2(wobble + px.x * 1.25, 0.0), vec2(0.001), vec2(0.999));
|
|
vec2 uvG = clamp(uv + vec2(wobble, 0.0), vec2(0.001), vec2(0.999));
|
|
vec2 uvB = clamp(uv + vec2(wobble - px.x * 1.25, 0.0), vec2(0.001), vec2(0.999));
|
|
|
|
vec4 base = texture(iChannel0, uvG);
|
|
vec3 src = vec3(
|
|
texture(iChannel0, uvR).r,
|
|
base.g,
|
|
texture(iChannel0, uvB).b
|
|
);
|
|
|
|
float lum = dot(src, vec3(0.299, 0.587, 0.114));
|
|
float ink = smoothstep(0.03, 0.22, lum);
|
|
float text = smoothstep(0.20, 0.78, lum);
|
|
|
|
// Cash-money palette: velvet black, dark leather brown, hot gold, pale diamond gold.
|
|
vec3 velvet = vec3(0.014, 0.008, 0.003);
|
|
vec3 brown = vec3(0.085, 0.044, 0.012);
|
|
vec3 gold = vec3(1.00, 0.66, 0.13);
|
|
vec3 paleGold = vec3(1.00, 0.90, 0.55);
|
|
|
|
vec3 bg = mix(
|
|
velvet,
|
|
brown,
|
|
uv.y + 0.20 * sin(uv.x * 3.0 + iTime * 0.10)
|
|
);
|
|
|
|
vec3 goldText = mix(gold * 0.75, paleGold, pow(lum, 0.75));
|
|
vec3 col = mix(bg, mix(src, goldText + src * 0.50, 0.48), ink);
|
|
|
|
// Jewelry-store light sweep / chrome-grille reflection.
|
|
float sweepA = pow(max(0.0, sin((uv.x * 1.8 + uv.y * 0.75) * PI * 2.0 - iTime * 0.60)), 22.0);
|
|
float sweepB = pow(max(0.0, sin((uv.x * -1.1 + uv.y * 1.25) * PI * 2.0 + iTime * 0.42)), 30.0);
|
|
col += (sweepA * 0.16 + sweepB * 0.11) * vec3(1.0, 0.83, 0.42) * (0.35 + text);
|
|
|
|
// Thin old-video scan shimmer, subtle enough to keep text readable.
|
|
float scan = 0.965 + 0.035 * sin(fragCoord.y * PI);
|
|
float vhs = 0.98 + 0.02 * hash12(vec2(floor(uv.y * 360.0), floor(iTime * 24.0)));
|
|
col *= scan * vhs;
|
|
|
|
// Random diamond/star hits.
|
|
float spark = diamondSparkle(uv, 74.0, 0.978, 4.5);
|
|
spark += 0.55 * diamondSparkle(uv + vec2(0.17, -0.11), 43.0, 0.970, 3.2);
|
|
col += spark * vec3(1.0, 0.88, 0.48) * (0.85 + 0.65 * text);
|
|
|
|
// Camera-flash blobs in the corners.
|
|
vec2 aspect = vec2(iResolution.x / iResolution.y, 1.0);
|
|
float flashL = 1.0 - smoothstep(0.00, 0.28, length((uv - vec2(0.14, 0.82)) * aspect));
|
|
float flashR = 1.0 - smoothstep(0.00, 0.34, length((uv - vec2(0.88, 0.18)) * aspect));
|
|
col += (flashL * 0.10 + flashR * 0.07) * vec3(1.0, 0.72, 0.22);
|
|
|
|
// Music-video edge falloff.
|
|
float vig = 1.0 - smoothstep(0.20, 0.82, distance(uv, vec2(0.5)));
|
|
col *= 0.80 + 0.20 * vig;
|
|
|
|
// Legibility save: blend some original terminal text back in.
|
|
col = mix(col, src, 0.18 * text);
|
|
|
|
fragColor = vec4(clamp(col, 0.0, 1.0), base.a);
|
|
}
|