Live-Coding-Sources/2018-02-07/01-xt95.frag
2018-06-02 21:45:31 +02:00

81 lines
1.6 KiB
GLSL

/*
"pixelRatio" : 1
*/
precision mediump float;
uniform float time;
uniform vec2 resolution;
float smin( float a, float b)
{
float k = 2.;
return -log( exp(-k*a) + exp(-k*b) )/k;
}
vec4 obj[4];
float map( vec3 p)
{
float t = time + floor(p.x/5.-2.5)*.5 + floor(p.z/10.-5.);
obj[0] = vec4( cos(t*1.5),cos(t),cos(t*1.4),.25);
obj[2] = vec4( cos(t*2.),cos(t),cos(t*.5),.125);
obj[1] = vec4( cos(t),cos(t*.4),cos(t),.25);
obj[3] = vec4( cos(t*1.),sin(t),cos(t),1.);
p.xz = mod(p.xz, vec2(10.))-vec2(5.);
float d = p.y+2.;
d = smin(d, length(p-obj[0].xyz) - obj[0].w);
d = smin(d, length(p-obj[1].xyz) - obj[1].w);
d = smin(d, length(p-obj[2].xyz) - obj[2].w);
d = smin(d, length(p-obj[3].xyz) - obj[3].w);
return d;
}
vec3 normal(vec3 p)
{
vec2 eps = vec2(0.01,0.);
float d = map(p);
vec3 n;
n.x = d - map(p-eps.xyy);
n.y = d - map(p-eps.yxy);
n.z = d - map(p-eps.yyx);
return normalize(n);
}
vec3 rm(vec3 ro, vec3 rd)
{
vec3 p = ro;
for(int i=0; i<128; i++)
{
float d = map(p);
p += rd *d;
}
return p;
}
void main(void) {
vec2 uv = gl_FragCoord.xy / resolution -.5;
uv.x *= resolution.x / resolution.y;
vec3 ro = vec3(0.,1.,-10.);
vec3 rd = normalize(vec3(uv, 1.));
vec3 p = rm(ro,rd);
vec3 n = normal(p);
vec3 ld = normalize(vec3(-1.,.5,.1));
float shadow = 1.;
vec3 pp = rm(p+ld*.1, ld);
vec3 col = vec3(1.) * max(0., dot(ld,n));
if(length(p-pp)<10.)
shadow = 0.;
//col *= sign(cos(p.y*10.);
col *= shadow;
col = clamp(col,vec3(0.),vec3(1.)) + vec3(1.,.7,.5)*min(1.,length(p-ro)*.03);
gl_FragColor = vec4(col, 1);
}