|
- define([
-
- ], function (
-
- ) {
- return `
- varying vec2 vTextureCoord;
- uniform sampler2D uSampler;
- uniform vec4 filterClamp;
-
- uniform float uAlpha;
- uniform vec2 uThickness;
- uniform vec4 uColor;
- uniform bool uKnockout;
-
- const float DOUBLE_PI = 2. * 3.14159265358979323846264;
- const float ANGLE_STEP = $angleStep$;
-
- float outlineMaxAlphaAtPos(vec2 pos) {
- if (uThickness.x == 0. || uThickness.y == 0.) {
- return 0.;
- }
-
- vec4 displacedColor;
- vec2 displacedPos;
- float maxAlpha = 0.;
-
- for (float angle = 0.; angle <= DOUBLE_PI; angle += ANGLE_STEP) {
- displacedPos.x = vTextureCoord.x + uThickness.x * cos(angle);
- displacedPos.y = vTextureCoord.y + uThickness.y * sin(angle);
- displacedColor = texture2D(uSampler, clamp(displacedPos, filterClamp.xy, filterClamp.zw));
- maxAlpha = max(maxAlpha, displacedColor.a);
- }
-
- return maxAlpha;
- }
-
- void main(void) {
- vec4 sourceColor = texture2D(uSampler, vTextureCoord);
- vec4 contentColor = sourceColor * float(!uKnockout);
- float outlineAlpha = uAlpha * outlineMaxAlphaAtPos(vTextureCoord.xy) * (1.-sourceColor.a);
- vec4 outlineColor = vec4(vec3(uColor) * outlineAlpha, outlineAlpha);
- gl_FragColor = contentColor + outlineColor;
- }
- `;
- });
|