Newer
Older
DungeonShooting / DungeonShooting_Godot / resource / shader / Sawtooth.gdshader
@小李xl 小李xl on 8 Apr 2024 3 KB 优化液体shader
  1. shader_type canvas_item;
  2.  
  3. bool checkLB(float len, sampler2D tex, vec2 uv) {
  4. int c = 0;
  5. int c2 = 0;
  6. if (texture(tex, uv + vec2(-len, 0.0)).a > 0.0) {
  7. c++;
  8. c2 += 1;
  9. } else if (texture(tex, uv + vec2(-len * 2.0, 0.0)).a > 0.0) {
  10. c++;
  11. c2 += 2;
  12. }
  13. if (c > 0) {
  14. if (texture(tex, uv + vec2(0.0, -len)).a > 0.0) {
  15. c++;
  16. c2 += 1;
  17. } else if (texture(tex, uv + vec2(0.0, -len * 2.0)).a > 0.0) {
  18. c++;
  19. c2 += 2;
  20. }
  21. }
  22. return c >= 2 && c2 <= 3;
  23. }
  24.  
  25. bool checkLT(float len, sampler2D tex, vec2 uv) {
  26. int c = 0;
  27. int c2 = 0;
  28. if (texture(tex, uv + vec2(-len, 0.0)).a > 0.0) {
  29. c++;
  30. c2 += 1;
  31. } else if (texture(tex, uv + vec2(-len * 2.0, 0.0)).a > 0.0) {
  32. c++;
  33. c2 += 2;
  34. }
  35. if (c > 0) {
  36. if (texture(tex, uv + vec2(0.0, len)).a > 0.0) {
  37. c++;
  38. c2 += 1;
  39. } else if (texture(tex, uv + vec2(0.0, len * 2.0)).a > 0.0) {
  40. c++;
  41. c2 += 2;
  42. }
  43. }
  44. return c >= 2 && c2 <= 3;
  45. }
  46.  
  47. bool checkRB(float len, sampler2D tex, vec2 uv) {
  48. int c = 0;
  49. int c2 = 0;
  50. if (texture(tex, uv + vec2(len, 0.0)).a > 0.0) {
  51. c++;
  52. c2 += 1;
  53. } else if (texture(tex, uv + vec2(len * 2.0, 0.0)).a > 0.0) {
  54. c++;
  55. c2 += 2;
  56. }
  57. if (c > 0) {
  58. if (texture(tex, uv + vec2(0.0, -len)).a > 0.0) {
  59. c++;
  60. c2 += 1;
  61. } else if (texture(tex, uv + vec2(0.0, -len * 2.0)).a > 0.0) {
  62. c++;
  63. c2 += 2;
  64. }
  65. }
  66. return c >= 2 && c2 <= 3;
  67. }
  68.  
  69. bool checkRT(float len, sampler2D tex, vec2 uv) {
  70. int c = 0;
  71. int c2 = 0;
  72. if (texture(tex, uv + vec2(len, 0.0)).a > 0.0) {
  73. c++;
  74. c2 += 1;
  75. } else if (texture(tex, uv + vec2(len * 2.0, 0.0)).a > 0.0) {
  76. c++;
  77. c2 += 2;
  78. }
  79. if (c > 0) {
  80. if (texture(tex, uv + vec2(0.0, len)).a > 0.0) {
  81. c++;
  82. c2 += 1;
  83. } else if (texture(tex, uv + vec2(0.0, len * 2.0)).a > 0.0) {
  84. c++;
  85. c2 += 2;
  86. }
  87. }
  88. return c >= 2 && c2 <= 3;
  89. }
  90.  
  91.  
  92. void vertex() {
  93. VERTEX = VERTEX * vec2(4.0);
  94. }
  95.  
  96. void fragment() {
  97. if (COLOR.a <= 0.0) {
  98. int c = 0;
  99. vec4 cf = vec4(0.0, 0.0, 0.0, 0.0);
  100. vec4 cL = texture(TEXTURE, UV + vec2(-TEXTURE_PIXEL_SIZE.x, 0.0));
  101. vec4 cr = texture(TEXTURE, UV + vec2(TEXTURE_PIXEL_SIZE.x, 0.0));
  102. vec4 ct = texture(TEXTURE, UV + vec2(0.0, TEXTURE_PIXEL_SIZE.y));
  103. vec4 cb = texture(TEXTURE, UV + vec2(0.0, -TEXTURE_PIXEL_SIZE.y));
  104. if (cL.a > 0.0) {
  105. c++;
  106. cf += cL;
  107. }
  108. if (cr.a > 0.0) {
  109. c++;
  110. cf += cr;
  111. }
  112. if (ct.a > 0.0) {
  113. c++;
  114. cf += ct;
  115. }
  116. if (cb.a > 0.0) {
  117. c++;
  118. cf += cb;
  119. }
  120. if (c >= 2) {
  121. if (cb.a > 0.0 && cL.a > 0.0) {
  122. if (checkLB(TEXTURE_PIXEL_SIZE.y / 4.0, TEXTURE, UV)) {
  123. cf /= float(c);
  124. COLOR = cf;
  125. }
  126. }
  127. if (ct.a > 0.0 && cL.a > 0.0) {
  128. if (checkLT(TEXTURE_PIXEL_SIZE.y / 4.0, TEXTURE, UV)) {
  129. cf /= float(c);
  130. COLOR = cf;
  131. }
  132. }
  133.  
  134. if (cb.a > 0.0 && cr.a > 0.0) {
  135. if (checkRB(TEXTURE_PIXEL_SIZE.y / 4.0, TEXTURE, UV)) {
  136. cf /= float(c);
  137. COLOR = cf;
  138. }
  139. }
  140. if (ct.a > 0.0 && cr.a > 0.0) {
  141. if (checkRT(TEXTURE_PIXEL_SIZE.y / 4.0, TEXTURE, UV)) {
  142. cf /= float(c);
  143. COLOR = cf;
  144. }
  145. }
  146. }
  147. } else {
  148. int c = 0;
  149. float tempV = TEXTURE_PIXEL_SIZE.x / 4.0;
  150. vec4 cf = vec4(0.0, 0.0, 0.0, 0.0);
  151. vec4 clt = texture(TEXTURE, UV + vec2(-tempV, tempV));
  152. vec4 crt = texture(TEXTURE, UV + vec2(tempV, tempV));
  153. vec4 clb = texture(TEXTURE, UV + vec2(-tempV, -tempV));
  154. vec4 crb = texture(TEXTURE, UV + vec2(tempV, -tempV));
  155. if (clt.a > 0.0) {
  156. c++;
  157. cf += clt;
  158. }
  159. if (crt.a > 0.0) {
  160. c++;
  161. cf += crt;
  162. }
  163. if (clb.a > 0.0) {
  164. c++;
  165. cf += clb;
  166. }
  167. if (crb.a > 0.0) {
  168. c++;
  169. cf += crb;
  170. }
  171. if (c > 0 && c < 2) {
  172. COLOR = vec4(0.0, 0.0, 0.0, 0.0);
  173. } else {
  174. COLOR = cf / float(c);
  175. }
  176. }
  177. }