Newer
Older
DungeonShooting / DungeonShooting_Godot / resource / material / Blend.gdshader
@小李xl 小李xl on 21 Nov 2023 1 KB 第二种敌人死亡动画
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.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;
}