shader.glsl 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. //shared data between vs/ps
  2. varying lowp vec4 result_color;
  3. varying mediump vec2 result_uv;
  4. varying mediump vec2 result_uv2;
  5. //SDF data
  6. uniform lowp vec4 sdf_outline_color;
  7. uniform mediump vec4 sdf_params;
  8. #ifdef VS
  9. uniform mediump mat4 mat;
  10. uniform mediump vec3 msk[4];
  11. attribute vec3 position;
  12. attribute vec4 color;
  13. attribute vec2 uv;
  14. attribute vec2 uv2;
  15. void program_main_vs()
  16. {
  17. gl_Position = mat * vec4(position, 1.0);
  18. result_color = color;
  19. result_uv = uv;
  20. #ifdef MASK
  21. mediump float a = dot(msk[0], vec3(1.0, position.x, position.y));
  22. mediump float b = dot(msk[1], vec3(1.0, position.x, position.y));
  23. result_uv2.x = dot(msk[2], vec3(1.0, a, b));
  24. result_uv2.y = dot(msk[3], vec3(1.0, a, b));
  25. #endif
  26. }
  27. #endif
  28. #ifdef PS
  29. uniform lowp vec4 clip_mask;
  30. uniform lowp sampler2D base_texture;
  31. uniform lowp sampler2D mask_texture;
  32. uniform lowp sampler2D alpha_texture;
  33. #ifdef SDF
  34. #define DONT_MULT_BY_RESULT_COLOR
  35. #endif
  36. lowp vec4 get_base()
  37. {
  38. lowp vec4 base = texture2D(base_texture, result_uv);
  39. #ifdef SEPARATE_ALPHA
  40. base.a = texture2D(alpha_texture, result_uv).r;
  41. #endif
  42. #ifdef MODIFY_BASE_PRE
  43. //define MODIFY_BASE_PRE and declare your own function modify_base_pre
  44. base = modify_base_pre(base);
  45. #endif
  46. #ifdef ALPHA_PREMULTIPLY
  47. base.rgb = base.rgb * base.a;
  48. #endif
  49. #ifdef MODIFY_BASE
  50. //define MODIFY_BASE and declare your own function modify_base
  51. base = modify_base(base);
  52. #endif
  53. return base;
  54. }
  55. lowp vec4 get_base_sdf()
  56. {
  57. lowp float tx = texture2D(base_texture, result_uv).r;
  58. #ifdef SDF_OUTLINE
  59. lowp float b = min((tx - sdf_params.z) * sdf_params.w, 1.0);
  60. lowp float a = clamp((tx - sdf_params.x) * sdf_params.y, 0.0, 1.0);
  61. lowp vec4 res = (sdf_outline_color + (result_color - sdf_outline_color)*a) * b;
  62. #else
  63. lowp float a = min((tx - sdf_params.x) * sdf_params.y, 1.0);
  64. lowp vec4 res = result_color * a;
  65. #endif
  66. return res;
  67. }
  68. lowp vec4 get_color()
  69. {
  70. #ifdef REPLACED_GET_BASE
  71. //define REPLACED_GET_BASE and declare your own function replaced_get_base()
  72. lowp vec4 base = replaced_get_base();
  73. #else
  74. # ifdef SDF
  75. lowp vec4 base = get_base_sdf();
  76. # else
  77. lowp vec4 base = get_base();
  78. # endif
  79. #endif
  80. #ifdef MASK
  81. mediump vec2 uv2 = clamp(result_uv2, clip_mask.xy, clip_mask.zw);
  82. lowp vec4 mask = texture2D(mask_texture, uv2);
  83. #ifdef MASK_R_CHANNEL
  84. lowp float mask_alpha = mask.r + 0.001;
  85. #else
  86. lowp float mask_alpha = mask.a + 0.001;
  87. #endif
  88. base = base * mask_alpha;
  89. #endif
  90. #ifdef DONT_MULT_BY_RESULT_COLOR
  91. //for your purposes
  92. return base;
  93. #else
  94. return base * result_color;
  95. #endif
  96. }
  97. void program_main_ps()
  98. {
  99. #ifdef REPLACED_GET_COLOR
  100. //define REPLACED_GET_COLOR and declare your own function replaced_get_color()
  101. gl_FragColor = replaced_get_color();
  102. #else
  103. gl_FragColor = get_color();
  104. #endif
  105. }
  106. #endif