shader.glsl 2.8 KB

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