outline.glslf 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #version GLSL_VERSION
  2. #include <precision_statement.glslf>
  3. #include <std.glsl>
  4. #include <color_util.glslf>
  5. uniform sampler2D u_outline_src;
  6. uniform sampler2D u_outline_mask;
  7. uniform sampler2D u_outline_mask_blurred;
  8. uniform vec3 u_outline_color;
  9. uniform float u_draw_outline;
  10. /*==============================================================================
  11. SHADER INTERFACE
  12. ==============================================================================*/
  13. GLSL_IN vec2 v_texcoord;
  14. //------------------------------------------------------------------------------
  15. GLSL_OUT vec4 GLSL_OUT_FRAG_COLOR;
  16. /*==============================================================================
  17. MAIN
  18. ==============================================================================*/
  19. void main(void) {
  20. vec4 outline_src = GLSL_TEXTURE(u_outline_src, v_texcoord);
  21. GLSL_OUT_FRAG_COLOR = outline_src;
  22. if (u_draw_outline != 0.0) {
  23. vec4 outline_mask = GLSL_TEXTURE(u_outline_mask, v_texcoord);
  24. vec4 outline_mask_blurred = GLSL_TEXTURE(u_outline_mask_blurred, v_texcoord);
  25. float alpha_diff = outline_mask_blurred.a - outline_mask.a;
  26. if (alpha_diff != 0.0) {
  27. float outline_strength = smoothstep(0.0, 1.0, outline_mask_blurred.a);
  28. // NOTE: outlining outside object
  29. if (outline_mask.a == 0.0) {
  30. vec3 outline_color_srgb = u_outline_color;
  31. lin_to_srgb(outline_color_srgb);
  32. vec4 outline_color = vec4(clamp(outline_color_srgb, 0.0, 1.0), 1.0);
  33. GLSL_OUT_FRAG_COLOR = mix(outline_src, outline_color, outline_strength);
  34. }
  35. }
  36. }
  37. }