/* * File: SmoothedDiscShader.frag.txt * Shader for drawing of basic parameterized smoothed discs. * * Copyright 2016, Ian Andolina , licenced under the MIT Licence * */ const float halfpi = 0.5 * 3.141592654; uniform float Radius; uniform float Sigma; uniform float useAlpha; uniform float Method; uniform vec2 Center; float Dist; float Mod; varying vec4 baseColor; void main() { /* Query current output texel position: */ vec2 pos = gl_TexCoord[0].xy; /* find our distance from center */ Dist = distance(pos, Center); /* If distance to center (aka radius of pixel) > Radius, discard this pixel */ /* and only do this if we do not invert the alpha mask (Method == 2.0) if (Method < 2.0) { if (Dist > Radius) discard; } /* Calculate a smoothing modifier using our distance from radius and a Sigma */ if (Method < 1.0) { Mod = ((Sigma - (Radius - Dist)) / Sigma); Mod = clamp(Mod, 0.0, 1.0); Mod = cos(Mod * halfpi); } else if (Method == 1.0) { Mod = smoothstep(Radius,(Radius-Sigma),Dist); } /*we use smoothstep but invert our alpha so we can use the disc as a mask */ else if (Method == 2.0) { Mod = smoothstep(Radius,(Radius-Sigma),Dist); Mod = 1.0 - Mod; } /* Multiply/Modulate base color and alpha with calculated sine */ /* values, add some constant color/alpha Offset, assign as final fragment */ /* output color: */ if (useAlpha < 1.0) { gl_FragColor = baseColor; } else { gl_FragColor.rgb = baseColor.rgb; gl_FragColor.a = baseColor.a * Mod; } }