precision highp float; uniform vec2 resolution; uniform vec2 mouse; uniform float time; uniform sampler2D b; vec2 rand(float i){return fract(vec2(sin(i*42.5123)*32623.5123,sin(i*37.5123)*42663.5123));} 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); } 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*.3;} mat2 r2d(float a){float sa=sin(a),ca=cos(a);return mat2(ca,sa,-sa,ca);} vec3 getColor(vec3 d) {return mix( /* vec3(.5,.0,.7)*.5, vec3(1,.6,.1)+sin(d.x+d.y)*.5, */ vec3(.5,.0,.7)*.5, vec3(1,.6,.1)+sin(d.x+d.y)*.5, d.y*.5+.5 );} vec3 getFilm(vec3 d) {return abs(vec3(sin(d.z+d.z*5.),cos(d.z+d.z*5.),sin(d.z+d.z)*cos(d.z)));} const vec2 N=vec2(.01,0);float gs=1.;float smin(float a,float b,float k){return -log(exp(-k*a)+exp(-k*b))/k;} float B,PEARL; float sb(vec3 p){return max(max(abs(p.x),abs(p.y)),abs(p.z));} float so(vec3 p){return dot(p,normalize(sign(p+1e-6)));} float map(vec3 p){ float time=time*.3; B=-length(p)+7.; float b = 10.;vec3 q=p; p.z-=time; vec3 o=p; float dist=(sin(o.x*5.)+cos(o.y*5.)+sin(o.z*5.)); vec2 seed = rand(floor(p.z/2.)); p.xy*=r2d(seed.x*3.14);p.x-=1.+sin(time+floor(p.z/2.)); p.z=mod(p.z,2.)-1.; b=min(length(p)-seed.y*.7+.02*dist,.4); p=o; seed = rand(floor(p.z/.8+51.)); p.xy*=r2d(seed.x*3.14);p.x-=1.+sin(time+floor(p.z/.8)); p.z=mod(o.z,.8)-.4; b=smin(b,min(length(p)-seed.x*.1,.7),10.); p=o; seed = rand(floor(p.z/1.5+21.)); p.xy*=r2d(seed.x*3.14);p.x-=1.+sin(time+floor(p.z/1.5)); p.z=mod(o.z,1.5)-.75; p.yz*=r2d(time+seed.x); b=smin(b,min(length(max(abs(p)-seed.x*.1,0.))-.02,.7),10.); p=q; p.xy*=r2d(time*.1); p=mod(p,3.)-1.5; p.yz+=(rand(floor(o.z/3.))-.5)+sin(o.z*.2+time)*.2; return min(min(gs*b,B),PEARL=length(p)-.08);//min(gs*(min(smin(length(p)-.5,length(p+sin(time*.1))-.4,5.),10.)),B); } bool isNaN(float v){ return !(v <= 0.0 || 0.0 <= v);} bvec4 isNaN(vec4 v){return bvec4(isNaN(v.r),isNaN(v.g),isNaN(v.b),isNaN(v.a));} void main( void ) { vec2 uv = ( gl_FragCoord.xy / resolution.xy ),p=uv*2.-1.; p.x*=resolution.x/resolution.y; mat2 rt=r2d(57.*.2+.6); vec3 ro=vec3(0,0,5),rd=normalize(vec3(p,-3.)),mp; ro.xz*=rt,rd.xz*=rt; ro.xy*=rt,rd.xy*=rt; float md;mp=ro; gl_FragColor=vec4(0); vec3 c=vec3(0),tint=vec3(1);//getColor(rd); for(int i=0;i<1000;i++)if(mp+=rd*(md=map(mp)),md<.001){ if(md==B){c+=getColor(rd+pow(gn(vec3(uv.xy*5.,time*.2)),2.)*2.3)*tint;break;} float pd=PEARL; vec3 n=normalize(map(mp)-vec3(map(mp-N.xyy),map(mp-N.yxy),map(mp-N.yyx))); mp+=rd*.02; rd=refract(rd,n,.9); gs=-gs; vec3 ff; float fres=pow(1.-abs(dot(n,rd)),4.),spec=pow(max(dot(n,normalize(vec3(0,1,0)-rd)),0.),50.); c+=( (getColor(reflect(rd,n))*fres+((spec+fres)+pow(spec,20.)*.5+getFilm(reflect(rd,n))*fres*10.)*.3)+ (ff=pow(vec3(gn(mp*5.+gn(mp*10.+10.)*10.),gn(mp*5.+32.+gn(mp*10.+1.)*10.),gn(mp*5.-41.+gn(mp*10.+5.)*10.))*gn(rd)*pow(spec,.05)*5.,vec3(2.))) )*tint; tint*=getColor(rd)*.4+.6; if(md==pd){c+=tint+ff*2.;break;} ///gl_FragColor.a+=spec; } gl_FragColor.a=1.; gl_FragColor.rgb = c+vec3(uv.x+uv.y,0,rd.x)*.5+rand(floor((uv.x+uv.y*.5)*20.)).x*(uv*r2d(.786)).y*pow(abs(uv*r2d(.786)).y,2.5); if (any(isNaN(gl_FragColor)))gl_FragColor=vec4(1); gl_FragColor=mix(gl_FragColor,texture2D(b,uv+.0005),.5); }