- shader_type canvas_item;
-
- //混合颜色
- uniform vec4 blend : source_color = vec4(1.0, 1.0, 1.0, 1.0);
- //混合度
- uniform float schedule : hint_range(0.0, 1.0, 0.01) = 0.0;
- //
- uniform vec4 modulate : source_color = vec4(1.0, 1.0, 1.0, 1.0);
-
- //------------------ 轮廓相关 --------------
- uniform bool show_outline = true;
- //轮廓颜色
- uniform vec4 outline_color : source_color = vec4(0.0, 0.0, 0.0, 1.0);
- //是否是彩虹轮廓
- uniform bool outline_rainbow = false;
- //轮廓是否使用 blend
- uniform bool outline_use_blend = true;
- //灰度
- uniform float grey : hint_range(0.0, 1.0, 0.01) = 0.0;
-
- //彩虹轮廓变化周期
- const float frequency = 0.25;
- const float light_offset = 0.5;
-
- void fragment() {
- float a = COLOR.a;
- //显示轮廓
- if (show_outline && a == 0.0) {
- vec2 size = TEXTURE_PIXEL_SIZE;
- float outline;
- outline = texture(TEXTURE, UV + vec2(-size.x, 0)).a;
- outline += texture(TEXTURE, UV + vec2(0, size.y)).a;
- outline += texture(TEXTURE, UV + vec2(size.x, 0)).a;
- outline += texture(TEXTURE, UV + vec2(0, -size.y)).a;
- outline = min(outline, 1.0);
- if (outline > 0.0) {
- if (outline_rainbow){
- vec4 animated_line_color = vec4(
- light_offset + sin(2.0 * 3.14 * frequency * TIME),
- light_offset + sin(2.0 * 3.14 * frequency * TIME + radians(120.0)),
- light_offset + sin(2.0 * 3.14 * frequency * TIME + radians(240.0)),
- 1.0
- );
- COLOR = mix(COLOR, animated_line_color, 1);
- a = animated_line_color.a;
- } else {
- COLOR = mix(COLOR, outline_color , 1);
- a = outline_color.a;
- }
- }
-
- if (outline_use_blend) {
- COLOR = mix(COLOR, blend, schedule);
- }
- } else { //非轮廓
- COLOR = mix(COLOR, blend, schedule);
- //灰度
- float grayColor = dot(COLOR.rgb, vec3(0.299, 0.587, 0.114));
- COLOR.rgb = mix(COLOR.rgb, vec3(grayColor), grey);
- }
- COLOR.a *= a;
- COLOR *= modulate;
- }