#define pi 3.141592653589793238462643383279 #define twopi (pi * 2.0) varying vec2 uv; varying vec2 rcoords; uniform float circle_min; uniform float circle_max; uniform vec4 captureColor; uniform float capturePct; vec4 alphaBlend(vec4 dest, vec4 src) { float alpha = src.a + (dest.a * (1.0 - src.a)); return vec4( ((src.rgb * src.a) + (dest.rgb * dest.a * (1.0 - src.a))) / alpha, alpha); } void main() { float radius = length(rcoords); if(radius > circle_max || radius < circle_min) discard; vec4 result = gl_Color; result.a *= smoothstep(circle_min, circle_max, radius); //Dither the gradient float rnd = dot(rcoords, vec2(0.2,0.3)); result.a += mod(rnd/max(mod(uv.x,0.01)/0.01, 0.001), 0.01)-0.005; if(captureColor.a > 0.0) { vec2 rcoords = (uv - vec2(0.5, 0.5)) * 2.0; if(radius > 0.9 && radius < 1.0) { float ang = (atan(rcoords.y, rcoords.x) + pi) / twopi; if(ang < capturePct) { float alpha = smoothstep(1.0, 0.95, radius) * smoothstep(0.9, 0.95, radius); alpha *= smoothstep(0.0, 0.01, ang) * smoothstep(capturePct, capturePct - 0.01, ang); result = alphaBlend(result, vec4(captureColor.rgb, captureColor.a * alpha)); //result = mix( result, vec4(captureColor.rgb, 1.0), alpha * captureColor.a); } } } gl_FragColor = result; }