Pruebita
Log in to post a comment.
#version 300 es precision highp float; int MAX_STEPS=80; uniform float iTime; uniform vec2 iResolution; out vec4 fragColor; uniform float mouseX; // value=142., min=-1.0, max=600.0, step=1.0 uniform float mouseY; // value=87., min=-1.0, max=180.0, step=1.0 float sdSphere(vec3 p,float s){ return length(p)-s; } float sdBox(vec3 p,vec3 size){ vec3 d=abs(p)-size; return length(max(d,0.))+min(max(d.x,max(d.y,d.z)),0.); } float sdTorus(vec3 p,float majorRadius,float minorRadius){ vec2 q=vec2(length(p.xz)-majorRadius,p.y); return length(q)-minorRadius; } float smin(float a,float b,float k){ float h=clamp(.5+.5*(b-a)/k,0.,1.); return mix(b,a,h)-k*h*(1.-h); } mat2 rot2D(float a){ return mat2(cos(a),-sin(a),sin(a),cos(a)); } float map(vec3 p){ vec3 spherePos=vec3(tan(iTime)*3.,0,0); float sphere=sdSphere(p-spherePos,2.); vec3 q=p; q.xy*=rot2D(iTime*3.); q.yz*=rot2D(-iTime); vec3 boxPos=vec3(-8,0,0); float box=sdBox(q-boxPos,vec3(sin(iTime)*-2.)); q.xy*=rot2D(iTime*1.); vec3 torusPos=vec3(2.,0,0); float torus=sdTorus(q-torusPos,2.5,.75); float ground=p.y+.2; float shapes=smin(sphere,box,3.); return smin(smin(ground,shapes,.2),torus,1.4); } void main() { vec2 iMouse = vec2(mouseX, mouseY); vec2 uv=(gl_FragCoord.xy*2.-iResolution.xy)/iResolution.y; vec2 m=(iMouse.xy-iResolution.xy*.5)/iResolution.y; vec3 ro=vec3(0.,0.,-8.); vec3 rd=normalize(vec3(uv,1)); vec3 color=vec3(0.); float t=0.;// total distance traveled ro.yz*=rot2D(-m.y); rd.yz*=rot2D(-m.y*-3.); ro.xz*=rot2D(-m.x); rd.xy*=rot2D(m.x*-3.); int i=0; for(i;i<MAX_STEPS;i++){ vec3 p=ro+rd*t;// current position along the ray p.xy*=rot2D(t*.15*m.x); p.y+=sin(t*(m.y+1.)*.5)*.35;// wiggle ray float d=map(p);// current distance t+=d; color=vec3(i)/float(MAX_STEPS);// color based on the number of steps taken if(d<.001||t>100.)break; } color=vec3(t*.02,0.,t*.1); fragColor = vec4(color,1.); }