Сегодня я восстановлю структура программы godot 2D Shaders for Sprites.годот 2д спрайты шейдеры 3.
Создам новый проект в Godot под названием 2D Shaders for Sprites experiments. На сцене размещу корневой узел Node2D, внутрь которого добавлю три спрайта Sprite2D и назначу им текстуры иконок
Сохраним сцену как sprite2dshaders.tscn. Сегодня мы разберём и используем три шейдера: aura.gdshader, blur.gdshader и silhouette.gdshader. Эти шейдеры соответственно создают свечение вокруг спрайта, размывают изображение и отображают только те области, где альфа-канал не равен нулю. Рассмотрим их предварительно
shader_type canvas_item;
render_mode blend_premul_alpha;
uniform float aura_width = 2.0;
uniform vec4 aura_color : source_color;
void fragment() {
vec4 col = texture(TEXTURE, UV);
vec2 ps = TEXTURE_PIXEL_SIZE;
float a;
float maxa = col.a;
float mina = col.a;
a = texture(TEXTURE, UV + vec2(0.0, -aura_width) * ps).a;
maxa = max(a, maxa);
mina = min(a, mina);
a = texture(TEXTURE, UV + vec2(0.0, aura_width) * ps).a;
maxa = max(a, maxa);
mina = min(a, mina);
a = texture(TEXTURE, UV + vec2(-aura_width, 0.0) * ps).a;
maxa = max(a, maxa);
mina = min(a, mina);
a = texture(TEXTURE, UV + vec2(aura_width, 0.0) * ps).a;
maxa = max(a, maxa);
mina = min(a, mina);
col.rgb *= col.a;
COLOR = col;
COLOR.rgb += aura_color.rgb * (maxa - mina);
}
В шейдере aura.gdshader проверяется разница между максимальным и минимальным значением альфа-канала в окрестности пикселя. Если maxa — mina = 1, это означает, что пиксель находится на границе спрайта, и к его цвету добавляется aura_color, создавая эффект свечения. В противном случае (maxa — mina = 0) цвет остаётся без изменений
Шейдер замыливания
shader_type canvas_item;
render_mode blend_mix;
uniform float radius = 4.0;
void fragment() {
vec4 col = texture(TEXTURE, UV);
vec2 ps = TEXTURE_PIXEL_SIZE;
col += texture(TEXTURE, UV + vec2(0.0, -radius) * ps);
col += texture(TEXTURE, UV + vec2(0.0, radius) * ps);
col += texture(TEXTURE, UV + vec2(-radius, 0.0) * ps);
col += texture(TEXTURE, UV + vec2(radius, 0.0) * ps);
col /= 5.0;
COLOR = col;
}
Шейдер blur.gdshader усредняет цвет текущего пикселя с цветами соседних пикселей — сверху, снизу, слева и справа. Это создаёт эффект размытия (замыливания) изображения
shader_type canvas_item;
render_mode blend_mix;
uniform vec4 modulate : source_color;
void fragment() {
COLOR = vec4(modulate.rgb, texture(TEXTURE, UV).a * modulate.a);
}
Шейдер silhouette.gdshader полностью заменяет цвет спрайта на заданный цвет модулятора (modulate), сохраняя при этом оригинальный альфа-канал. В результате форма объекта остаётся неизменной, но он окрашивается в один сплошной цвет, образуя силуэт
годот 2д спрайты шейдеры 3.Конец
Мы разобрали шейдеры и материалы спрайтов в проекте Godot 2D Shaders for Sprites. Спасибо за внимание!









