#extension GL_OES_standard_derivatives : enable precision highp float; uniform float time; uniform vec2 mouse; uniform vec2 resolution; #define iTime mod(time,360.) //東京 mat2 rot(float a){float c=cos(a),s=sin(a);return mat2(c,-s,s,c);} float box(vec2 p,vec2 b){ vec2 q = abs(p)-b; return length(max(vec2(0.),q))+min(0.,max(q.x,q.y)); } float box3(vec3 p,vec3 b){ vec3 q =abs(p)-b; return length(max(vec3(0.),q))+min(0.,max(q.x,max(q.y,q.z))); } float tokyo(vec3 p){ p*=2.; vec3 op = p; p.x -=6.; float d = box3(p-vec3(0.,4.,0.),vec3(5.,1.,1.)); float q = min(d,box3(p-vec3(0.,0.,0.),vec3(4.,3.,1.))); q = max(q,-min(d,box3(p-vec3(0.,0.,0.),vec3(3.,2.,2.)))); d = min(d,q); d =min(d,box3(p,vec3(4.,1.,1.))); d = min(d,box3(p,vec3(1.,7.,1.))); p.y-=-5.; p.x = abs(p.x)-2.; p.xy*=rot(-.885); d = min(d,box3(p,vec3(1.,2.5,1.))); p =op; p.x+=6.; float d2 = box3(p-vec3(0.,4.,0.),vec3(5.,1.,1.)); float q2 = min(d2,box3(p-vec3(0.,0.,0.),vec3(4.,3.,1.))); q2 = max(q2,-min(d2,box3(p-vec3(0.,0.,0.),vec3(3.,2.,2.)))); d2 = min(d2,q2); d2 = min(d2,box3(p-vec3(0.,5.,0.),vec3(1.,2.,1.))); d2 = min(d2,box3(p-vec3(0.,-5.,0.),vec3(1.,2.,1.))); d2 = min(d2,box3(p-vec3(1,-6.5,0.),vec3(2.,.5,1.))); p.y-=-4.; p.x = abs(p.x)-2.; p.xy*=rot(-.885); d2 = min(d2,box3(p,vec3(.5,2.5,1.))); d= min(d2,d); return d/2.; } float diam(vec3 p,float s){ p = abs(p); return (p.x+p.y+p.z-s)*inversesqrt(3.); } vec3 op; float di(vec3 p){ float q = 0.; vec4 pp = vec4(p,1.1); const float cc = 2.; for(float i=1.; i<=cc ;i++){ q += (asin(sin(pp.x))+acos(cos(pp.z)))/pp.a; pp*=1.1; pp.xyz +=vec3(1.1,2.,3.); pp.xyz = abs(pp.xyz); pp.xz *=rot(-.785*i+i); } return q/(cc+pp.a); } vec2 sdf(vec3 p){ vec3 tp = p; op = p; vec2 h; p.xy *=rot(p.z*.1); p.y= -abs(p.y)+(3.+asin(sin(iTime+p.z*.1))*.5); h.x = length(p+1.)-.1; p.y +=2.+di(p); h.x = min(h.x, box(p.xy,vec2(6.1,.5) ) ); h.x *=.65; h.y = 1.; vec2 t; tp.xz*=rot(pow(fract(iTime*.3),.125)*3.14); tp.xy*=rot(pow(fract(iTime*.3+.5),.125)*3.14); t.x = mix(diam(tp,2.5),box3(tp,vec3(1.1)),asin(sin(floor(iTime)+pow(fract(iTime),.5)))*.3+.2); t.x =mix(t.x , tokyo(-tp),clamp(sin(time),-.5,.5)+.5); tp = op; vec4 ttp = vec4(tp,1.); ttp.yz*=rot(iTime*.01); for(float i=0.;i<=6.;i++){ ttp*=1.3; ttp.xyz = abs(ttp.xzy)-11.; ttp.xz*=rot(-.785+i); ttp.xy*=rot(i); t.x = min(t.x,box3(ttp.xyz,vec3(.5))/ttp.a); } t.y = 2.; h = t.x < h.x ? t:h; return h; } #define q(s) s*sdf(p+s).x #define ao(rp,n,k) clamp(sdf(rp+n*k).x/k,.0,1.) #define gao(rp,n) (ao(rp,n,.1)+ao(rp,n,.5)+ao(rp,n,.7)) vec3 norm(vec3 p,float e){vec2 nv=vec2(-e,e);return normalize(q(nv.xyy)+q(nv.yxy)+q(nv.yyx)+q(nv.xxx));} vec3 pal(float t){return .5+vec3(.5,.2,.1)*cos(6.28*(vec3(1.,.5,.6)*t+vec3(.0,.1,.2)));} void main( void ) { vec2 position = ( gl_FragCoord.xy / resolution.xy ) + mouse / 4.0; vec2 uv = (2.*gl_FragCoord.xy-resolution.xy)/resolution.y; vec3 ro = vec3(12.,0.+mouse.y,-6.+mouse.x); vec3 rt = vec3(0.); vec3 z = normalize(rt-ro); vec3 x = (cross(z,vec3(0.,-1.,.0))); vec3 y = (cross(z,x)); vec3 rp = ro; vec3 rd = normalize(mat3(x,y,z)*vec3(uv,.9)); vec3 light = mat3(x,y,z)*vec3(-2.,-1.,-4.); vec3 col = vec3(.1); for(float i=0.;i<=128.;i++){ vec2 d = sdf(rp); if(length(rp) > 50.) break; if(d.x <.001){ vec3 n = norm(rp,.019); vec3 nn = norm(rp,.02+abs(sin(iTime+rp.z*.2))*.01); float dif = dot(normalize(light-rp),n); float spc = max(0.,dot(normalize(rp-ro),reflect(normalize(-light),n))); spc = pow(spc,32.); float fr = pow(1.-dot(-rd,n),4.); col = vec3(.1)+vec3(.15,.5,.7)*dif+spc*.75; float l = length(n-nn); float s = step(.01,l); col = max(vec3(0.),mix(col-s,col*s, floor(rp.z*.1-.3+di(rp.zzz*.1)*.2)*(gao(rp,n)/3.)*.75+.5)); col = pow(col,vec3(.8)); if(d.y ==1.) {col *=smoothstep(10.5,.0,op.z);col += -fr+s*pal(op.z*.1+iTime)*smoothstep(-.1,.1,op.z);} break; } rp +=rd*d.x; } gl_FragColor = vec4(col,1.0 ); }