годот 2д спрайты шейдеры 3.

Сегодня я восстановлю структура программы 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. Спасибо за внимание!

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх