Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Шейдеры CanvasItem

Шейдеры CanvasItem используются для отрисовки всех 2D-элементов в Godot. К ним относятся все узлы, наследующие от CanvasItems, и все элементы графического интерфейса.

Шейдеры CanvasItem содержат меньше встроенных переменных и функциональных возможностей, чем шейдеры Spatial, но они сохраняют ту же базовую структуру с функциями вершинного, фрагментного и светового процессоров.

Режимы визуализации

Режим рендеринга

Описание

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 on light pass.

skіp_vertex_transform

VERTEX необходимо преобразовать вручную в функцию vertex.

wоrld_vertex_coords

VERTEX изменяется в мировых координатах, а не в локальных.

Встроенные функции

Значения, помеченные как "in", предназначены только для чтения. Значения, помеченные как "out", предназначены для необязательной записи и не обязательно будут содержать разумные значения. Значения, помеченные как "inout", содержат разумное значение по умолчанию и могут быть записаны по желанию. Сэмплеры не являются объектами записи и не помечаются.

Глобальные встроенные функции

Глобальные встроенные модули доступны везде, включая пользовательские функции.

Встроенный

Описание

in float TIME

Глобальное время с момента запуска движка, в секундах (всегда положительное). Оно зависит от настройки ролловера (по умолчанию это 3600 секунд). На него не влияет time_scale или пауза, но вы можете определить глобальную форму шейдера, чтобы добавить "масштабированную" переменную TIME, если хотите.

in float PI

Константа PI (3.141592). Отношение окружности круга к его диаметру и количество радианов в половине оборота.

in float TAU

Константа TAU (6.283185). Эквивалент PI * 2 и количество радианов в полном обороте.

in float E

Константа E (2,718281). Число Эйлера и основание натурального логарифма.

Вершинные встроенные константы

Данные вершин (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, также передаются во фрагментную функцию, если они не изменены.

При инстансировании переменная INSTANCE_CUSTOM содержит пользовательские данные экземпляра. При использовании частиц эта информация обычно является:

  • x: Угол поворота в радианах.

  • y: Фаза в течение жизни (от 0 до 1).

  • z: Кадр анимации.

Встроенный

Описание

mat4 MODEL_MATRIX

Трансформация локального пространства в мировое. Мировое пространство — это координаты, которые вы обычно используете в редакторе.

in mat4 CANVAS_MATRIX

Преобразование пространства мира в пространство холста. В пространстве холста началом координат является левый верхний угол экрана, а координаты варьируются от (0, 0) до размера области просмотра (вьюпорта).

in mat4 SCREEN_MATRIX

Пространство холста для обрезки пространства. В пространстве отсечения координаты от (-1, -1) до (1, 1).

in int INSTANCE_ID

Instance ID for instancing.

in vec4 INSTANCE_CUSTOM

Пользовательские данные экземпляра.

in bool AT_LIGHT_PASS

Всегда false.

in vec2 TEXTURE_PIXEL_SIZE

Нормализованный размер пикселя 2D-текстуры по умолчанию. Для Sprite2D с текстурой размером 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

inout vec2 VERTEX

Вершина, в локальном пространстве.

in int VERTEX_ID

Индекс текущей вершины в буфере вершин.

inout vec2 UV

Нормализованные координаты текстуры. Диапазон от 0 до 1.

inout vec4 COLOR

Цвет из вершин примитива.

inout float POINT_SIZE

Размер точки для отрисовки.

Фрагментные встроенные константы

Некоторые узлы (например, Sprite2Ds) отображают текстуру по умолчанию. Однако, когда к этим узлам прикрепляется пользовательская фрагментная функция, поиск текстуры приходится выполнять вручную. Godot предоставляет цвет текстуры во встроенной переменной COLOR, умноженной на цвет узла. Чтобы прочитать цвет текстуры самостоятельно, вы можете использовать:

COLOR = texture(TEXTURE, UV);

Аналогично, если карта нормалей используется в CanvasTexture, Godot использует её по умолчанию и присваивает её значение встроенной переменной NORMAL. Если вы используете карту нормалей, предназначенную для использования в 3D, она будет отображаться инвертированной. Чтобы использовать её в шейдере, вы должны присвоить её свойству NORMALMAP. Godot сам преобразует её для использования в 2D и перезапишет NORMAL.

NORMALMAP = texture(NORMAL_TEXTURE, UV).rgb;

Встроенный

Описание

vec4 FRAGCOORD

Coordinate of pixel center. In screen space. xy specifies position in window. Origin is lower-left.

in vec2 SCREEN_PIXEL_SIZE

Размер отдельных пикселей. Равно обратному разрешению.

vec2 POINT_COORD

Координаты для отрисовки точек.

sampler2D TEXTURE

2D текстура по умолчанию.

in vec2 TEXTURE_PIXEL_SIZE

Нормализованный размер пикселя 2D-текстуры по умолчанию. Для Sprite2D с текстурой размером 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

in bool AT_LIGHT_PASS

Всегда false.

sampler2D SPECULAR_SHININESS_TEXTURE

Текстура зеркального блеска этого объекта.

in vec4 SPECULAR_SHININESS

Цвет зеркального блеска, взятый из текстуры.

vec2 UV

UV из вершинной (vertex) функции.

vec2 SCREEN_UV

Экранная UV-координата для текущего пикселя.

sampler2D SCREEN_TEXTURE

Убрано в Godot 4. Вместо этого используйте sampler2D с hint_screen_texture.

inout vec3 NORMAL

Чтение нормали из NORMAL_TEXTURE. Возможна запись.

sampler2D NORMAL_TEXTURE

2D текстура нормали по умолчанию.

out vec3 NORMAL_MAP

Настраивает карты нормалей, предназначенные для 3D, для использования в 2D. Если используется, переопределяет NORMAL.

out float NORMAL_MAP_DEPTH

Глубина карты нормалей для масштабирования.

inout vec2 VERTEX

Позиция пикселя в экранном пространстве.

inout vec2 SHADOW_VERTEX

Аналогичен VERTEX, но может быть записан для изменения теней.

inout vec3 LIGHT_VERTEX

Аналогичен VERTEX, но может быть записан для изменения освещения. Компонент Z представляет собой высоту.

inout vec4 COLOR

Цвет из вершинной функции, умноженный на цвет TEXTURE. Также выводит значение цвета.

Встроенные константы шейдеров света

Функции светового процессора в Godot 4.x работают иначе, чем в Godot 3.x. В Godot 4.x всё освещение выполняется во время обычного прохода отрисовки. Другими словами, Godot больше не рисует объект заново для каждого освещения.

Используйте render_mode unshaded, если вы не хотите запускать функцию обработки света. Используйте render_mode light_only, если вы хотите видеть только влияние освещения на объект; это может быть полезно, когда вы хотите, чтобы объект был виден только там, где он освещён.

Если вы определите функцию освещения, она заменит встроенную функцию освещения, даже если ваша функция освещения пуста.

Ниже приведён пример шейдера света (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

Coordinate of pixel center. In screen space. xy specifies position in window. Origin is lower-left.

in vec3 NORMAL

Вход нормали.

vec4 COLOR

Цвет ввода. Это результат фрагментной функции.

vec2 UV

UV из вершинной функции, что эквивалентно UV во фрагментной функции.

sampler2D TEXTURE

Текущая текстура, используемая для CanvasItem.

in vec2 TEXTURE_PIXEL_SIZE

Нормализованный размер пикселя TEXTURE. Для Sprite2D с TEXTURE размером 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

vec2 SCREEN_UV

Экранная UV-координата для текущего пикселя.

vec2 POINT_COORD

UV for Point Sprite.

in vec4 LIGHT_COLOR

Цвет Света, умноженный на текстуру Света.

in float LIGHT_ENERGY

Мультипликатор энергии света.

in vec3 LIGHT_POSITION

Положение света в пространстве экрана. При использовании DirectionalLight2D это всегда vec3(0,0,0).

in vec3 LIGHT_DIRECTION

Направление света в экранном пространстве.

in bool LIGHT_IS_DIRECTIONAL

true, если этот проход является DirectionalLight2D.

in vec3 LIGHT_VERTEX

Положение пикселя в пространстве экрана, изменённое во фрагментной функции.

inout vec4 LIGHT

Выходной цвет для этого источника света.

in vec4 SPECULAR_SHININESS

Зеркальный блеск, заданный текстурой объекта.

out vec4 SHADOW_MODULATE

Умножение теней, отбрасываемые в этой точке, на этот цвет.

SDF функции

Для выборки автоматически сгенерированной текстуры Signed Distance Field (поле расстояния со знаком) реализовано несколько дополнительных функций. Эти функции доступны для функций Fragment и Light шейдеров CanvasItem.

Поле расстояния со знаком генерируется из узлов 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.