Шейдери CanvasItem

Шейдери CanvasItem використовуються для малювання всіх 2D-елементів у Godot. До них належать усі вузли, які успадковуються від CanvasItems, і всі елементи GUI.

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

Режими візуалізації

Режим візуалізації

Опис

Blend_mix

Режим змішування (альфа — це прозорість), за замовчуванням.

Blend_add

Режим адитивного змішування.

Blend_sub

Режим субтрактивного змішування.

Blend_mul

Мультиплікативний режим змішування.

Blend_premul_alpha

Режим альфа-змішування з попереднім множенням.

Blend_disabled

Вимкнути змішування, значення (включаючи альфа) записуються як є.

Unshaded

Результат - просто альбедо. У матеріалі немає освітлення/затінення.

Light_only

Малюйте тільки на світлому проході.

Skip_vertex_transform

VERTEX потрібно перетворити вручну у функції vertex().

World_vertex_coords

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

Вбудовані

Значення, позначені як in, доступні лише для читання. Значення, помічені як out, можуть бути записані за бажанням і не обов’язково міститимуть розумні значення. Значення, помічені як inout, забезпечують розумне значення за замовчуванням і, за бажанням, можуть бути записані. До семплерів не можна писати, тому вони не позначені.

Не всі вбудовані функції доступні у всіх функціях обробки. Щоб отримати доступ до вбудованої вершини з функції fragment(), ви можете використовувати varying. Те саме стосується доступу до вбудованих фрагментів із функції light().

Глобальні вбудовані функції

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

Вбудований

Опис

In float TIME

Глобальний час із моменту запуску двигуна, у секундах. Він повторюється кожні 3600 секунд (що можна змінити за допомогою параметра rollover). На нього впливає time_scale, але не пауза. Якщо вам потрібна змінна TIME, на яку не впливає шкала часу, додайте власний global shader uniform і оновлюйте його кожного кадру.

у float PI

Константа PI (3,141592). Відношення довжини кола до його діаметра та кількості радіан на півоберта.

у float TAU

Константа TAU (6,283185). Еквівалент PI * 2 і кількість радіан у повному оберті.

у 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, також передаються до функції fragment(), якщо не змінено.

Для створення екземплярів змінна INSTANCE_CUSTOM містить користувацькі дані екземпляра. При використанні частинок ця інформація зазвичай така:

  • x: Кут повороту в радіанах.

  • y: Фаза протягом життя (0,0 до 1,0).

  • z: рамка анімації.

Вбудований

Опис

In mat4 MODEL_MATRIX

Трансформація локального простору у світовий простір. Світовий простір - це координати, які ви зазвичай використовуєте в редакторі.

In mat4 CANVAS_MATRIX

Перетворення світового простору в простір полотна. У просторі полотна початок координат – це верхній лівий кут екрана та координати в діапазоні від (0.0, 0.0) до розміру вікна перегляду.

In mat4 SCREEN_MATRIX

Простір полотна до простору кліпу. У просторі кліпу координати від (-1.0, -1.0) до (1.0, 1.0).

In int INSTANCE_ID

Ідентифікатор екземпляра для створення екземпляра.

In vec4 INSTANCE_CUSTOM

Спеціальні дані екземпляра.

In bool AT_LIGHT_PASS

Завжди``false``.

In vec2 TEXTURE_PIXEL_SIZE

Нормалізований розмір пікселів двовимірної текстури за замовчуванням. Для Sprite2D із текстурою розміром 64x32 пікселів TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

Inout vec2 VERTEX

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

In int VERTEX_ID

Індекс поточної вершини в буфері вершин.

Inout vec2 UV

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

Inout vec4 COLOR

Колір із примітиву вершини, помножений на modulate CanvasItem, помножений на self_modulate CanvasItem.

Inout float POINT_SIZE

Розмір точки для малювання точки.

In vec4 CUSTOM0

Спеціальне значення з примітиву вершини.

In vec4 CUSTOM1

Спеціальне значення з примітиву вершини.

Фрагмент вбудованих

КОЛІР і ТЕКСТУРА

Вбудована змінна COLOR використовується для кількох речей:

  • У функції vertex() COLOR містить колір із примітиву вершини, помножений на CanvasItem modulate, помножений на CanvasItem self_modulate.

  • У функції 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 як змінну, а потім прочитати його у fragment():

varying vec4 vertex_color;
void vertex() {
  vertex_color = COLOR;
}
void fragment() {
  COLOR = vertex_color;
}

НОРМАЛЬНО

Подібним чином, якщо в CanvasTexture використовується карта нормалей, Godot використовує її за замовчуванням і призначає її значення вбудованій змінній NORMAL. Якщо ви використовуєте звичайну карту, призначену для використання в 3D, вона відображатиметься перевернутою. Щоб використовувати його у вашому шейдері, ви повинні призначити його властивості NORMAL_MAP. Godot перетворить його для використання у 2D і перезапише NORMAL.

NORMAL_MAP = texture(NORMAL_TEXTURE, UV).rgb;

Вбудований

Опис

In vec4 FRAGCOORD

Координата центру пікселя. В екранному просторі. xy вказує позицію у вікні перегляду. У верхній лівій частині вікна перегляду розташовано початок координат, (0.0, 0.0).

In vec2 SCREEN_PIXEL_SIZE

Розмір окремих пікселів. Дорівнює оберненій роздільній здатності.

in vec4 REGION_RECT

Видима область спрайтової області у форматі (x, y, ширина, висота). Змінюється залежно від властивості region_enabled Sprite2D.

In vec2 POINT_COORD

Координата для малювання точок.

Sampler2D TEXTURE

Двовимірна текстура за замовчуванням.

In vec2 TEXTURE_PIXEL_SIZE

Нормалізований розмір пікселів двовимірної текстури за замовчуванням. Для Sprite2D із текстурою розміром 64x32 пікселів, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

In bool AT_LIGHT_PASS

Завжди``false``.

Sampler2D SPECULAR_SHININESS_TEXTURE

Текстура дзеркального блиску цього об'єкта.

In vec4 SPECULAR_SHININESS

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

In vec2 UV

UV з функції vertex(). Для Sprite2D з увімкненою областю це призведе до вибірки всієї текстури. Використовуйте REGION_RECT для вибірки лише області, визначеної у властивостях Sprite2D.

In vec2 SCREEN_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

COLOR з функції vertex(), помножений на колір TEXTURE. Також виведіть значення кольору.

Легкі вбудовані

Функції світлового процесора працюють інакше в Godot 4.x, ніж у Godot 3.x. У Godot 4.x усе освітлення здійснюється під час звичайного проходу розіграшу. Іншими словами, Godot більше не малює об’єкт знову для кожного світла.

Використовуйте режим візуалізації unshaded, якщо ви не хочете, щоб функція light() запускалася. Використовуйте режим візуалізації 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);
}

Вбудований

Опис

In vec4 FRAGCOORD

Координата центру пікселя. В екранному просторі. xy вказує позицію у вікні перегляду. У верхній лівій частині вікна перегляду розташовано початок координат, (0.0, 0.0).

In vec3 NORMAL

Введення нормальне.

In vec4 COLOR

Колір введення. Це вихід функції fragment().

In vec2 UV

UV від функції vertex(), еквівалентне UV у функції fragment().

Sampler2D TEXTURE

Поточна текстура, яка використовується для CanvasItem.

In vec2 TEXTURE_PIXEL_SIZE

Нормалізований розмір пікселів ТЕКСТУРИ. Для Sprite2D із TEXTURE розміром 64x32 пікселів, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

In vec2 SCREEN_UV

УФ-координата екрана для поточного пікселя.

In vec2 POINT_COORD

УФ для точкового спрайта.

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

Є кілька додаткових функцій, реалізованих для вибірки автоматично створеної текстури Signed Distance Field. Ці функції доступні для функцій fragment() і light() шейдерів CanvasItem. Настроювані функції також можуть використовувати їх, якщо вони викликані з підтримуваних функцій.

Поле підписаної відстані генерується з вузлів LightOccluder2D, присутніх у сцені з увімкненою властивістю SDF Collision (яка є типовою). Перегляньте документацію 2D lights and shadows для отримання додаткової інформації.

Function

Опис

Float texture_sdf (vec2 sdf_pos)

Виконує пошук текстури SDF.

Vec2 texture_sdf_normal (vec2 sdf_pos)

Обчислює нормаль із текстури SDF.

Vec2 sdf_to_screen_uv (vec2 sdf_pos)

Перетворює SDF на УФ екран.

Vec2 screen_uv_to_sdf (vec2 uv)

Перетворює УФ екрана на SDF.