attribute mediump vec3 aPosition; attribute mediump vec2 aTexCoord; uniform mediump mat4 uMvpMatrix; uniform lowp vec4 uColor; uniform lowp vec4 uTextColor; uniform lowp vec4 uGradientColor; uniform mediump vec4 uGradientLine; uniform mediump vec2 uInvTextSize; varying mediump vec2 vTexCoord; varying lowp vec4 vColor; void main() { gl_Position = uMvpMatrix * vec4(aPosition, 1.0); vTexCoord = aTexCoord; lowp float f = dot( aPosition.xy * uInvTextSize - uGradientLine.xy, uGradientLine.zw ); vColor = mix(uTextColor, uGradientColor, f); } uniform mediump sampler2D sTexture; uniform lowp vec4 uColor; uniform highp vec2 uSmoothing; uniform highp vec2 uOutline; uniform lowp vec4 uOutlineColor; uniform highp float uGlow; uniform lowp vec4 uGlowColor; varying mediump vec2 vTexCoord; varying lowp vec4 vColor; void main() { // sample distance field mediump float distance = texture2D(sTexture, vTexCoord).a; // blend fragment color between outline color and text color mediump float outlineBlend = smoothstep(uOutline[0], uOutline[1], distance); lowp vec4 clampedColor = clamp( vColor, 0.0, 1.0 ); // create blend between text color and outline color using outlineBlend lowp vec4 outlineColor = vec4( uOutlineColor.rgb, uOutlineColor.a * clampedColor.a ); lowp vec4 color = mix(outlineColor, clampedColor, outlineBlend); mediump float glowBlend = smoothstep(uSmoothing[0], uSmoothing[1], distance); // blend fragment color between glow color and text color lowp vec4 glowColor = vec4( uGlowColor.rgb, uGlowColor.a * clampedColor.a ); color = mix(glowColor, color, glowBlend); // fade out glow between uSmoothing and uGlow color.a *= smoothstep(uGlow, uSmoothing[0], distance); // final color multiplied by Actor color gl_FragColor = uColor * color; }