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

91 lines
1.7 KiB
GLSL

/*{
"pixelRatio" : 3
}*/
precision mediump float;
uniform float time;
uniform vec2 resolution;
float rep(float p, float d) {
return mod(p-d*.5, d)-d*.5;
}
vec3 rep(vec3 p, float d) {
return mod(p-d*.5, d)-d*.5;
}
void mo(inout vec2 p, vec2 d){
p.x = abs(p.x) - d.x;
p.y = abs(p.y) - d.y;
if(p.y>p.x)p=p.yx;
}
void amod(inout vec2 p, float m) {
float a = rep(atan(p.x, p.y), m);
p = vec2(cos(a), sin(a)) * length(p);
}
vec2 path(float t) {
float a =sin(t*.2+1.5), b=cos(t*.2);
return vec2(a*2., a*b);
}
vec3 g;
float sc(vec3 p) {
p = abs(p);
p = max(p, p.yzx);
return min(p.x, min(p.y, p.z)) - .02;
}
float de(vec3 p){
p.xy -= path(p.z);
amod(p.xy, 3.14);
mo(p.xy, vec2(.3, 3.));
mo(p.xy, vec2(.9, .3));
float d = length(p.xy) - .03;
d = min(d, length(rep(p, 4.)) - .1);
amod(p.xy, .785);
mo(p.zy, vec2(1., 1.2));
p.z = rep(p.z, 1.);
d = min(d, sc(p));
vec3 q = p;
mo(q.xy, vec2(3., 2.));
q = rep(q, 10.);
d = min(d, sc(q));
g += vec3(.5, .6, .5) * .025 / (.01+d*d);
return d;
}
void main(void) {
vec2 uv = gl_FragCoord.xy / resolution -.5;
uv.x *= resolution.x / resolution.y;
float dt = time*6.;
vec3 ro = vec3(0, 0, -4. + dt);
vec3 ta = vec3(0, 0, dt);
ro.xy += path(ro.z);
ta.xy += path(ta.z);
vec3 fwd = normalize(ta - ro);
vec3 left = cross(vec3(0, 1, 0), fwd);
vec3 up = cross(fwd, left);
vec3 rd = normalize(fwd+uv.x*left+uv.y*up);
float ri, t = 0.;
for(float i=0.;i<1.;i+=.01){
ri=i;vec3 p = ro+rd*t;
float d = de(p);
if(d<.001||t>100.) break;
t+=d*.2;
}
vec3 c = mix(vec3(.9, .2, .4), vec3(.3, cos(time)*.1, .2), uv.x+ri);
c.r *= sin(time);
c += g*.02;
gl_FragColor = vec4(c, 1);
}