Files
2026-06-08 21:00:34 +02:00

227 lines
6.5 KiB
GLSL

/*
* Original shader from: https://www.shadertoy.com/view/wss3zB
*/
#ifdef GL_ES
precision highp float;
#endif
// glslsandbox uniforms
uniform float time;
uniform vec2 resolution;
// shadertoy globals
float iTime = 0.0;
vec3 iResolution = vec3(0.0);
// --------[ Original ShaderToy begins here ]---------- //
// Spiral Offset II - Del 06/01/2018
// watch fullscreen, params have been tweaked to overlap and never loop... :)
// keep watching... :)
#define TAU 6.283185
vec2 rot(vec2 v, float angle)
{
float c = cos(angle);
float s = sin(angle);
return mat2(c, -s, s, c)*v;
}
// IQ UnevenCapsule distance func
float cro(in vec2 a, in vec2 b ) { return a.x*b.y - a.y*b.x; }
float sdUnevenCapsule( in vec2 p, in vec2 pa, in vec2 pb, in float ra, in float rb )
{
p -= pa;
pb -= pa;
float h = dot(pb,pb);
vec2 q = vec2( dot(p,vec2(pb.y,-pb.x)), dot(p,pb) )/h;
//-----------
q.x = abs(q.x);
float b = ra-rb;
vec2 c = vec2(sqrt(h-b*b),b);
float k = cro(c,q);
float m = dot(c,q);
float n = dot(q,q);
if( k < 0.0 ) return sqrt(h*(n )) - ra;
else if( k > c.x ) return sqrt(h*(n+1.0-2.0*q.y)) - rb;
return m - ra;
}
float TimerInOut(vec4 v)
{
return smoothstep(v.y,v.y+v.w,v.x) - smoothstep(v.z-v.w,v.z,v.x);
}
float Stime(float scale)
{
return fract(iTime*scale)*TAU;
}
float Mtime(float mval)
{
return mod(iTime,mval);
}
// Trippy spiral calc - Del 06/01/2018
vec2 spiral(vec2 uv,float zoom, float len, float offset,vec2 capoff, float trip, float scount)
{
float d = length(uv) * zoom;
d=log(d*trip);
uv = rot(uv,sin(d*offset)+d*scount);
float v = 1.0-sdUnevenCapsule(uv,vec2(0.0,0.0)+capoff,vec2(0.4*len,0.0)+capoff,0.0,0.4*len)*14.0;
return vec2(v,d); // dx , dy
}
vec2 directionalWaveNormal(vec2 p, float amp, vec2 dir, float freq, float speed, float time, float k)
{
float a = dot(p, dir) * freq + time * speed;
float b = 0.5 * k * freq * amp * pow((sin(a) + 1.0) * 0.5, k) * cos(a);
return vec2(dir.x * b, dir.y * b);
}
vec3 summedWaveNormal(vec2 p)
{
float time = iTime;
vec2 sum = vec2(0.0);
sum += directionalWaveNormal(p, 0.5, normalize(vec2(1, 1)), 5.0, 1.5, time, 1.0);
sum += directionalWaveNormal(p, 0.25,normalize(vec2(1.4, 1.0)), 11.0, 2.4, time, 1.5);
sum += directionalWaveNormal(p, 0.125, normalize(vec2(-0.8, -1.0)), 10.0, 2.0, time, 2.0);
sum += directionalWaveNormal(p, 0.0625, normalize(vec2(1.3, 1.0)), 15.0, 4.0, time, 2.2);
sum += directionalWaveNormal(p, 0.03125, normalize(vec2(-1.7, -1.0)), 5.0, 1.8, time, 3.0);
return normalize(vec3(-sum.x, -sum.y, 1.0));
}
vec3 background(vec2 p)
{
vec3 normal = summedWaveNormal(p);
vec3 c = mix(vec3(0.1, 0.15, 0.1), vec3(0.2, 0.25, 0.4), dot(normal, normalize(vec3(0.2, 0.2, 0.5))) * 0.5 + 0.5);
c = mix(c, vec3(0.7, 0.9, 1.0), pow(dot(normal, normalize(vec3(-0.4, 0.1, 1.0))) * 0.5 + 0.5, 2.0));
c = mix(c, vec3(0.95, 0.98, 1.0), pow(dot(normal, normalize(vec3(-0.1, -0.3, 0.5))) * 0.5 + 0.5, 10.0));
return clamp(c,0.0,1.0);
}
float Bub(vec2 uv,float scale)
{
float time = iTime*0.75;
uv.y-=time*2./scale;
//uv.x += time*0.2;
uv.x+=sin(uv.y+time*.95)*0.025; ///scale;
uv*=scale;
vec2 s=floor(uv);
vec2 f=fract(uv);
float k=3.0;
vec2 p =.5+.35*sin(11.*fract(sin((s+scale)*mat2(7.0,3.0,6.0,5.0))*5.))-f;
float d=length(p);
k=min(d,k);
k=smoothstep(0.0,k,sin(f.x+f.y)*0.01);
return k;
}
vec3 Bubbles(vec2 uv,float head,float d)
{
float c = Bub(uv,30.)*.3;
c+=Bub(uv,20.)*.5;
c+=Bub(uv,15.)*.8;
c+=Bub(uv,10.);
c+=Bub(uv,8.);
c+=Bub(uv,6.);
c+=Bub(uv,5.);
vec3 scol = vec3(clamp(c*0.3,0.0,0.3));
return scol;
}
vec3 checks(vec2 p)
{
//p*=1.0+(sin(p.y+p.x+Stime(0.25))*0.15);
//float f = mod( floor(5.5*p.x) + floor(5.5*p.y), 2.0);
//vec3 col = 0.05 + 0.1*f+0.2*vec3(0.1,0.1,0.1);
//return col;
float d = length(p);
float head = 1.0-length(p);
d+=(0.5+sin(iTime*2.0)*0.5)*0.25;
p *= 0.25;
return Bubbles(p*(d+0.5), head,d);
}
vec3 hsv2rgb_smooth( in vec3 c )
{
vec3 rgb = clamp( abs(mod(c.x*6.0+vec3(0.0,4.0,2.0),6.0)-3.0)-1.0, 0.0, 1.0 );
rgb = rgb*rgb*(3.0-2.0*rgb); // cubic smoothing
return c.z * mix( vec3(1.0), rgb, c.y);
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = (fragCoord.xy - 0.5 * iResolution.xy) / iResolution.y;
// Create some blends over time...
float t1 = TimerInOut(vec4(Mtime(9.6),1.0, 7.2, 1.8));
float t2 = TimerInOut(vec4(Mtime(12.0),1.0, 9.0, 1.5));
float t3 = TimerInOut(vec4(Mtime(21.0),6.0, 14.2, 2.8));
float t4 = TimerInOut(vec4(Mtime(60.0),15.0,45.0,1.0));
float t5 = TimerInOut(vec4(Mtime(85.0),57.0, 67.0, 3.1));
float t6 = TimerInOut(vec4(Mtime(123.0),77.0,101.0,10.0));
float t7 = TimerInOut(vec4(Mtime(50.0),28.0,45.0,3.5));
float t8 = TimerInOut(vec4(Mtime(20.0),1.0,13.0,3.1));
float t9 = TimerInOut(vec4(Mtime(200.0),100.0,199.0,0.5));
float t10 = TimerInOut(vec4(Mtime(45.0),21.0,31.0,0.75));
// various spiral modifiers applied over time
float t = Stime(0.4);
float offset = 25.0 * t1;
float zoom = 1.0 + (sin(Stime(0.17))*0.5) * t2;
vec2 capoff = vec2(sin(uv.y*4.0+Stime(0.125))*0.25, sin(uv.x*2.0+Stime(0.25))*0.75) * t3;
float m = 0.48+sin(Stime(0.15)+uv.y+uv.x)*0.5;
float trip = 1.0-(m*t4);
float scmod = sin(Stime(0.176));
float scount = 5.0+((3.0+(scmod*5.0))*t5);
// debug... (disable effects)
//scount = 5.0;
//offset=0.0;
//zoom = 1.0;
//trip = 1.0;
//capoff = vec2(0.0);
vec2 dist = spiral(uv, zoom, t, offset, capoff, trip, scount);
float distmod = 0.49+sin(dist.x*0.34+dist.y*1.6+sin(Stime(.1)))*0.5;
dist.x = mix(dist.x, dist.x*distmod, t10);
float v2 = smoothstep(0.5-0.1,0.5+0.1,dist.x);
float v = mix(v2,clamp(dist.x,0.0,3.0), t6);
//vec3 col = vec3(v*1.0-l/t);
vec3 col1 = checks(uv); ////vec3(0.0,0.0,0.2);
vec3 col2 = vec3(1.0,0.6,0.5);
// rainbow flavour...
col2 = mix(col2,hsv2rgb_smooth(vec3(fract(iTime*0.1)+dist.x*0.1,1.0,v)),t9);
vec3 col3 = background(uv); //vec3(0.5,0.7,0.5);
col1 = mix(col1,col3*0.3, t7);
col2 = mix(col2,col3, t8);
vec3 col = mix(col1,col2,v*1.0-dist.y/t);
// vignette
vec2 q = fragCoord/iResolution.xy;
col *= 0.3 + 0.7*pow(16.0*q.x*q.y*(1.0-q.x)*(1.0-q.y),0.25);
fragColor = vec4(col, 1.0);
}
// --------[ Original ShaderToy ends here ]---------- //
void main(void)
{
iTime = time;
iResolution = vec3(resolution, 0.0);
mainImage(gl_FragColor, gl_FragCoord.xy);
}