dotfiles/scripts/wlbg/src/bg_frag.glsl
2023-10-28 19:18:37 +02:00

79 lines
1.8 KiB
GLSL

#version 300 es
precision highp float;
uniform float time;
in vec2 fragCoord;
// shader: https://www.shadertoy.com/view/ttKGDt
mat2 rot(float a) {
float c = cos(a), s = sin(a);
return mat2(c,s,-s,c);
}
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);
}
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));
}
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);
}
p.xz *= rot(time);
return box(p, vec3(0.4,0.8,0.3));
}
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);
}