Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Шейдери 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 |
|
World_vertex_coords |
|
Вбудовані
Значення, позначені як in, доступні лише для читання. Значення, помічені як out, можуть бути записані за бажанням і не обов’язково міститимуть розумні значення. Значення, помічені як inout, забезпечують розумне значення за замовчуванням і, за бажанням, можуть бути записані. До семплерів не можна писати, тому вони не позначені.
Не всі вбудовані функції доступні у всіх функціях обробки. Щоб отримати доступ до вбудованої вершини з функції fragment(), ви можете використовувати varying. Те саме стосується доступу до вбудованих фрагментів із функції light().
Глобальні вбудовані функції
Глобальні вбудовані функції доступні скрізь, включаючи спеціальні функції.
Вбудований |
Опис |
|---|---|
In float TIME |
Глобальний час з моменту запуску двигуна, у секундах. Повторюється кожні |
у float PI |
Константа типу |
у float TAU |
Константа типу |
у 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, також передаються до функції fragment(), якщо не змінено.
Для створення екземплярів змінна INSTANCE_CUSTOM містить користувацькі дані екземпляра. При використанні частинок ця інформація зазвичай така:
x: Кут повороту в радіанах.
y: Фаза протягом життя (
0,0до1,0).z: рамка анімації.
Вбудований |
Опис |
|---|---|
In mat4 MODEL_MATRIX |
Трансформація локального простору у світовий простір. Світовий простір - це координати, які ви зазвичай використовуєте в редакторі. |
In mat4 CANVAS_MATRIX |
Перетворення світового простору на простір полотна. У просторі полотна початком координат є верхній лівий кут екрана, а координати варіюються від |
In mat4 SCREEN_MATRIX |
Трансформація простору полотна в простір кліпу. Координати в просторі кліпу варіюються від |
In int INSTANCE_ID |
Ідентифікатор екземпляра для створення екземпляра. |
In 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 64×32 pixels,
|
Inout vec2 VERTEX |
Положення вершини в локальному просторі. |
In int VERTEX_ID |
Індекс поточної вершини в буфері вершин. |
Inout vec2 UV |
Нормалізовані координати текстури. Діапазон від |
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 |
Coordinate of pixel center. In screen space. |
In vec2 SCREEN_PIXEL_SIZE |
Розмір окремих пікселів. Дорівнює оберненій роздільній здатності. |
in vec4 REGION_RECT |
Visible area of the sprite region in format
|
In vec2 POINT_COORD |
Coordinate for drawing points in the 0.0 to 1.0 range. |
Sampler2D TEXTURE |
Двовимірна текстура за замовчуванням. |
In vec2 TEXTURE_PIXEL_SIZE |
Normalized pixel size of the default 2D texture.
For a Sprite2D with a texture of size 64×32 pixels,
|
In bool AT_LIGHT_PASS |
Завжди |
Sampler2D SPECULAR_SHININESS_TEXTURE |
Текстура дзеркального блиску цього об'єкта. |
In vec4 SPECULAR_SHININESS |
Колір дзеркального блиску, взятий із текстури. |
In vec2 UV |
UV з функції |
In vec2 SCREEN_UV |
UV-координата екрану для поточного пікселя. |
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(), вона замінить вбудовану функцію освітлення, навіть якщо ваша функція освітлення порожня.
Нижче наведено приклад світлого шейдера, який враховує карту нормалей 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 |
Coordinate of pixel center. In screen space. |
In vec3 NORMAL |
Введення нормальне. |
In vec4 COLOR |
Колір введення. Це вихід функції |
In vec2 UV |
UV від функції |
Sampler2D TEXTURE |
Поточна текстура, що використовується для CanvasItem. |
In vec2 TEXTURE_PIXEL_SIZE |
Normalized pixel size of |
In vec2 SCREEN_UV |
UV-координата екрану для поточного пікселя. |
In vec2 POINT_COORD |
УФ для точкового спрайта. |
In vec4 LIGHT_COLOR |
Color Light2D. Якщо світло є class_PointLight2D, помножене на texture світла. |
In float LIGHT_ENERGY |
|
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
Реалізовано кілька додаткових функцій для семплування автоматично згенерованої текстури 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. |