You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

47 lines
1.5 KiB

  1. define([
  2. ], function (
  3. ) {
  4. return `
  5. varying vec2 vTextureCoord;
  6. uniform sampler2D uSampler;
  7. uniform vec4 filterClamp;
  8. uniform float uAlpha;
  9. uniform vec2 uThickness;
  10. uniform vec4 uColor;
  11. uniform bool uKnockout;
  12. const float DOUBLE_PI = 2. * 3.14159265358979323846264;
  13. const float ANGLE_STEP = $angleStep$;
  14. float outlineMaxAlphaAtPos(vec2 pos) {
  15. if (uThickness.x == 0. || uThickness.y == 0.) {
  16. return 0.;
  17. }
  18. vec4 displacedColor;
  19. vec2 displacedPos;
  20. float maxAlpha = 0.;
  21. for (float angle = 0.; angle <= DOUBLE_PI; angle += ANGLE_STEP) {
  22. displacedPos.x = vTextureCoord.x + uThickness.x * cos(angle);
  23. displacedPos.y = vTextureCoord.y + uThickness.y * sin(angle);
  24. displacedColor = texture2D(uSampler, clamp(displacedPos, filterClamp.xy, filterClamp.zw));
  25. maxAlpha = max(maxAlpha, displacedColor.a);
  26. }
  27. return maxAlpha;
  28. }
  29. void main(void) {
  30. vec4 sourceColor = texture2D(uSampler, vTextureCoord);
  31. vec4 contentColor = sourceColor * float(!uKnockout);
  32. float outlineAlpha = uAlpha * outlineMaxAlphaAtPos(vTextureCoord.xy) * (1.-sourceColor.a);
  33. vec4 outlineColor = vec4(vec3(uColor) * outlineAlpha, outlineAlpha);
  34. gl_FragColor = contentColor + outlineColor;
  35. }
  36. `;
  37. });