#ifdef GL_ES precision mediump float; #endif uniform vec2 resolution; uniform float time; uniform sampler2D backbuffer; float distanceFunction(vec3 p) { float repeat = 0.8+.2*sin(time); //all vec3 allPos = vec3(sin(time),sin(time),-1.5*time); //tor vec3 torPos = p + vec3( 0.0+ 0.375* sin(time),-1.49,0.0)+allPos; //torPos = mod(vec3(p.x,p.y,p.z),1.0); //vec3 torPos = p; torPos = mod(torPos, repeat)-repeat/2.0; vec2 t = vec2( 0.75,0.749); vec2 q = vec2(length(torPos.xz)-t.x,torPos.y); float d2 = length(q)-t.y; //sp vec3 spPos = p + vec3( 0.0,-0.77,0.0)+allPos; spPos = mod(spPos, repeat)-repeat/2.0; float d1 =length(spPos) - 0.8; return max(-d2,d1); //return d2; } vec3 getNormal(vec3 p) { const float d = 0.0001; return normalize ( vec3 ( distanceFunction(p+vec3(d,0.0,0.0))-distanceFunction(p+vec3(-d,0.0,0.0)), distanceFunction(p+vec3(0.0,d,0.0))-distanceFunction(p+vec3(0.0,-d,0.0)), distanceFunction(p+vec3(0.0,0.0,d))-distanceFunction(p+vec3(0.0,0.0,-d)) ) ); } const vec3 alb =vec3(1.5,0.5,1.2); //const vec3 amb =vec3(0.2,0.45,0.38); const vec3 amb =vec3(0.,0.45,0.38); const vec3 sp=vec3(2.5,1.0,1.25); void main() { vec2 pos = (gl_FragCoord.xy*2.0 -resolution) / resolution.y; vec3 camPos = vec3(0.0, 1.4, 3.0); vec3 camDir = normalize( vec3(cos(time), -0.5*sin(time), -1.0) ); vec3 camUp = vec3(0.0, 1.0, 0.0); vec3 camSide = cross(camDir, camUp); vec3 lightDir = vec3(0.1,0.2,-0.5); float focus = 1.8; vec3 rayDir = normalize(camSide*pos.x + camUp*pos.y + camDir*focus); float t = 0.0, d; vec3 posOnRay = camPos; for(int i=0; i<16; ++i) { d = distanceFunction(posOnRay); if((d)<0.001) break; t += d; posOnRay = camPos + t*rayDir; } vec4 blur = texture2D(backbuffer,gl_FragCoord.xy/resolution.xy); if(abs(d) < 0.1) { vec3 normal = getNormal(posOnRay); float diff = dot(lightDir,normal); vec3 halfVec = normalize(lightDir-camDir); float spec = pow(max(dot(normal, halfVec), 0.0),20.0); vec3 light = diff*vec3(1.0)+amb; gl_FragColor = vec4(alb*light+spec*sp,1.0)+0.2*blur; //gl_FragColor = blur; }else { gl_FragColor = vec4(0.01,0.0,0.05,1.0); } }