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 или пауза, но вы можете определить глобальную форму шейдера, чтобы добавить "масштабированную" переменную |
in float PI |
Константа |
in float TAU |
Константа |
in float E |
Константа |
Вершинные встроенные константы¶
Данные вершин (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 |
Всегда |
in vec2 TEXTURE_PIXEL_SIZE |
Нормализованный размер пикселя 2D-текстуры по умолчанию. Для Sprite2D с текстурой размером 64x32px, TEXTURE_PIXEL_SIZE = |
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. |
in vec2 SCREEN_PIXEL_SIZE |
Размер отдельных пикселей. Равно обратному разрешению. |
vec2 POINT_COORD |
Координаты для отрисовки точек. |
sampler2D TEXTURE |
2D текстура по умолчанию. |
in vec2 TEXTURE_PIXEL_SIZE |
Нормализованный размер пикселя 2D-текстуры по умолчанию. Для Sprite2D с текстурой размером 64x32px, TEXTURE_PIXEL_SIZE = |
in bool AT_LIGHT_PASS |
Всегда |
sampler2D SPECULAR_SHININESS_TEXTURE |
Текстура зеркального блеска этого объекта. |
in vec4 SPECULAR_SHININESS |
Цвет зеркального блеска, взятый из текстуры. |
vec2 UV |
UV из вершинной (vertex) функции. |
vec2 SCREEN_UV |
Экранная UV-координата для текущего пикселя. |
sampler2D SCREEN_TEXTURE |
Убрано в Godot 4. Вместо этого используйте |
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 |
Аналогичен |
inout vec3 LIGHT_VERTEX |
Аналогичен |
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. |
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 SCREEN_UV |
Экранная UV-координата для текущего пикселя. |
vec2 POINT_COORD |
UV for Point Sprite. |
in vec4 LIGHT_COLOR |
Цвет Света, умноженный на текстуру Света. |
in float LIGHT_ENERGY |
Мультипликатор энергии света. |
in vec3 LIGHT_POSITION |
Положение света в пространстве экрана. При использовании |
in vec3 LIGHT_DIRECTION |
Направление света в экранном пространстве. |
in bool LIGHT_IS_DIRECTIONAL |
|
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. |