Newer
Older
DungeonShooting / DungeonShooting_Godot / resource / material / Blend.gdshader
  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.0;
  7. //透明度
  8. //uniform float alpha : hint_range(0.0, 1.0) = 1.0;
  9. uniform vec4 modulate : source_color = vec4(1.0, 1.0, 1.0, 1.0);
  10.  
  11. //------------------ 轮廓相关 --------------
  12. uniform bool show_outline = true;
  13. //轮廓颜色
  14. uniform vec4 outline_color : source_color = vec4(0.0, 0.0, 0.0, 1.0);
  15. //是否是彩虹轮廓
  16. uniform bool outline_rainbow = false;
  17. //彩虹轮廓变化周期
  18. const float frequency = 0.25;
  19. const float light_offset = 0.5;
  20.  
  21. void fragment() {
  22. //显示轮廓
  23. if (show_outline) {
  24. vec4 color = texture(TEXTURE, UV);
  25. vec2 size = TEXTURE_PIXEL_SIZE;
  26. float outline;
  27. outline = texture(TEXTURE, UV + vec2(-size.x, 0)).a;
  28. outline += texture(TEXTURE, UV + vec2(0, size.y)).a;
  29. outline += texture(TEXTURE, UV + vec2(size.x, 0)).a;
  30. outline += texture(TEXTURE, UV + vec2(0, -size.y)).a;
  31. outline = min(outline, 1.0);
  32. if (color.a == 0.0 && outline > 0.0) {
  33. vec4 animated_line_color = vec4(
  34. light_offset + sin(2.0 * 3.14 * frequency * TIME),
  35. light_offset + sin(2.0 * 3.14 * frequency * TIME + radians(120.0)),
  36. light_offset + sin(2.0 * 3.14 * frequency * TIME + radians(240.0)),
  37. 1.0
  38. );
  39.  
  40. if (outline_rainbow){
  41. COLOR = mix(color, animated_line_color, 1);
  42. } else {
  43. COLOR = mix(color, outline_color , 1);
  44. }
  45. }
  46. }
  47. vec4 col = mix(COLOR, blend, schedule);
  48. col = mix(vec4(0.0, 0.0, 0.0, 0.0), col, COLOR.a);
  49. col *= modulate;
  50. COLOR = col;
  51. }