planar light tunnel
Log in to post a comment.
#version 300 es precision highp float; uniform float iTime; uniform vec2 iResolution; out vec4 fragColor; uniform float _BandSpacing; //value=.5, min=0, max=1, step=0.01 uniform float _FrequencyY; //value=2., min=0.1, max=4, step=0.01 uniform float _SpeedZ; //value=4., min=0., max=32, step=0.01 uniform float _RandomSpeed; //value=3., min=0., max=8, step=0.01 uniform float _FrequencyZ; //value=.03, min=0.001, max=0.1, step=0.01 vec3 hash31(float p) { vec3 p3 = fract(p * vec3(.1031, .1030, .0973)); p3 += dot(p3, p3.yzx+19.19); return fract((p3.xxy+p3.yzz)*p3.zyx); } vec3 spectrum(in float d) { return smoothstep(0.25, 0., abs(d + vec3(0.125,0.,-0.125))); } void main() { vec3 color = vec3(0.); float z = iTime * _SpeedZ; float zOffset = z * _RandomSpeed; vec2 uv = gl_FragCoord.xy/iResolution - 0.5; uv.x *= iResolution.x / iResolution.y; vec3 ray = normalize(vec3(uv, 1.5)); float l = length(ray.xy); float r = 1.; for(int i = 0; i < 4; i++){ vec3 hit = (ray / abs(ray.x)) * r++; vec3 p = hit; p.z += z; float seed = p.x * 7. + p.y + 5.; //give bands uneven width p.y += sin(seed * 5.) * _BandSpacing; seed = (p.x + p.y) * _FrequencyY; vec3 rand = hash31(floor(seed)); //z animation p.z += (rand.x - 0.5) *-zOffset; //frequency in z p.z *= _FrequencyZ / (rand.y + 0.05); vec2 cell = fract(vec2(seed, p.z)) - 0.5; float b = rand.y; b *= smoothstep(0.5, 0., abs(cell.x)); b *= smoothstep(50., 10., length(hit)); b *= smoothstep(5., 2., abs(hit.y)); color += spectrum(cell.y) * b; } color = sqrt(color); color *= 1.3 - dot(uv, uv); fragColor = vec4(color,1.0); }