Newer
Older
DungeonShooting / DungeonShooting_Godot / resource / material / Blend.gdshader
@小李xl 小李xl on 29 Nov 2023 1 KB 更新翻滚动作
  1. shader_type canvas_item;
  2.  
  3. //混合颜色
  4. uniform vec4 blend : source_color = vec4(1.0, 1.0, 1.0, 1.0);
  5. //混合度
  6. uniform float schedule : hint_range(0.0, 1.0, 0.01) = 0.0;
  7. //
  8. uniform vec4 modulate : source_color = vec4(1.0, 1.0, 1.0, 1.0);
  9.  
  10. //------------------ 轮廓相关 --------------
  11. uniform bool show_outline = true;
  12. //轮廓颜色
  13. uniform vec4 outline_color : source_color = vec4(0.0, 0.0, 0.0, 1.0);
  14. //是否是彩虹轮廓
  15. uniform bool outline_rainbow = false;
  16. //轮廓是否使用 blend
  17. uniform bool outline_use_blend = true;
  18. //灰度
  19. uniform float grey : hint_range(0.0, 1.0, 0.01) = 0.0;
  20.  
  21. //彩虹轮廓变化周期
  22. const float frequency = 0.25;
  23. const float light_offset = 0.5;
  24.  
  25. void fragment() {
  26. float a = COLOR.a;
  27. //显示轮廓
  28. if (show_outline && a == 0.0) {
  29. vec2 size = TEXTURE_PIXEL_SIZE;
  30. float outline;
  31. outline = texture(TEXTURE, UV + vec2(-size.x, 0)).a;
  32. outline += texture(TEXTURE, UV + vec2(0, size.y)).a;
  33. outline += texture(TEXTURE, UV + vec2(size.x, 0)).a;
  34. outline += texture(TEXTURE, UV + vec2(0, -size.y)).a;
  35. outline = min(outline, 1.0);
  36. if (outline > 0.0) {
  37. if (outline_rainbow){
  38. vec4 animated_line_color = vec4(
  39. light_offset + sin(2.0 * 3.14 * frequency * TIME),
  40. light_offset + sin(2.0 * 3.14 * frequency * TIME + radians(120.0)),
  41. light_offset + sin(2.0 * 3.14 * frequency * TIME + radians(240.0)),
  42. 1.0
  43. );
  44. COLOR = mix(COLOR, animated_line_color, 1);
  45. a = animated_line_color.a;
  46. } else {
  47. COLOR = mix(COLOR, outline_color , 1);
  48. a = outline_color.a;
  49. }
  50. }
  51. if (outline_use_blend) {
  52. COLOR = mix(COLOR, blend, schedule);
  53. }
  54. } else { //非轮廓
  55. COLOR = mix(COLOR, blend, schedule);
  56. //灰度
  57. float grayColor = dot(COLOR.rgb, vec3(0.299, 0.587, 0.114));
  58. COLOR.rgb = mix(COLOR.rgb, vec3(grayColor), grey);
  59. }
  60. COLOR.a *= a;
  61. COLOR *= modulate;
  62. }