precision mediump float; varying vec2 uv; uniform vec3 uColor; uniform sampler2D texture0; uniform float uWidth; uniform float uEdge; uniform float uOutlineWidth; uniform float uOutlineEdge; uniform vec2 uOutlineOffset; uniform vec3 uOutlineColor; void main() { float distance = 1.0 - texture2D(texture0, uv).a; float alpha = 1.0 - smoothstep(uWidth, uWidth + uEdge, distance); float distanceOutline = 1.0 - texture2D(texture0, uv + uOutlineOffset).a; float alphaOutline = 1.0 - smoothstep(uOutlineWidth, uOutlineWidth + uOutlineEdge, distanceOutline); float overallAlpha = alpha + (1.0 - alpha) * alphaOutline; vec3 overallColor = mix(uOutlineColor, uColor, alpha / overallAlpha); gl_FragColor = vec4(overallColor, overallAlpha); }