// ----------------------------------------------------------------------------- #version 430 core // -----------------------------------------------------------------------------
uniform float fGlobalTime; // in seconds uniform vec2 v2Resolution; // viewport resolution (in pixels) uniform float fFrameTime; // duration of the last frame, in seconds
uniform sampler1D texFFT; // towards 0.0 is bass / lower freq, towards 1.0 is higher / treble freq uniform sampler1D texFFTSmoothed; // this one has longer falloff and less harsh transients uniform sampler1D texFFTIntegrated; // this is continually increasing uniform sampler2D texPreviousFrame; // screenshot of the previous frame uniform sampler2D texChecker; uniform sampler2D texNoise; uniform sampler2D texTex1; uniform sampler2D texTex2; uniform sampler2D texTex3; uniform sampler2D texTex4;
layout(location = 0) out vec4 out_color; // out_color must be written in order to see anything
#define iTime fGlobalTime #define iResolution vec3(v2Resolution,1)
// -----------------------------------------------------------------------------
float hash(vec2 co) { return fract(sin(dot(co.xy ,vec2(12.9898,58.233))) * 13758.5453); }
float segmenty(vec2 p) { float d0 = length(p) , d1 = abs(p.x) ; return p.y > 0. ? d0 : d1; }
vec3 bars() { const float ZZ = 0.0125; vec2 r = v2Resolution , C = gl_FragCoord.xy , p = (C + C - r) / r.y , q ; float t = fGlobalTime , aa = sqrt(2.) / r.y ; vec3 col = vec3(0); ; p.y += 0.25; q = (1. + p) * 0.5; // Draw frequency bars if (abs(p.x) < 1.5 - ZZ * 3.) { float x = q.x , n = round(x / ZZ) * ZZ ; vec2 c = q; c.x -= n; x = n;
x = clamp(x * 0.5 + 0.125, 0., 1.);
float f = texture(texFFTSmoothed, x).x;
x += 1./16.;
f *= f * x * x * 3e4;
f = log2(f) / 10. + 0.6;
c.y -= 0.5;
c.y = abs(c.y) - f * 0.3;
col = mix(
col
, (1. + sin(-t + abs(p.y) + 2. * p.x + vec3(0, 1, 2))) * (1.25 + sign(p.y))
, smoothstep(aa, -aa, segmenty(c) - ZZ * 0.4)
);
}
// Horizontal line at y=0
if (abs(p.y) < 2. * aa) {
col = vec3(2);
}
// Bottom half tint
if (p.y < 0.) {
col += -0.01 * vec3(1, 3, 21) * p.y;
}
// Final color processing
return col;
}
void mainImage(out vec4 O, vec2 C);
void main(void) { vec4 O=vec4(1); mainImage(O, gl_FragCoord.xy); O.w = 1.; out_color = O;
}
// -----------------------------------------------------------------------------
float length4(vec3 p) { return sqrt(length(p*p)); }
float length4(vec2 p) { return sqrt(length(p*p)); }
float length8(vec3 p) { return sqrt(sqrt(length(ppp*p))); }
float length8(vec2 p) { return sqrt(sqrt(length(ppp*p))); }
vec3 sky(vec3 S, vec3 I) { vec3 col; float t0 = (5.-S.y)/I.y; float t1 = (-5.-S.y)/I.y; if (t0 > 0.) { vec2 p2 = (t0*I+S).xz; float d = length4(p2)-4.; col += (vec3(1,2,3)-d-1.)smoothstep(2.,-2.,d)/2.; } if (t1 > 0.) { vec2 p2 = (t1I+S).xz; float d = length(p2); col += vec3(1,1,2)*exp(-d); } return col; }
mat2 R; float X; float G; float df(vec3 p) { float d = 1E3,i,ia; for (i=0.;i<6.;++i) { vec3 ip = p; ia = -iTime+i*.2+.3p.x; ip.y += sin(ia); ip.z += -.5i; ip.yz = mat2(cos(.6cos(ia)+iTime+p.x+vec4(0,11,33,0))); float id = length4(ip.yz)-0.2; if (id < d) { d = id; X = i; } }
p -= vec3(0,0,-1); p.xz*= R; p.xy*= R; float cd = length8(p)-.7; float gd = length(p)-.5; cd = max(cd,0.3-gd); cd = min(cd, gd); if (cd < d) { d = cd; X = 10.; } G=min(G,gd);
return d; } float rayMarch(vec3 S,vec3 I) { float i,z,d; vec3 p; for(;++i<77.;z+=.8d) { p = zI+S; d = df(p); if (z > 9.) break; if (d < 1e-4) break; }
return z; }
vec3 normal(vec3 p) { vec2 E=vec2(1e-2,0); return normalize(vec3( df(p+E.xyy)-df(p-E.xyy) , df(p+E.yxy)-df(p-E.yxy) , df(p+E.yyx)-df(p-E.yyx) )); }
void mainImage(out vec4 O, vec2 C) { O.xyz = bars(); float d,z,F,x,g; R=mat2(cos(.6iTime+vec4(0,11,33,0))); vec3 r=iResolution , p , I=normalize(vec3(C-.5r.xy,r.y)) , S=vec3(0,0,-4) , n ; G = 1e3; X = 1e3; z = rayMarch(S,I); x = X; g = G; if (z < 9.) { p = S+I*z; n = normal(p); F = 1.+dot(I,n); F *= F; F = mix(.6,1.,F); r = reflect(I,n); O.xyz = 0.; O.xyz += Fsky(p,r); O.xyz += vec3(0,1,9)pow(.5n.y+.5,4.)/18.; O.xyz = 1.2+sin(-.5z+x+vec3(5,1,2)); O.xyz = 1.; O.xyz += 0.003vec3(1,2,3)/max(g,1e-3); }
O.xyz = sqrt(tanh(O.xyz)); }