Files
Live-Coding-Sources/2018-10-20/theo.frag
2018-10-22 23:23:21 +02:00

84 lines
1.7 KiB
GLSL

precision mediump float;
uniform vec2 resolution;
uniform float time;
vec3 lookat (vec3 eye, vec3 at, vec2 uv) {
vec3 front = normalize(at-eye);
vec3 right = normalize(cross(front, vec3(0,1,0)));
vec3 up = normalize(cross(front, right));
return normalize(front + right * uv.x + up * uv.y);
}
mat2 rot (float a) {
float c = cos(a), s = sin(a);
return mat2(c,-s,s,c);
}
float smin (float a, float b, float r) {
float h = clamp(.5+.5*(b-a), 0., 1.);
return mix(b,a,h)-r*h*(1.-h);
}
float repeat( float p, float c) { return mod(p,c)-c/2.; }
float box(vec3 p, vec3 b) {
b=abs(p)-b;
return min(max(b.x, max(b.y, b.z)),0.) + length(max(b, 0.));
}
float sc(vec3 p,float d){
p=abs(p);p=max(p,p.yzx);
return min(p.x,min(p.y,p.z))-d;
}
mat2 r2d(float a){float c=cos(a),s=sin(a);return mat2(c,s,-s,c);}
vec3 re(vec3 p, float d){return mod(p-d*.5,d)-d*.5;}
float g=0.;
float de(vec3 p){
//p.y+=.5;
float t = time*6.;
float s1 = .77+2.5*(t*.1+sin(t)*.1);
p.xz*=r2d(s1);
p.xy*=r2d(s1);
float d= box(p, vec3(1));
float s=1.;
vec3 q = p;
for(int m=0;m<3;m++) {
q = re(p*s, 2.);
s*=3.;
d = max(d, -sc(2.-abs(q)*3., 1.)/s);
}
d = min(d, sc(1.-abs(q), .1));
g+=.01/(.01+d*d);
return d;
return sc(p,.3);
return length(p)-1.;
}
void main () {
vec2 uv = gl_FragCoord.xy / resolution;
uv -= .5;
uv.x *= resolution.x / resolution.y + tan(time)*.4;
vec3 ro=vec3(0,0,-2),rd=normalize(vec3(uv,.7-length(uv))),p;
float ri,t=0.;
for(float i=0.;i<1.;i+=.01) {
ri=i;
p = ro+rd*t;
float d = de(p);
//if(d<.001)break;
d = max(abs(d), .002);
t+=d*.5;
}
vec3 c = mix(vec3(.1, .3, .3), vec3(.1, .1, .2), length(uv*2.)+ri);
c.r+=(sin(time*4.)*.5+.5)*.1;
c+=g*.007;
gl_FragColor = vec4(c, 1);
}