Log in to post a comment.
#version 300 es
precision highp float;
uniform float iTime;
uniform vec2 iResolution;
in vec2 vScreen;
out vec4 fragColor;
float sphereSdf(vec3 p, float r) {
return length(p) - r;
}
float sdRoundBox( vec3 p, vec3 b, float r )
{
vec3 q = abs(p) - b + r;
return length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0) - r;
}
float opSmoothUnion( float d1, float d2, float k )
{
float h = clamp( 0.5 + 0.5*(d2-d1)/k, 0.0, 1.0 );
return mix( d2, d1, h ) - k*h*(1.0-h);
}
float sdf(vec3 p, float t) {
t *= 4.;
float ang = t + 0.4 * cos(t);
return opSmoothUnion(
sphereSdf(p - vec3(2.0 * cos(ang), 2.0 * sin(ang), 3), 1.0),
sdRoundBox(p - vec3(0, 0.3 * sin(t + 1.3), 4), vec3(1, 1, 1), 0.2),
1.5
)
+ 0.04 * pow(0.5 + 0.5 * cos(t - 1.6), 4.0)
* (sin(13.0 * p.x - p.y * 8.) + sin(7. * p.y + 10. * p.x));
}
vec3 gradient(vec3 p, float t) {
float h = 0.001;
return vec3(
sdf(p + vec3(h, 0, 0), t) - sdf(p - vec3(h, 0, 0), t),
sdf(p + vec3(0, h, 0), t) - sdf(p - vec3(0, h, 0), t),
sdf(p + vec3(0, 0, h), t) - sdf(p - vec3(0, 0, h), t)
) / h;
}
vec3 rainbow(float r, int n) {
//r /= 6.28318530718;
r = floor(float(n) * r) / float(n);
r *= 6.28318530718;
return vec3(
0.5 * sin(r + 0.000 - 0.0 * iTime) + 0.5,
0.5 * sin(r + 2.094 - 0.0 * iTime) + 0.5,
0.5 * sin(r + 4.188 - 0.0 * iTime) + 0.5
);
}
vec3 getColorAtTime(float t, int iterationCount) {
vec3 p = vec3(0, 0, -1);
vec3 dir = normalize(vec3(vScreen.x, vScreen.y, 0) - p);
float s = 0.0;
for (int i=0; i<iterationCount; i++) {
float d = sdf(p, t);
p += d * dir;
s += d;
if (d < 0.001 || s > 1000.0) break;
}
vec3 color;
float r = length(vScreen);
if (s > 1000.0) {
return vec3(0);
}
vec3 lightPos = vec3(5, 5, 1);
vec3 N = normalize(gradient(p, t));
vec3 L = normalize(lightPos - p); // dir from pos to light
vec3 R = reflect(-L, N);
float diff = max(dot(N, L), 0.0);
float spec = pow(max(dot(-dir, R), 0.0), 40.0);
vec3 diffColor = rainbow(0.73-diff, 8);
vec3 ambient = diffColor * 0.2;
return ambient
+ diffColor// * diff
+ spec;
}
void main() {
float delay = 0.02;
vec3 color =
0.6 * getColorAtTime(iTime, 200)
+ 0.2 * min(vec3(0.4), getColorAtTime(iTime - 1. * delay, 50))
+ 0.2 * min(vec3(0.4), getColorAtTime(iTime - 2. * delay, 50));
fragColor = vec4(color, 1.0);
}