#version 430 core #define EPS 0.01 /////////////////////////////////////////////////////////////////////////////// // shader inputs/outputs /////////////////////////////////////////////////////////////////////////////// uniform float iGlobalTime; // in seconds uniform vec2 iResolution; // viewport resolution (in pixels) (1080p or 720p) uniform mat4 iMidiPad; // 16 buttons of midi controller uniform float iMidiPadValue; // sum of all elements in iMidiPad/16 // all samplers have linear filtering applied, wraping set to repeat // uniform sampler1D iFFTTexture; // 1024 uniform float iFFT[8]; // latest frame uniform float iFFTs[8]; // smoothed latest frame uniform sampler2D iFFTsHistory; // smoothed fft history, 8x1024, x coord = bin, y coord n-frames earlier, y=0 is latest frame // predefined textures // uniform sampler2D iTex1; uniform sampler2D iTex2; uniform sampler2D iTex3; uniform sampler2D iTex4; uniform sampler2D iTex5; uniform sampler2D iTex6; uniform sampler2D iTex7; uniform sampler2D iTex8; uniform sampler2D iNoise; uniform sampler2D iChecker; // out_color must be written in order to see anything // layout(location = 0) out vec4 out_color; /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// vec4 gMaterial = vec4(0.0); vec3 rx(vec3 v, float a) { mat2 m = mat2( cos(a), sin(a), -sin(a), cos(a) ); v.yz = m * v.yz; return v; } vec4 sel(float d1, vec4 m1, float d2, vec4 m2) { float f = floor(sign(d1 - d2) * 0.5 + 0.5); return mix(m1,m2,f); } float s(vec3 p) { vec3 pp = p - vec3( 0.0,1.5 - iFFT[0] * 2.0,0.0 ); pp = rx(pp,iGlobalTime); float sp = length(pp) - 0.5; float pl = p.y; vec3 c1 = vec3(1.0,0.0,0.0); vec3 c2 = vec3(1.0); float as = atan(pp.z,pp.x); as = mod(as / 3.14159265 * 6.0, 2.0); vec3 c = vec3(0.0); if(as > 1.0 && mod(asin(pp.y) * 6.0, 2.0) > 1.0) c = c2; else c = c1; if(as < 1.0 && mod(asin(pp.y) * 6.0, 2.0) < 1.0) c = c1; else c = c2; gMaterial = sel( sp, vec4(c,0.0), pl, vec4(0.0,0.5,1.0,0.0) ); return min(sp,pl); } bool rm(vec3 ro, vec3 rd, int steps, out vec3 hit) { vec3 p = ro; for(int i = 0; i < steps; ++i) { float d = s(p); if(d < EPS) { hit = p; return true; } p += rd * d; if(distance(p,ro)>100.0) break; } return false; } vec3 no(vec3 p) { vec2 e = vec2(EPS,0.0); return normalize(vec3( s(p+e.xyy)-s(p-e.xyy), s(p+e.yxy)-s(p-e.yxy), s(p+e.yyx)-s(p-e.yyx) )); } vec2 ph(vec3 p, vec3 n, vec3 e, vec3 lp, float lr) { vec3 N = normalize(n); vec3 L = normalize(lp - p); vec3 V = normalize(e - p); vec3 H = normalize(L + V); return vec2( max(0.0, dot(N, L)), max(0.0, pow(dot(N, H), 128.0)) ); } void main(void) { vec2 uv = vec2( gl_FragCoord.xy ) / iResolution; vec2 q=uv*2.0-vec2(1.0); vec3 ro = vec3(0.0,5.0,5.0); vec3 rd = normalize(vec3(q*vec2(1.6,0.9),-1.5)); rd = rx(rd,-0.7); out_color = vec4(0.0,uv.y*0.5,uv.y*0.8+0.2,1.0); vec3 lp = vec3(0.0,8.0,0.0); vec3 hit; if(rm(ro,rd,128,hit)) { vec2 li = ph(hit,no(hit),ro,lp,15.0); out_color.rgb=vec3(gMaterial.rgb * li.x + vec3(li.y)); } }