1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
/*
* File: SmoothedDiscShader.frag.txt
* Shader for drawing of basic parameterized smoothed discs.
*
* Copyright 2016, Ian Andolina <http://github.com/iandol>, 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;
}
}
|