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

Разберем структуры программы 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.Конец

Спасибо за внимание! Мы восстановим данный пример с шейдерами в следующей главе

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

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

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