78 lines
3.1 KiB
Plaintext
78 lines
3.1 KiB
Plaintext
shader_type canvas_item;
|
||
|
||
uniform bool time_slowed = false;
|
||
uniform float effect_mixture : hint_range(0.0, 1.0) = 0.0;
|
||
uniform float alpha_multiplier = 1.0;
|
||
uniform float color_offset = 0.0; // 颜色偏移值
|
||
|
||
uniform float glow_intensity = 1.2;
|
||
uniform float inner_glow_width = 0.5;
|
||
uniform float outer_glow_width = 2.0;
|
||
uniform float pulse_speed = 2.0;
|
||
uniform float pulse_strength = 0.2;
|
||
uniform bool high_quality = true; // 性能开关
|
||
|
||
// HSV转RGB函数
|
||
vec3 hsv2rgb(vec3 c) {
|
||
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
|
||
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
|
||
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
|
||
}
|
||
|
||
void fragment() {
|
||
vec4 texture_color = texture(TEXTURE, UV);
|
||
|
||
if (texture_color.a > 0.0) {
|
||
vec3 blue_base = vec3(0.2, 0.6, 1.5);
|
||
float luminance = dot(texture_color.rgb, vec3(0.299, 0.587, 0.114));
|
||
|
||
// 脉冲动画效果
|
||
float pulse = (sin(TIME * pulse_speed) * 0.5 + 0.5) * pulse_strength;
|
||
|
||
// 内发光效果
|
||
float inner_glow = pow(luminance, inner_glow_width) * glow_intensity;
|
||
|
||
// 外发光效果
|
||
float outer_glow = 0.0;
|
||
if (high_quality) {
|
||
// 高质量模式 - 完整采样
|
||
vec2 size = 1.0 / TEXTURE_PIXEL_SIZE;
|
||
vec2 pixel_size = 1.0 / size;
|
||
for(float x = -outer_glow_width; x <= outer_glow_width; x += 1.0) {
|
||
for(float y = -outer_glow_width; y <= outer_glow_width; y += 1.0) {
|
||
vec2 offset = vec2(x, y) * pixel_size;
|
||
float sample_alpha = texture(TEXTURE, UV + offset).a;
|
||
float distance = length(vec2(x, y)) / outer_glow_width;
|
||
outer_glow += sample_alpha * (1.0 - distance);
|
||
}
|
||
}
|
||
outer_glow = outer_glow / (outer_glow_width * outer_glow_width * 4.0);
|
||
} else {
|
||
// 性能模式 - 简化采样
|
||
float sample_distance = outer_glow_width * 0.5;
|
||
vec2 pixel_size = 1.0 / (1.0 / TEXTURE_PIXEL_SIZE);
|
||
for(float i = 0.0; i < 4.0; i++) {
|
||
float angle = i * PI * 0.5;
|
||
vec2 offset = vec2(cos(angle), sin(angle)) * sample_distance * pixel_size;
|
||
outer_glow += texture(TEXTURE, UV + offset).a;
|
||
}
|
||
outer_glow = outer_glow * 0.25;
|
||
}
|
||
|
||
float total_glow = inner_glow + outer_glow + pulse;
|
||
|
||
// 基于color_offset生成颜色,范围集中在黄色系
|
||
float hue = fract(color_offset) * 0.4 + 0.1; // 0.1-0.5范围,集中在黄色区域
|
||
vec3 rainbow_color = hsv2rgb(vec3(hue, 0.9, 0.95)); // 高饱和度,稍微降低亮度
|
||
|
||
// 混合发光效果
|
||
vec3 final_color = mix(blue_base, rainbow_color, total_glow);
|
||
final_color += rainbow_color * total_glow * 0.5;
|
||
|
||
// 最终颜色混合
|
||
vec3 mixed_color = mix(texture_color.rgb, final_color, effect_mixture);
|
||
COLOR = vec4(mixed_color, texture_color.a * alpha_multiplier);
|
||
} else {
|
||
COLOR = vec4(texture_color.rgb, texture_color.a * alpha_multiplier);
|
||
}
|
||
} |