Разберем структуры программы godot 2D Shaders for Sprites.годот 2д спрайты шейдеры 2.
Программа построена на основе узла Node2D, внутри которого размещены спрайты Sprite2D с назначенными шейдерами в материалах каждого спрайта
Теперь разберём некоторые из этих шейдеров, например — outline.gdshader. Этот шейдер добавляет контур (обводку) вокруг спрайта
shader_type canvas_item;
uniform float outline_width = 2.0;
uniform vec4 outline_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, -outline_width) * ps).a;
maxa = max(a, maxa);
mina = min(a, mina);
a = texture(TEXTURE, UV + vec2(0.0, outline_width) * ps).a;
maxa = max(a, maxa);
mina = min(a, mina);
a = texture(TEXTURE, UV + vec2(-outline_width, 0.0) * ps).a;
maxa = max(a, maxa);
mina = min(a, mina);
a = texture(TEXTURE, UV + vec2(outline_width, 0.0) * ps).a;
maxa = max(a, maxa);
mina = min(a, mina);
COLOR = mix(col, outline_color, maxa - mina);
}
Шейдер outline.gdshader анализирует значение альфа-канала (прозрачность) каждого пикселя. На границе контура разница прозрачностей соседних пикселей равна 1, во всех остальных областях — 0. Если разница альфа-значений равна 1, функция mix возвращает цвет обводки (outline_color); в противном случае возвращается исходный цвет пикселя (col). Теперь рассмотрим следующий шейдер — fatty.gdshader
shader_type canvas_item;
render_mode blend_mix;
uniform float fattyness = 2.0;
void fragment() {
vec2 ruv = UV - vec2(0.5, 0.5);
vec2 dir = normalize(ruv);
float len = length(ruv);
len = pow(len * 2.0, fattyness) * 0.5;
ruv = len * dir;
vec4 col = texture(TEXTURE, ruv + vec2(0.5, 0.5));
COLOR = col;
}
В начале работы шейдер преобразует координаты пикселей из декартовой системы в полярную (радиус и угол) с центром в середине изображения. Затем пиксели нелинейно искажаются от центра к краям, создавая эффект линзы. После этого координаты преобразуются обратно в декартову систему
shader_type canvas_item;
render_mode blend_mix;
uniform float amount = 20.0;
void fragment() {
vec2 uv = UV * 0.05;
float a = fract(sin(dot(UV, vec2(12.9898, 78.233))) * 438.5453);
vec4 col = texture(TEXTURE, UV);
col.a *= pow(a, amount);
COLOR = col;
}
Этот шейдер генерирует шум, который воздействует на альфа-канал пикселя, изменяя его прозрачность
годот 2д спрайты шейдеры 2.Конец
Спасибо за внимание! Мы восстановим данный пример с шейдерами в следующей главе
