Files
Live-Coding-Sources/2018-03-07/extra-leon.frag
Jonathan Giroux e1e649ac3e Add 2018-03-07
2018-04-22 13:40:49 +02:00

78 lines
1.9 KiB
GLSL

// fluxus
// dave griffits
precision mediump float;
uniform float time;
uniform vec2 resolution;
#define PI 3.14159
#define TAU (PI*2.)
#define repeat(p,c) (mod(p+c/2.,c)-c/2.)
float sdSphere (vec3 p, float r) { return length(p) - r; }
float sdCylinder (vec2 p, float r) { return length(p) - r; }
float sdIso (vec3 p, float r) { return dot(p, normalize(sign(p))) - r; }
vec2 amod (vec2 p, float c) {
float ac = TAU/c;
float a = mod(atan(p.y,p.x), ac)-ac/2.;
return vec2(cos(a),sin(a)) * length(p);
}
mat2 rot (float a) {
float c = cos(a), s = sin(a);
return mat2(c,-s,s,c);
}
float map (vec3 pos) {
float scene = 1000.;
vec3 p = pos;
// p.xz = amod(p.xz, 5.);
p = repeat(p, 3.);
p.xz *= rot(p.y + time * .3);
// p = abs(p);
// p.x -= .5;
p.xz *= rot(time*.9);
p.yz *= rot(time*.6);
p.yx *= rot(time*.3);
scene = min(scene, sdIso(p, .5));
// scene = min(scene, sdCylinder(p.xz, .01));
// scene = min(scene, sdCylinder(p.yz, .01));
// scene = min(scene, sdCylinder(p.yx, .01));
return scene;
}
vec3 getNormal (vec3 p) {
vec2 e = vec2(.001,0.);
return normalize(vec3(map(p+e.xyy)-map(p-e.xyy), map(p+e.yxy)-map(p-e.yxy), map(p+e.yyx)-map(p-e.yyx)));
}
vec3 lookAt (vec3 eye, vec3 at, vec2 uv) {
vec3 forward = normalize(at - eye);
vec3 right = normalize(cross(forward, vec3(0,1,0)));
vec3 up = normalize(cross(right, forward));
return normalize(forward + right * uv.x + up * uv.y);
}
void main () {
vec2 uv = (gl_FragCoord.xy-.5*resolution.xy)/resolution.y;
vec3 eye = vec3(0,.5,-2);
vec3 ray = lookAt(eye, vec3(0), uv);
vec3 pos = eye;
float shade = 0.;
for (float i = 0.; i <= 1.; i += 1./30.) {
float dist = map(pos);
if (dist < .001) {
shade = 1.-i;
break;
}
pos += dist * ray;
}
vec3 color = vec3(1.);
color = getNormal(pos) * .5 + .5;
color *= shade;
gl_FragColor = vec4(color, 1);
}