precision mediump float; uniform float u_time; uniform vec2 u_resolution; const float PI = 3.1415926535897932384626433832795; const vec2 zero = vec2(0.0); // const vec4 darker = vec4(0.0235, 0.0274, 0.0549, 1.0); // const vec4 lighter = vec4(0.1058, 0.1137, 0.1450, 1.0); const vec4 darker = vec4(0.01, 0.01, 0.01, 1.0); const vec4 lighter = vec4(0.05, 0.05, 0.05, 1.0); vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; } vec2 mod289(vec2 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; } vec3 permute(vec3 x) { return mod289(((x * 34.0) + 10.0) * x); } float snoise(vec2 v) { const vec4 C = vec4(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439); vec2 i = floor(v + dot(v, C.yy)); vec2 x0 = v - i + dot(i, C.xx); vec2 i1; i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); vec4 x12 = x0.xyxy + C.xxzz; x12.xy -= i1; i = mod289(i); vec3 p = permute(permute(i.y + vec3(0.0, i1.y, 1.0)) + i.x + vec3(0.0, i1.x, 1.0)); vec3 m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); m = m * m; m = m * m; vec3 x = 2.0 * fract(p * C.www) - 1.0; vec3 h = abs(x) - 0.5; vec3 ox = floor(x + 0.5); vec3 a0 = x - ox; m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); vec3 g; g.x = a0.x * x0.x + h.x * x0.y; g.yz = a0.yz * x12.xz + h.yz * x12.yw; return 130.0 * dot(m, g); } void main() { vec2 center = u_resolution / 2.0; // calculate coord scale factor float shortside = min(u_resolution.x, u_resolution.y); vec2 scale2square = u_resolution / vec2(shortside); // subtract center to avoid misalignment vec2 herescaled = ((gl_FragCoord.xy - center) / scale2square) + center; // get distance from center float dist = distance(herescaled, center); float distf = smoothstep(0.0, shortside, dist); // at lower clock values, we make vignette gradient denser // (at kinda slow rate for a breathing effect) float slowtime = u_time / 1.3; float timing = sin(slowtime) + 1.0; // map 0-1 timing value into a slight offset // (lower = farther out) float vig = distf + mix(-0.13, -0.1, timing); // get coords relative to center, and then get angle vec2 herer2c = herescaled - center; float angle = atan(herer2c.y, herer2c.x); // determine our offset based on this // so it looks wavy float slowtime2 = u_time / 1.2; float slowtime3 = u_time / 1.5; float off = 0.2 + (0.02 * sin(20.0 * angle + slowtime2)) * (1.4 * sin(10.0 * angle + slowtime3)); // apply cutoff if we are too close to center float vigc = (vig * step(off / 3.0, vig)) - off; // randomize noise pattern every second ish float fasttime = u_time * 1.1; float second = floor(fasttime); float noise = snoise(vec2(gl_FragCoord.x * gl_FragCoord.y, second)); // quantize vignette colors float vigq = floor((1.0 - vigc) * 13.0) / 13.0; // blend noise float final = vigq; gl_FragColor = mix(darker, lighter, final); // vec2 c = gl_FragCoord.xy - center; // gl_FragColor = vec4(vec3(smoothstep(-PI, PI, atan(c.y, c.x))), 1.0); }