precision mediump float; uniform float time; uniform vec2 mouse; uniform vec2 resolution; uniform sampler2D b; float rand(vec3 p){return fract(sin(dot(vec3(15.41231,39.6134,42.6543),p))*42157.76543);} const vec2 O=vec2(0,1); float noise(vec3 p){vec3 b=floor(p),f=fract(p); return mix( mix(mix(rand(b+O.xxx),rand(b+O.yxx),f.x),mix(rand(b+O.xyx),rand(b+O.yyx),f.x),f.y), mix(mix(rand(b+O.xxy),rand(b+O.yxy),f.x),mix(rand(b+O.xyy),rand(b+O.yyy),f.x),f.y), f.z);} vec3 MP; float WATER,SKY,WALL,LPDIST; mat2 r2d(float a){float sa=sin(a),ca=cos(a);return mat2(ca,sa,-sa,ca);} float gn(vec3 p){float n=0.,fi;for(int i=1;i<4;i++)fi=float(i*i),n+=noise(p*fi)/fi;return n;} float bmin(float a,float b,float k){return min(min(a,b),max(a,b)-k);} float wn(vec3 p,float f) { float opn=noise(p+noise(-p+1e3+time)); return (noise(p*.2+opn)*5.+noise(p*5.+noise(p*10.+time))*noise(p+opn)*.5+sin(p.x*.4+time+cos(time*3.-p.z*.35))*3.5*f)*.2; } float map(vec3 p){ SKY=-length(p)+100.; vec3 q=p;q.x+=q.z*q.z*.015-q.y*.15; WALL=max(-length(max(q.xy*vec2(1,-1)-vec2(1,-.55-q.x*.1),0.))+.5,p.y-3.)*.9; WALL+=max(abs(mod(q.z,1.)-.5),.49)*.2; if(WALL<.01)q.xz*=r2d(.8),WALL+=max(gn(q*20.)-.9,0.)*.00,WALL+=gn(q*5.)*.001; q.z=mod(q.z-2.,14.)-7.; vec3 x=abs(q+vec3(-2.,0,0.))-vec3(1.+max(-q.y+2.,0.)*.2,4.5,.25); WALL=max(min(bmin(WALL,max(max(x.x,x.y),x.z),.3),max(max(x.x,x.z)-.2,q.y-1.)),-max(abs(p.z+4.6)-.04,max(abs(mod(q.y,.05)-.025)-.01,-q.y+1.)))+max(.05-abs(p.y-2.9)*.3,0.); vec3 o=q; q.z=abs(q.z)-.25; LPDIST=min(length(q-vec3(1,4.5,0)),length(o-vec3(2.6,6,.4)))-.03; q=o; q.y=abs(q.y-2.5)-.3; WALL=bmin(bmin(max(WALL,-length(q.yz)+.2),max(length(q.xz-vec2(2.5,.5))-.02,q.y-3.),.2),max(abs(length(q.yz)-.2)-.01,-q.x+.8),.01); WATER=p.y; if(WATER<.05)WATER+=wn(p*10.,smoothstep(0.,-1.,p.x))*.03; return min(min(WATER,SKY),min(WALL,LPDIST)); } const vec2 N=vec2(.001,0); struct { vec3 albedo,speccol; float rough,fres,ambi; } mat; vec3 sky(vec3 n){return mix(vec3(.05,.02,.01),vec3(.7,.8,.9),sqrt(max(-n.y,0.)));} void main( void ) { vec2 uv=( gl_FragCoord.xy / resolution.xy ),p=uv*2.-1.; p.x*=resolution.x/resolution.y; if(abs(p.y)>.7){gl_FragColor=vec4(0);return;} float t=mod(time*.1,2.); vec3 ro=vec3(-.5,.5+sin(time)*.05,cos(time*.37+4.)*.1),rd=normalize(vec3(p,-1.1)); if(t<1.||true) ro.z-=t*2.,ro.x-=t, rd.yz*=r2d(-.2), rd.xz*=r2d(-.4); else ro=vec3(-2,6,0.), rd=rd.xzy, rd.yz*=r2d(.85), rd.xz*=r2d(t) ; float md;MP=ro; for(int i=0;i<200;i++)if(MP+=rd*(md=map(MP)*.9),md<.0001)break; vec3 n=normalize(map(MP)-vec3(map(MP-N.xyy),map(MP-N.yxy),map(MP-N.yyx))), l=normalize(vec3(-1.5,.8,-.3)),v=normalize(ro-MP); if(WATER<.001) { mat.albedo=vec3(noise(MP*100.)*.1+noise(MP*300.)*.2)*.2+pow(smoothstep(2.,0.,WALL),50.)*gn(MP*20.+noise(MP*30.)*3.)*.4; mat.speccol=vec3(.5,.5,.55); mat.rough=700.; mat.fres=.6; mat.ambi=1.; }else if(WALL<.001) { mat.albedo=max(pow(1. -max(.1-abs(mod(MP.y,.5)-.25)-gn(MP*100.)*.05,0.)*5. -max(.1-abs(mod(MP.z,.9)-.45)-gn(MP*100.)*.05,0.)*5. ,.3),float(abs(mod(MP.z-2.,14.)-7.)<.5))*(.5+.5*gn(MP+gn(MP*10.)*.3)-max(gn(MP*vec3(30,0,30)+gn(MP*5.)*10.)-.8,0.)*.3)*mix(vec3(.7,.65,.6),mix(vec3(.8),vec3(.8,.75,.73),smoothstep(.6,.7-noise(MP*50.)*.1,gn(MP*2.+noise(MP*40.)*.1))),smoothstep(.5,.6,gn(MP*.5+noise(MP*vec3(40))*.1)))*.1; mat.albedo*=.3+max(smoothstep(.0,.5-gn(MP*100.)*.4,MP.y),n.y); //pow(gn(MP*15.+noise(MP*30.)*5.),2.)+4.5*mix(vec3(.27,.31,.28),vec3(.38,.39,.4),0.)*(1.-max(gn(MP*.3+noise(MP*10.)*.6)-.3,0.)*.5+gn(MP*vec3(.5,2,.5))*.3)+noise(MP*100.)*.03+pow(gn(vec3(length(MP.xz),MP.y,atan(MP.x+5.,MP.z)*5.)*10.),5.)*max(gn(MP)-.5,0.)*5.+max(gn(MP*20.)-noise(MP*5.)*2.,0.)*vec3(.7,.5,.2)-max(gn(MP*vec3(5,.1,5)+noise(MP*3.)*.5)-.5,0.)*noise(MP*.2)*2.; //max(vec3(noise(MP*2.+noise(MP*20.)*.5)*.5+noise(MP*30.)*.1)*.05-.5*vec3(.3+gn(MP*500.)*.3,.6,1)*(max(gn(MP*vec3(2,.1,2)+gn(MP*20.)*.1)-.9+MP.y*.1,0.)*smoothstep(0.,5.,MP.y)),0.); mat.albedo-=.5*vec3(.3+gn(MP*500.)*.3,.6,1)*(max(gn(MP*vec3(5,.1,5)+gn(MP*20.)*.1)-.9+MP.y*.1,0.)*smoothstep(0.,5.,MP.y))+max(gn(MP*10.)-1.05,0.)*.1; mat.speccol=vec3(.06+mat.albedo.r*mat.albedo.r*5.); mat.rough=3.*pow(smoothstep(0.,.1,WATER),.5+2.*max(gn(MP*vec3(1,1,30.)+noise(MP*100.)*.5)-.7,0.)); mat.fres=3.;//+gn(MP)*10.*min(MP.y,1.); mat.ambi=0.; }else if(LPDIST<.001){ mat.speccol=mat.albedo=vec3(1,.3,0)*abs(sin(time))*3.; mat.rough=mat.fres=mat.ambi=1.; } vec3 nrefcol=sky(-n),vnrefcol=sky(reflect(v,n)); if(SKY<.001) gl_FragColor = vec4( sky(n)*pow(vec3(.8+uv.y*uv.y*uv.y),vec3(3.)), 1.0 ); else gl_FragColor = max(vec4( mat.albedo*(map(MP+n*.1)*mat.ambi+ (max(dot(n,l),0.)+pow(gn(reflect(rd,n)),3.)*gn(MP*vec3(1,.5,1))*(1.-mat.ambi)))+ (1.-mat.ambi)*pow(gn(reflect(rd,n)*5.),5.)*.1*smoothstep(0.1,.12,max(gn(MP*vec3(1,2,20))-.8,0.))*n.y+ (pow(max(dot(n,normalize(l+v)),0.),mat.rough)*2.+mat.fres*pow(1.-abs(dot(n,rd)),4.))*mat.speccol ,//+mat.speccol*max(gn(MP*vec2(50,.0).xyx)-.7,0.), //+abs(n.x)*.03*max(pow(abs(gn(MP*vec3(10.,.1,10.)+ro+vec3(0,time*.3,0))-.5)*2.,10.)*noise(MP*80.+time)*dot(n,v),0.), 1.0 ),0.); vec3 lcol=vec3(1,.4,0);float lmod=abs(sin(time)); gl_FragColor.rgb+=max(1.-LPDIST*2.,0.)*lmod*lcol*max(dot(n,l),0.); gl_FragColor=mix(gl_FragColor,mix(vec4(1,.75,.5,1),vec4(.65,.75,.78,1),.4+uv.x*.7)*(.9-gn(rd*3.+time*.2)*.2),min(max(length(ro-MP)*.08-.4,0.),.9));//+vec4(n,1); //gl_FragColor+=max(1.-pow(abs(p.x-p.y*.5),.5),0.)*.2; gl_FragColor*=vec4(.7,.766,.84,1); gl_FragColor=pow(max(gl_FragColor,.14),vec4(1.4))*1.5*max(1.-length(p.xy)*.3,0.) +gl_FragColor*7.*pow(gn(((p.xyy*vec3(100.,1.,0.)+vec3(p.y*10.,p.x*100.-mod(time*2.,10.)*50.,0)).xy*r2d(-.6)).xyy)-.2,10.)*.2; //gl_FragColor.rgb=mix(gl_FragColor.rgb*vec3(1.1,.7,.5)*1.5,gl_FragColor.rgb,uv.x); vec3 fp=vec3(1.2,4.3,-4.5); float d=dot(fp,rd),rad=.5; vec3 frp=ro+rd*d; if(d>.0 && length((frp)-fp)