/* Mouse X Left 左 : 低速 Slow Mouse X Right 右 : 最高速度 Maximum Speed */ precision highp float; uniform vec2 resolution; uniform vec2 mouse; uniform float time; uniform sampler2D backbuffer; out vec4 outColor;float crossDist( in vec3 p ) { vec3 absp = abs(p); float d =0.; for(float i=0.,m;i++<3.;){ d+=step(m=max(absp.y,absp.z),absp.x)*m; absp.xyz=absp.yzx; } float cr = 1.0-d; float cu = max(max(absp.x,absp.z), absp.y) - 3.0; return max(cr, cu); } // menger sponge fractal float fractal( in vec3 p ) { vec3 pp = p; float scale = 1.0; float dist = 0.0; for (int i = 0 ; i < 4 ; i++) { dist = max(dist, crossDist(p)*scale); p = fract((p-1.0)*0.5) * 6.0 - 3.0; scale /= 3.; //p.yz*=rot(.785); } return dist; } mat2 rot(float a){float c=cos(a),s=sin(a);return mat2(c,-s,s,c);} vec3 pal(float t){return .5+.5*cos(6.28*(1.*t+vec3(.0,.3,.7)));} void main(){ vec2 r=resolution,uv=(gl_FragCoord.xy*2.-r)/min(r.x,r.y); bool speedup = mouse.x*mouse.x >.5 ; vec3 col = vec3(0.); float rnd = fract(758.7*sin(dot(uv,vec2(486.426,751.953)))); vec3 p,d=normalize(vec3(uv,.8-.05*sqrt(max(.1,length(uv)-.3))*rnd)); float t = time*.2; t*=2.; t=floor(t)+pow(fract(t),.05); t+=time*.2; t=speedup?time:t; for(float i,e,g;i++<50.;){ p = d*g; vec3 op = p; if(mod(t,(speedup ? 12.:6.))<2.){p.x +=20.+10.*((t*.5));p.yz*=rot(t);} else if(mod(t,(speedup ? 12.:6.))<4.){ p.y +=20.+10.*((t*.5)); p.xz *=rot(t);} else { p.xy *=rot(t+p.z*.1+rnd*.025*sqrt(length(uv))); p.z +=20.+10.*((t*.5)); p.x += sin(t);} p.zxy = asin(sin(p.zxy/1.8))*1.8; float h= max(abs(p.z)-3.,fractal(p)); g+=e=max(.0001,abs(h)); float tt=tanh(sin(length(p)+rnd*.01)*5.); col +=mix(pal(.9+rnd*.1+tt+t*2.+length(p))*(.05),vec3(.0015)*fract(105.*dot(floor(p*5.)/10.,vec3(225.35,355.35,953.35))),clamp(tt,0.,1.))/exp((1.-fract(-op.z*.1+t*2.))*e*i*i); } outColor=vec4(sqrt(col),1); }