Шейдеры CanvasItem
Шейдеры CanvasItem используются для отрисовки всех 2D-элементов в Godot. К ним относятся все узлы, наследующие от CanvasItems, и все элементы графического интерфейса.
Шейдеры CanvasItem содержат меньше встроенных переменных и функциональных возможностей, чем Spatial shaders, но они поддерживают ту же базовую структуру с функциями вершинного, фрагментного и светового процессора.
Режимы визуализации
Режим рендеринга |
Описание |
|---|---|
blеnd_mix |
Режим смешивания (альфа как прозрачность), по умолчанию. |
blеnd_add |
Аддитивный режим наложения. |
blеnd_sub |
Режим наложения с вычитанием. |
blеnd_mul |
Режим наложения с умножением. |
blеnd_premul_alpha |
Режим наложения альфа с предварительным умножением. |
blend_disabled |
Отключить смешивание, значения (в том числе альфа) записываются как есть. |
unshadеd |
В результате получается просто альбедо. Никакого освещения/затенения в материале не происходит. |
lіght_only |
Only draw in the light pass. |
skіp_vertex_transform |
|
wоrld_vertex_coords |
|
Встроенные функции
Значения, отмеченные как in, доступны только для чтения. Значения, отмеченные как out, могут быть записаны и не обязательно содержат осмысленные значения. Значения, отмеченные как inout, предоставляют осмысленное значение по умолчанию и могут быть записаны. Сэмплеры не могут быть записаны, поэтому они не отмечены.
Не все встроенные функции доступны во всех функциях обработки. Для доступа к встроенной функции вершины из функции fragment() можно использовать varying. То же самое относится к доступу к встроенным функциям фрагментов из функции light().
Глобальные встроенные функции
Глобальные встроенные модули доступны везде, включая пользовательские функции.
Встроенный |
Описание |
|---|---|
в плавающем TIME |
Global time since the engine has started, in seconds. It repeats after every |
в float PI |
A |
в float TAU |
A |
В float E |
An |
Вершинные встроенные константы
Данные вершин (VERTEX) представлены в локальном пространстве (пиксельные координаты, относительно начала координат Node2D). Если не записывать эти значения, то они не будут изменены и будут переданы в том виде, в котором пришли.
Пользователь может отключить встроенную модель для преобразования мира (мир на экран и проецирование все равно произойдет позже) и сделать это вручную с помощью следующего кода:
shader_type canvas_item;
render_mode skip_vertex_transform;
void vertex() {
VERTEX = (MODEL_MATRIX * vec4(VERTEX, 0.0, 1.0)).xy;
}
Другие встроенные функции, такие как UV и COLOR, также передаются в функцию fragment(), если они не изменены.
Для создания экземпляров переменная INSTANCE_CUSTOM содержит пользовательские данные экземпляра. При использовании частиц эта информация обычно выглядит следующим образом:
x: Угол поворота в радианах.
y: Фаза в течение жизни (от
0.0до1.0).z: Кадр анимации.
Встроенный |
Описание |
|---|---|
mat4 MODEL_MATRIX |
Трансформация локального пространства в мировое. Мировое пространство — это координаты, которые вы обычно используете в редакторе. |
in mat4 CANVAS_MATRIX |
World space to canvas space transform. In canvas
space the origin is the upper-left corner of the
screen and coordinates range from |
in mat4 SCREEN_MATRIX |
Canvas space to clip space transform. In clip space
coordinates range from |
in int INSTANCE_ID |
Идентификатор экземпляра для создания экземпляра. |
в vec4 INSTANCE_CUSTOM |
Пользовательские данные экземпляра. |
in bool AT_LIGHT_PASS |
Всегда |
in vec2 TEXTURE_PIXEL_SIZE |
Normalized pixel size of the default 2D texture.
For a Sprite2D with a texture of size 64x32px,
TEXTURE_PIXEL_SIZE = |
inout vec2 VERTEX |
Положение вершины в локальном пространстве. |
в int VERTEX_ID |
Индекс текущей вершины в буфере вершин. |
inout vec2 UV |
Нормализованные текстурные координаты. Диапазон от |
inout vec4 COLOR |
Color from vertex primitive multiplied by the CanvasItem's modulate multiplied by CanvasItem's self_modulate. |
inout float POINT_SIZE |
Размер точки для отрисовки. |
in vec4 CUSTOM0 |
Пользовательское значение из примитива вершины. |
in vec4 CUSTOM1 |
Пользовательское значение из примитива вершины. |
Фрагментные встроенные константы
COLOR и TEXTURE
Встроенная переменная COLOR используется для нескольких целей:
В функции
vertex()COLORсодержит цвет из примитива вершины, умноженный на modulate CanvasItem, умноженный на self_modulate CanvasItem.В функции
fragment()входное значениеCOLOR— это то же значение, умноженное на цвет из значения по умолчаниюTEXTURE(если оно присутствует).В функции
fragment()COLORтакже является конечным результатом.
Некоторые узлы (например, Sprite2D) отображают текстуру по умолчанию, например, texture. При использовании пользовательской функции fragment() у вас есть несколько вариантов выбора этой текстуры.
Чтобы прочитать только содержимое текстуры по умолчанию, игнорируя вершину COLOR:
void fragment() {
COLOR = texture(TEXTURE, UV);
}
Чтобы прочитать содержимое текстуры по умолчанию, умноженное на COLOR вершины:
void fragment() {
// Equivalent to an empty fragment() function, since COLOR is also the output variable.
COLOR = COLOR;
}
Чтобы прочитать только вершину COLOR в fragment(), игнорируя основную текстуру, необходимо передать COLOR как varying, а затем прочитать ее в fragment():
varying vec4 vertex_color;
void vertex() {
vertex_color = COLOR;
}
void fragment() {
COLOR = vertex_color;
}
NORMAL
Аналогично, если в CanvasTexture используется карта нормалей, Godot использует её по умолчанию и присваивает её значение встроенной переменной NORMAL. Если вы используете карту нормалей, предназначенную для использования в 3D, она будет отображаться инвертированной. Чтобы использовать её в шейдере, необходимо присвоить её свойству NORMAL_MAP. Godot преобразует её для использования в 2D и перезапишет NORMAL.
NORMAL_MAP = texture(NORMAL_TEXTURE, UV).rgb;
Встроенный |
Описание |
|---|---|
vec4 FRAGCOORD |
Координата центра пикселя. В экранном пространстве. |
in vec2 SCREEN_PIXEL_SIZE |
Size of individual pixels. Equal to the inverse of resolution. |
in vec4 REGION_RECT |
Видимая область области спрайта в формате |
vec2 POINT_COORD |
Координаты для отрисовки точек. |
sampler2D TEXTURE |
2D текстура по умолчанию. |
in vec2 TEXTURE_PIXEL_SIZE |
Normalized pixel size of the default 2D texture.
For a Sprite2D with a texture of size 64x32px,
|
in bool AT_LIGHT_PASS |
Всегда |
sampler2D SPECULAR_SHININESS_TEXTURE |
Текстура зеркального блеска этого объекта. |
in vec4 SPECULAR_SHININESS |
Цвет зеркального блеска, взятый из текстуры. |
vec2 UV |
UV from the |
vec2 SCREEN_UV |
Screen UV coordinate for the current pixel. |
sampler2D SCREEN_TEXTURE |
Убрано в Godot 4. Вместо этого используйте |
inout vec3 NORMAL |
Нормальное чтение из |
sampler2D NORMAL_TEXTURE |
2D текстура нормали по умолчанию. |
out vec3 NORMAL_MAP |
Настраивает карты нормалей, предназначенные для 3D, для использования в 2D. При использовании переопределяет |
out float NORMAL_MAP_DEPTH |
Нормальная глубина карты для масштабирования. |
inout vec2 VERTEX |
Позиция пикселя в экранном пространстве. |
inout vec2 SHADOW_VERTEX |
Аналогичен |
inout vec3 LIGHT_VERTEX |
Аналогичен |
inout vec4 COLOR |
|
Встроенные константы шейдеров света
Функции светового процессора в Godot 4.x работают иначе, чем в Godot 3.x. В Godot 4.x всё освещение выполняется во время обычного прохода отрисовки. Другими словами, Godot больше не рисует объект заново для каждого освещения.
Используйте режим рендеринга unshaded, если вы не хотите, чтобы функция light() запускалась. Используйте режим рендеринга light_only, если вы хотите увидеть только влияние освещения на объект; это может быть полезно, когда вы хотите, чтобы объект был виден только там, где он освещается.
Если вы определите функцию light(), она заменит встроенную функцию освещения, даже если ваша функция освещения пуста.
Ниже приведён пример шейдера света (light), который учитывает карту нормалей CanvasItem:
void light() {
float cNdotL = max(0.0, dot(NORMAL, LIGHT_DIRECTION));
LIGHT = vec4(LIGHT_COLOR.rgb * COLOR.rgb * LIGHT_ENERGY * cNdotL, LIGHT_COLOR.a);
}
Встроенный |
Описание |
|---|---|
vec4 FRAGCOORD |
Координата центра пикселя. В экранном пространстве. |
in vec3 NORMAL |
Input normal. |
vec4 COLOR |
Input color. Это результат функции |
vec2 UV |
UV из функции |
sampler2D TEXTURE |
Current texture in use for the CanvasItem. |
in vec2 TEXTURE_PIXEL_SIZE |
Нормализованный размер пикселя |
vec2 SCREEN_UV |
Screen UV coordinate for the current pixel. |
vec2 POINT_COORD |
UV для Точечного Спрайта. |
in vec4 LIGHT_COLOR |
Color источника Light2D. Если источник света — это источник PointLight2D, умноженный на его текстуру texture. |
in float LIGHT_ENERGY |
Energy multiplier для Light2D. |
in vec3 LIGHT_POSITION |
Положение Light2D в экранном пространстве. При использовании DirectionalLight2D это всегда |
in vec3 LIGHT_DIRECTION |
Направление Light2D в экранном пространстве. |
in bool LIGHT_IS_DIRECTIONAL |
|
in vec3 LIGHT_VERTEX |
Положение пикселя в экранном пространстве, измененное в функции |
inout vec4 LIGHT |
Выходной цвет для этого Light2D. |
in vec4 SPECULAR_SHININESS |
Зеркальный блеск, заданный текстурой объекта. |
out vec4 SHADOW_MODULATE |
Умножение теней, отбрасываемые в этой точке, на этот цвет. |
SDF функции
There are a few additional functions implemented to sample an automatically
generated Signed Distance Field texture. These functions are available in the fragment()
and light() functions of CanvasItem shaders. Custom functions may also use them as long
as they are called from supported functions.
Поле расстояния со знаком генерируется из узлов LightOccluder2D, присутствующих в сцене с включенным свойством SDF Collision (по умолчанию). Дополнительную информацию см. в документации 2D lights and shadows.
Функция |
Описание |
|---|---|
float texture_sdf (vec2 sdf_pos) |
Выполняет поиск текстуры SDF. |
vec2 texture_sdf_normal (vec2 sdf_pos) |
Вычисляет нормаль из текстуры SDF. |
vec2 sdf_to_screen_uv (vec2 sdf_pos) |
Преобразует SDF в UV-экран. |
vec2 screen_uv_to_sdf (vec2 uv) |
Преобразует UV-изображение экрана в SDF. |