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

122 lines
2.2 KiB
GLSL

precision mediump float;
uniform float time;
uniform vec2 resolution;
float sdSphere (vec3 p, float r) { return length(p) - r; }
mat2 r2d(float a){
float c = cos(a), s=sin(a);
return mat2(c, s, -s, c);
}
void lw(inout vec3 p) {
p.xz *= r2d(time);
p.xy *= r2d(time);
//return p;
}
float g=0.;
float map (vec3 p) {
float pl=p.y+1.;
lw(p);
//float scene = 1000.;
//scene = min(scene, sdSphere(pos, 1.));
float d = length(max(abs(p) - .7, 0.));
d = min(d, pl);
g+=.01/(.01+d*d);
return d;
}
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);
}
vec3 tex(vec2 p){
float pl=1., o=0.;
float t = sin(time*20.);
float a = -.35 + t*.02;
p.x *=1.2;
p*=r2d(a);
p*=.07;
p+=vec2(.71, t*.014 - .56) + t*.017;
for(int i=0;i<13;i++) {
p.x = abs(p.x);
p*=2.;
p+=vec2(-2., .85) - t*.04;
p /= min(dot(p,p), 1.03);
float l = length(p*p);
o += exp(-1.2 / abs(l-pl));
pl = l;
}
o*=.07;
o*=o;
return vec3(.8, .8*o, o*o*.9) * o * 2. + .1;
}
vec3 normal(vec3 p) {
vec2 e = vec2(.01, 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 boxmap(vec3 p, vec3 n) {
vec3 m = pow(n, vec3(32.));
vec3 x = tex(p.yz);
vec3 y = tex(p.zx);
vec3 z = tex(p.xy);
return (m.x*x, m.y*y, m.z*z) / (m.x+m.y+m.z);
}
void main () {
// vec2 uv = (gl_FragCoord.xy-.5*resolution.xy)/resolution.y;
vec2 uv = (gl_FragCoord.xy/resolution.xy) - .5;
uv.x *= resolution.x / resolution.y;
// vec3 eye = vec3(0,1,-3);
//S vec3 ray = lookAt(eye, vec3(0), uv);
//vec3 pos = eye;
vec3 ro = vec3(0, 0, -4);
vec3 rd = normalize(vec3(uv, 1));
vec3 p;
// float shade = 0.;
float t = 0.;
for (float i = 0.; i < 1.; i += .01) {
p=ro+rd*t;
float dist = map(p);
if (dist < .001) {
//shade = 1.-i;
break;
}
t += dist;
}
vec3 n = normal(p);
lw(p);lw(n);
vec3 color = boxmap(p, n);//tex(uv);
//color += g*.01;
// color = vec3(n);;
// color *= shade;
gl_FragColor = vec4(color, 1);
}