#version 430 core /////////////////////////////////////////////////////////////////////////////// // shader inputs/outputs /////////////////////////////////////////////////////////////////////////////// uniform float iGlobalTime; // in seconds uniform vec2 iResolution; // viewport resolution (in pixels) (1080p or 720p) // all samplers have linear filtering applied, wraping set to repeat // uniform sampler1D iFFTTexture; // 1024 uniform float iFFT[8]; // latest fram 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 iNoise; uniform sampler2D iChecker; // out_color must be written in order to see anything // layout(location = 0) out vec4 out_color; /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// float mapg( vec3 pt, float sp ) { pt.xz *= 3.7; return (sin( pt.x ) + cos( pt.y ) ) * sp; } float rmg( vec3 ro, vec3 rd, float h, float sp ) { float t = 0.0; for( int i = 0; i < 50; i++ ) { vec3 pt = ro + rd * t; float h = abs( pt.y - mapg( pt, sp ) ); if( h < 0.1 ) { break; } t += h * 0.3; } return t; } vec3 colorize( vec3 ro, vec3 rd, vec2 uv ) { float sp = texture( iFFTTexture, 0.0 ).r * 2.0 + 0.25; float t = rmg( ro, rd, 10.0, sp ); vec3 pt = ro + rd * t; vec3 light = vec3( 0.0, 1.0, 0.0 ); vec3 ed = normalize( pt - ro ); float eps = 0.1; vec3 norm = normalize( vec3( mapg( pt + vec3( eps, 0.0, 0.0 ), sp ) - mapg( pt, sp ), 1.0, mapg( pt + vec3( 0.0, 0.0, eps ), sp ) - mapg( pt, sp ) ) ); vec3 r = reflect( light, norm ); vec3 color = pt * ( sp + 0.1) + vec3( 1.0 + sp * 5.0, 1.0 - sp * 5.0, 1.0 ) * max( 0.0, dot( pt, r ) ); return color; } void main(void) { vec2 uv = vec2( gl_FragCoord.xy ) / iResolution; uv = uv - vec2( 0.5, 0.5 ); float sp = texture( iFFTTexture, 0.0 ).r * 4.0 + 0.25; vec3 ro = vec3( 0.0, 0.0, 0.0 ); vec3 rd = normalize( vec3 ( uv.x, uv.y, 1.0 ) ); float d = 0.5-length( uv ) * 0.75; vec3 color = colorize( ro, rd, uv ) * ( d - sp * 0.3 ); //+ colorize( ro + vec3( sp * 0.5, 0.0, 0.0 ), rd, uv ) * ( d - sp * 0.3 ); out_color = vec4( color, 1.0 ); }