2023-10-27 00:54:07 +02:00
|
|
|
#version 300 es
|
|
|
|
|
2023-10-28 12:17:47 +02:00
|
|
|
precision highp float;
|
2023-10-27 00:54:07 +02:00
|
|
|
|
|
|
|
uniform float time;
|
|
|
|
|
|
|
|
in vec2 fragCoord;
|
|
|
|
|
2023-10-28 19:18:37 +02:00
|
|
|
// shader: https://www.shadertoy.com/view/ttKGDt
|
2023-10-28 12:17:47 +02:00
|
|
|
|
2023-10-28 19:18:37 +02:00
|
|
|
mat2 rot(float a) {
|
|
|
|
float c = cos(a), s = sin(a);
|
|
|
|
return mat2(c,s,-s,c);
|
2023-10-28 12:17:47 +02:00
|
|
|
}
|
|
|
|
|
2023-10-28 19:18:37 +02:00
|
|
|
const float pi = acos(-1.0);
|
|
|
|
const float pi2 = pi*2.0;
|
|
|
|
|
|
|
|
vec2 pmod(vec2 p, float r) {
|
|
|
|
float a = atan(p.x, p.y) + pi/r;
|
|
|
|
float n = pi2 / r;
|
|
|
|
a = floor(a/n)*n;
|
|
|
|
return p*rot(-a);
|
2023-10-27 00:54:07 +02:00
|
|
|
}
|
|
|
|
|
2023-10-28 19:18:37 +02:00
|
|
|
float box( vec3 p, vec3 b ) {
|
|
|
|
vec3 d = abs(p) - b;
|
|
|
|
return min(max(d.x,max(d.y,d.z)),0.0) + length(max(d,0.0));
|
2023-10-28 12:17:47 +02:00
|
|
|
}
|
|
|
|
|
2023-10-28 19:18:37 +02:00
|
|
|
float ifsBox(vec3 p) {
|
|
|
|
for (int i=0; i<5; i++) {
|
|
|
|
p = abs(p) - 1.0;
|
|
|
|
p.xy *= rot(time*0.3);
|
|
|
|
p.xz *= rot(time*0.1);
|
2023-10-28 12:17:47 +02:00
|
|
|
}
|
2023-10-28 19:18:37 +02:00
|
|
|
p.xz *= rot(time);
|
|
|
|
return box(p, vec3(0.4,0.8,0.3));
|
2023-10-28 12:17:47 +02:00
|
|
|
}
|
2023-10-28 19:18:37 +02:00
|
|
|
|
|
|
|
float map(vec3 p, vec3 cPos) {
|
|
|
|
vec3 p1 = p;
|
|
|
|
p1.x = mod(p1.x-5., 10.) - 5.;
|
|
|
|
p1.y = mod(p1.y-5., 10.) - 5.;
|
|
|
|
p1.z = mod(p1.z, 16.)-8.;
|
|
|
|
p1.xy = pmod(p1.xy, 5.0);
|
|
|
|
return ifsBox(p1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
vec2 p = fragCoord;
|
|
|
|
|
|
|
|
vec3 cPos = vec3(0.0,0.0, -3.0 * time);
|
|
|
|
// vec3 cPos = vec3(0.3*sin(time*0.8), 0.4*cos(time*0.3), -6.0 * time);
|
|
|
|
vec3 cDir = normalize(vec3(0.0, 0.0, -1.0));
|
|
|
|
vec3 cUp = vec3(sin(time), 1.0, 0.0);
|
|
|
|
vec3 cSide = cross(cDir, cUp);
|
|
|
|
|
|
|
|
vec3 ray = normalize(cSide * p.x + cUp * p.y + cDir);
|
|
|
|
|
|
|
|
float acc = 0.0;
|
|
|
|
float acc2 = 0.0;
|
|
|
|
float t = 0.0;
|
|
|
|
for (int i = 0; i < 99; i++) {
|
|
|
|
vec3 pos = cPos + ray * t;
|
|
|
|
float dist = map(pos, cPos);
|
|
|
|
dist = max(abs(dist), 0.02);
|
|
|
|
float a = exp(-dist*3.0);
|
|
|
|
if (mod(length(pos)+24.0*time, 30.0) < 3.0) {
|
|
|
|
a *= 2.0;
|
|
|
|
acc2 += a;
|
|
|
|
}
|
|
|
|
acc += a;
|
|
|
|
t += dist * 0.5;
|
|
|
|
}
|
|
|
|
|
|
|
|
vec3 col = vec3(acc * 0.001, acc * 0.001 + acc2*0.002, acc * 0.002+ acc2*0.005);
|
|
|
|
gl_FragColor = vec4(col, 1.0 - t * 0.03);
|
2023-10-28 12:17:47 +02:00
|
|
|
}
|