kik shader: fix random flicker while scrolling, smooth rain/radar/progress
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
b158c36502
commit
eb154cdf53
2 changed files with 152 additions and 17 deletions
133
shaders/fun.glsl
Normal file
133
shaders/fun.glsl
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
// 2016 David A Roberts <https://davidar.io>
|
||||
#define AA 4.
|
||||
|
||||
#define PI 3.141592653589793
|
||||
|
||||
// CRT effects (curvature, vignette, scanlines and CRT grille)
|
||||
// from <https://www.shadertoy.com/view/XtlSD7>
|
||||
vec2 CRTCurveUV( vec2 uv ) {
|
||||
uv = uv * 2.0 - 1.0;
|
||||
vec2 offset = abs( uv.yx ) / vec2( 6.0, 4.0 );
|
||||
uv = uv + uv * offset * offset;
|
||||
uv = uv * 0.5 + 0.5;
|
||||
return uv;
|
||||
}
|
||||
void DrawVignette( inout vec3 color, vec2 uv ) {
|
||||
float vignette = uv.x * uv.y * ( 1.0 - uv.x ) * ( 1.0 - uv.y );
|
||||
vignette = clamp( pow( 16.0 * vignette, 0.3 ), 0.0, 1.0 );
|
||||
color *= vignette;
|
||||
}
|
||||
void DrawScanline( inout vec3 color, vec2 uv ) {
|
||||
float scanline = clamp( 0.95 + 0.05 * cos( 3.14 * ( uv.y + 0.008 * iTime ) * 240.0 * 1.0 ), 0.0, 1.0 );
|
||||
float grille = 0.85 + 0.15 * clamp( 1.5 * cos( 3.14 * uv.x * 640.0 * 1.0 ), 0.0, 1.0 );
|
||||
color *= scanline * grille * 1.2;
|
||||
}
|
||||
|
||||
float atanp(in vec2 p) { return atan(p.y,p.x); }
|
||||
float cube_root(float x) { return sign(x) * pow(abs(x), 1./3.); }
|
||||
float sq(float x) { return x*x; }
|
||||
|
||||
vec3 margarita(in vec2 p) {
|
||||
float z = length(p) - 3.5 * atanp(p) + sin(p.x) + cos(p.y);
|
||||
if(mod(z,7.*PI) < PI/2.) return vec3(1,0,0);
|
||||
if(mod(z,1.*PI) < PI/2.) return vec3(0);
|
||||
return vec3(1);
|
||||
}
|
||||
|
||||
vec3 digital_bacteria(in vec2 p) {
|
||||
p /= 4.;
|
||||
float x = sq(sin(p.x)+p.y) + sq(cos(p.y)+p.x);
|
||||
float y = cos(10.*p.x) + cos(10.*p.y) - sin(p.x*p.y);
|
||||
float z = sq(sin(floor(p.x))+floor(p.y)) + sq(cos(floor(p.y))+floor(p.x));
|
||||
if(17. < x && x < 21. && 17. < z && z < 21. && y < 0.)
|
||||
return vec3(1.,1.,85./256.);
|
||||
if(17. < z && z < 21.) return vec3(85./256.,0.,0.);
|
||||
if(17. < x && x < 21.) return vec3(170./256.,170./256.,0.);
|
||||
return vec3(85./256.,85./256.,0.);
|
||||
}
|
||||
|
||||
vec3 threesome(in vec2 p) {
|
||||
p /= 3.;
|
||||
float z = 1.;
|
||||
z *= sin(length(p + vec2(5,0))) * cos(8.*atanp(p + vec2(5,0)));
|
||||
z *= sin(length(p - vec2(5,5))) * cos(8.*atanp(p - vec2(5,5)));
|
||||
z *= sin(length(p + vec2(0,5))) * cos(8.*atanp(p + vec2(0,5)));
|
||||
if(-0.1 < z && z < 0. || 0.2 < z) return vec3(0);
|
||||
return vec3(1);
|
||||
}
|
||||
|
||||
vec3 plaid_meltdown(in vec2 p) {
|
||||
p /= 15.;
|
||||
p += 7.;
|
||||
float a = 2.*sin(p.x*sin(p.y) + p.y*sin(p.x));
|
||||
float b = cube_root(sin(2.5*sqrt(2.) * (p.x - p.y)));
|
||||
float c = cube_root(sin(2.5*sqrt(2.) * (p.x + p.y)));
|
||||
float d = sin(80.*p.x) + sin(80.*p.y);
|
||||
if(0.25 * (a + b + c) > 0.5 * d) return vec3(0);
|
||||
return vec3(1);
|
||||
}
|
||||
|
||||
vec3 sunlight_revealed(in vec2 p) {
|
||||
p /= 6.;
|
||||
p.x += 2.;
|
||||
float a = length(vec2(3.-p.x,p.y)) + abs(p.y) + abs(1.-p.x);
|
||||
float f = atan(p.y,p.x-1.);
|
||||
float c = atan(p.y,p.x-3.);
|
||||
float R = sq(p.x-1.) + sq(p.y);
|
||||
vec3 col = vec3(0);
|
||||
bool mix = false;
|
||||
if(5. < a && a < 7. && mod(f,PI/7.) < PI/14.) {
|
||||
col += vec3(0.,82./256.,173./256.);
|
||||
if(mix) col /= 2.;
|
||||
mix = true;
|
||||
}
|
||||
if(5. < a && a < 7. && mod(c,PI/9.) < PI/18.) {
|
||||
col += vec3(1,0,0);
|
||||
if(mix) col /= 2.;
|
||||
mix = true;
|
||||
}
|
||||
if(5. < a && a < 7. && mod(f,PI/8.) < PI/16.) {
|
||||
col += vec3(1,1,0);
|
||||
if(mix) col /= 2.;
|
||||
mix = true;
|
||||
}
|
||||
if((45.-3.*p.x)*PI/180. < f && f < (47.-p.x)*PI/180. && p.y > 0.1*p.x
|
||||
&& mod(log(R)/log(f),2.) < 1.) {
|
||||
col += vec3(1);
|
||||
if(mix) col /= 2.;
|
||||
}
|
||||
return col;
|
||||
}
|
||||
|
||||
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
||||
float t = mod(iTime/10,10.);
|
||||
vec3 color = vec3(0);
|
||||
for(float i = 0.; i < AA*AA - 0.5; i += 1.) {
|
||||
vec2 uv = (fragCoord.xy + vec2(floor(i/AA), mod(i,AA))/AA) / iResolution.xy;
|
||||
vec2 crtUV = CRTCurveUV( uv );
|
||||
if ( crtUV.x < 0.0 || crtUV.x > 1.0 || crtUV.y < 0.0 || crtUV.y > 1.0 ) continue;
|
||||
vec2 p = 50.0 * crtUV - 25.0;
|
||||
p *= 0.75 + 0.05*mod(iTime,10.);
|
||||
p += mod(iTime,10.) - 5.;
|
||||
p.x *= iResolution.x / iResolution.y;
|
||||
if(t < 2. || 8. < t) {
|
||||
float fade = smoothstep(0.,2.,t) - smoothstep(8.,10.,t);
|
||||
float scale = iResolution.y/50.*float(AA)*fade + 1.;
|
||||
p = floor(p.xy*scale)/scale;
|
||||
}
|
||||
|
||||
vec3 c;
|
||||
if (mod(0.1*iTime,5.) < 1.) c = margarita(p);
|
||||
else if(mod(0.1*iTime,5.) < 2.) c = plaid_meltdown(p);
|
||||
else if(mod(0.1*iTime,5.) < 3.) c = sunlight_revealed(p);
|
||||
else if(mod(0.1*iTime,5.) < 4.) c = threesome(p);
|
||||
else if(mod(0.1*iTime,5.) < 5.) c = digital_bacteria(p);
|
||||
|
||||
DrawVignette( c, crtUV );
|
||||
DrawScanline( c, uv );
|
||||
color += c / float(AA*AA);
|
||||
}
|
||||
|
||||
fragColor.xyz = color;
|
||||
fragColor.w = 1.0;
|
||||
}
|
||||
|
|
@ -33,9 +33,11 @@ vec3 line(float n) {
|
|||
vec3 sceneTerminal(float i, float t) {
|
||||
if (i < LAST - 1.0) {
|
||||
float s = t * 0.45;
|
||||
float scroll = floor(s) + smoothstep(0.5, 1.0, fract(s));
|
||||
float n = i + scroll;
|
||||
return line(n) + 0.10 * (line(n - 1.0) + line(n + 1.0));
|
||||
float slide = smoothstep(0.5, 1.0, fract(s)); // 0..1 between two lines
|
||||
float n = i + floor(s); // always an integer
|
||||
vec3 a = line(n) + 0.10 * (line(n - 1.0) + line(n + 1.0));
|
||||
vec3 b = line(n + 1.0) + 0.10 * (line(n) + line(n + 2.0));
|
||||
return mix(a, b, slide);
|
||||
}
|
||||
if (i < LAST) return DIM * 0.9; // visitor@khaos-im-kiez:~$
|
||||
return fract(t / 1.1) < 0.5 ? FG : BG; // blinking cursor, as on the site
|
||||
|
|
@ -47,9 +49,8 @@ vec3 sceneProgress(float i, float t) {
|
|||
float fill = min(ph / 0.78, 1.0) * (LAST + 1.0);
|
||||
float d = fill - (i + 0.5);
|
||||
vec3 col = BG + DIM * 0.06; // empty track
|
||||
if (d > 0.0) {
|
||||
col = mix(FG, DIM * 0.7, smoothstep(0.0, 2.0, d));
|
||||
}
|
||||
float on = smoothstep(-0.25, 0.35, d);
|
||||
col = mix(col, mix(FG, DIM * 0.7, smoothstep(0.0, 2.0, d)), on);
|
||||
if (ph > 0.78) {
|
||||
float p = (ph - 0.78) / 0.22;
|
||||
col = mix(col, FG, 0.5 + 0.5 * sin(p * 12.566 - 1.57)) * (1.0 - 0.6 * p);
|
||||
|
|
@ -60,12 +61,14 @@ vec3 sceneProgress(float i, float t) {
|
|||
// 2: radar, a blip sweeps back and forth leaving a phosphor trail,
|
||||
// now and then a red contact appears and fades
|
||||
vec3 sceneRadar(float i, float t) {
|
||||
float pos = 6.0 + 6.0 * sin(t * 0.7);
|
||||
float dir = cos(t * 0.7);
|
||||
float d = i - pos;
|
||||
float behind = -sign(dir) * d;
|
||||
float trail = behind > 0.0 ? exp(-behind * 0.45) : 0.0;
|
||||
float head = exp(-d * d * 1.2);
|
||||
float d0 = i - (6.0 + 6.0 * sin(t * 0.7));
|
||||
float head = exp(-d0 * d0 * 1.2);
|
||||
float trail = 0.0;
|
||||
for (int j = 1; j <= 10; j++) {
|
||||
float fj = float(j);
|
||||
float d = i - (6.0 + 6.0 * sin((t - fj * 0.15) * 0.7));
|
||||
trail = max(trail, exp(-fj * 0.3) * exp(-d * d * 1.2));
|
||||
}
|
||||
vec3 col = BG + DIM * 0.05 + DIM * 0.55 * trail + FG * head;
|
||||
|
||||
float k = floor(t / 7.0);
|
||||
|
|
@ -81,11 +84,10 @@ vec3 sceneRain(float i, float t) {
|
|||
for (int k = 0; k < 3; k++) {
|
||||
float fk = float(k);
|
||||
float speed = 0.9 + 0.5 * fk;
|
||||
float pos = mod(t * speed + fk * 5.3, 20.0);
|
||||
float behind = pos - i;
|
||||
if (behind >= 0.0 && behind < 8.0) {
|
||||
col += mix(DIM * 0.6, FG, step(behind, 0.7)) * exp(-behind * 0.6);
|
||||
}
|
||||
float b = mod(t * speed + fk * 5.3, 20.0) - 3.0 - i; // steps behind the drop, enters from off the stairs
|
||||
float trail = exp(-max(b, 0.0) * 0.6) * smoothstep(-0.9, 0.0, b);
|
||||
float head = max(0.0, 1.0 - abs(b));
|
||||
col += DIM * 0.6 * trail + FG * head;
|
||||
}
|
||||
return col;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue