#version 410 core uniform float fGlobalTime; // in seconds uniform vec2 v2Resolution; // viewport resolution (in pixels) uniform float fFrameTime; // duration of the last frame, in seconds float t=fGlobalTime,dt=fFrameTime; 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 float vmax(vec3 v){return max(max(v.x,v.y),v.z);} #define box(v,s) vmax(abs(v) - (s)) #define Rm(a) mat2(cos(a),sin(a),-sin(a),cos(a)) #define T(t,s) texture(t,(s)/textureSize(t,0)) #define P(s) T(texPreviousFrame, s) #define N(s) T(texNoise, s).r #define fft(s) T(texFFT, s).r #define ffts(s) T(texFFTSmoothed, s).r #define ffti(s) T(texFFTIntegrated, s).r float h(float f) { return fract(sin(f)*45734.4378); } #define rep(p,s) (mod(p,s)-(s)*.5) vec3 ptrans(vec3 p) { p.x += 2.* sin(.4 * ffti(10) + t * .3); p.xz *= Rm(t + ffti(6) * 1.); p.xy *= Rm(t*.7); p.z += 2.* sin(.2 * ffti(10) + t * .3); return p; } float w(vec3 p) { vec3 bp = ptrans(p); float d = box(bp, vec3(.3 + 1.5 * ffts(7) * 17.)); vec3 pf = p; pf.y -= h(floor(ffti(15))) * 100.; pf.xy *= Rm(ffti(8)*.1 - t - p.z*(-.005+ .01 * ffts(7.))); float d2 = box(rep(pf+vec3(0., 0., -t*100.), vec3(10., 10., 40.)), vec3(.2)); if (ffts(5.) > .21) d = min(d, d2); else d = d2; return d; } float pv(vec2 pix, vec2 RES) { float v = 0.; vec2 uv=pix/RES*2. - 1.; uv.x*=RES.x/RES.y; float a = N(pix) * 20.; vec2 off = 2. * vec2(cos(a), sin(a)) * (.5 + 60.*ffts(5)); off -= uv*2.; v += P(pix + off).a; v -= dt * 3. * (.1 + 20. * ffts(7.)); vec3 O=vec3(0., 0., 5.), D=normalize(vec3(uv, -2.)), p; float L=100.,l=0.,d; for (float i=0.;i<100.;++i){ d=w(p=O+D*l); l+=d; if (d<.001*l||l>L)break; } if (l .9) { O.y += 2.; D.yz *= Rm(.5); } vec3 kc = vec3(1.); float sd = h(pix.x+pix.y+t+s); for(float b=0.;b<2.;b++){ float ly = D.y < .0 ? - O.y / D.y : 1e6; float lz = D.z < .0 ? - O.z / D.z : 1e6; float r = 0.; vec3 p, n, c=vec3(0.); if (ly < lz) { if (ly > 100.) break; p = O + D * ly; n = vec3(0., 1., 0.); //c = vec3(fract(p.xz), 0.); //c = vec3(0.,1.,0.); vec2 uv = p.xz * 100; r = N(uv); r *= (.6 + .4 * step(.7, fract(t+dot(normalize(vec2(1.)), uv/100.)))); } else { if (lz > 100.) break; p = O + D * lz; n = vec3(0., 0., 1.); //C += kc * vec3(fract(p.xy), 0.); vec2 uv = p.xy * TS / 4.; //uv.x /= TS.x / TS.y; uv.x /= TS.x / TS.y; //uv.x += 100.; uv = floor(uv); //uv = clamp(uv, vec2(0.), TS); #define pxl(p,s) (floor((p)/(s))*(s)) float ps = 1. + max(0., floor(1. + ffts(8) * 200. + 8. * sin(N(floor(uv/1.))))); uv = pxl(uv, ps); //uv.x -= floor(ffts(uv.y/100.) * 10.)*100.; c = vec3( pf(uv+.7).a, pf(uv).a, pf(uv-.4).a); //c = vec3(1.,0.,0.); } C += kc * c; O = p + .01 * n; D = normalize(mix( reflect(D, n), vec3(h(sd+=D.y),h(sd+=D.z),h(sd+=D.x)) - .5, r)); kc *= .9; } } C/=NS; C = mix(C, vec3( pf(pix-.3).r, pf(pix).g, pf(pix+.9).b ), min(1., length(uv) * .9 * (50. * ffts(17)))); C *= smoothstep(1.3, .9, length(uv)); out_color = vec4(sqrt(C), A); }