Шейдеры 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

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

wоrld_vertex_coords

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

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

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

Не все встроенные функции доступны во всех функциях обработки. Для доступа к встроенной функции вершины из функции fragment() можно использовать varying. То же самое относится к доступу к встроенным функциям фрагментов из функции light().

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

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

Встроенный

Описание

в плавающем TIME

Global time since the engine has started, in seconds. It repeats after every 3,600 seconds (which can be changed with the rollover setting). It's affected by time_scale but not by pausing. If you need a TIME variable that is not affected by time scale, add your own global shader uniform and update it each frame.

в float PI

A PI constant (3.141592). The ratio of a circle's circumference to its diameter and the number of radians in a half turn.

в float TAU

A TAU constant (6.283185). Equivalent to PI * 2 and the number of radians in a full turn.

В float E

An E constant (2.718281). Euler's number, the base of the natural logarithm.

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

Данные вершин (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 (0.0, 0.0) to viewport size.

in mat4 SCREEN_MATRIX

Canvas space to clip space transform. In clip space coordinates range from (-1.0, -1.0) to (1.0, 1.0).

in int INSTANCE_ID

Идентификатор экземпляра для создания экземпляра.

в vec4 INSTANCE_CUSTOM

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

in bool AT_LIGHT_PASS

Всегда false.

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 = vec2(1.0/64.0, 1.0/32.0)

inout vec2 VERTEX

Положение вершины в локальном пространстве.

в int VERTEX_ID

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

inout vec2 UV

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

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

Координата центра пикселя. В экранном пространстве. xy определяет положение в области просмотра. Начало координат находится в левом верхнем углу области просмотра, (0.0, 0.0).

in vec2 SCREEN_PIXEL_SIZE

Size of individual pixels. Equal to the inverse of resolution.

in vec4 REGION_RECT

Видимая область области спрайта в формате (x, y, ширина, высота). Зависит от свойства region_enabled Sprite2D.

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, 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 from the vertex() function. For a Sprite2D with region enabled, this will sample the entire texture. Use REGION_RECT instead to sample only the region defined in the Sprite2D's properties.

vec2 SCREEN_UV

Screen UV coordinate for the current pixel.

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

COLOR из функции vertex(), умноженной на цвет TEXTURE. Также выводится значение цвета.

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

Функции светового процессора в 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

Координата центра пикселя. В экранном пространстве. xy определяет положение в области просмотра. Начало координат находится в левом верхнем углу области просмотра, (0.0, 0.0).

in vec3 NORMAL

Input normal.

vec4 COLOR

Input color. Это результат функции fragment().

vec2 UV

UV из функции vertex(), эквивалентно UV в функции fragment().

sampler2D TEXTURE

Current texture in use for the CanvasItem.

in vec2 TEXTURE_PIXEL_SIZE

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

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 это всегда (0.0, 0.0, 0.0).

in vec3 LIGHT_DIRECTION

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

in bool LIGHT_IS_DIRECTIONAL

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

in vec3 LIGHT_VERTEX

Положение пикселя в экранном пространстве, измененное в функции fragment().

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.