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.

Знайомство з шейдерами

На цій сторінці пояснюється, що таке шейдери, і ви дізнаєтеся, як вони працюють у Godot. Щоб отримати детальну довідку про мову затінення двигуна, перегляньте Штрихування мови.

Шейдери — це особливий вид програм, які працюють на графічних процесорах (GPU). Спочатку вони використовувалися для затінення 3D-сцен, але тепер можуть робити набагато більше. Ви можете використовувати їх, щоб керувати тим, як механізм малює геометрію та пікселі на екрані, дозволяючи вам досягати різноманітних ефектів.

Сучасні механізми візуалізації, такі як Godot, малюють усе за допомогою шейдерів: графічні карти можуть виконувати тисячі інструкцій паралельно, що забезпечує неймовірну швидкість візуалізації.

Однак через свою паралельну природу шейдери не обробляють інформацію так, як це робить типова програма. Код шейдера виконується на кожній вершині або пікселі окремо. Ви також не можете зберігати дані між кадрами. Як наслідок, під час роботи з шейдерами вам потрібно кодувати та мислити інакше, ніж інші мови програмування.

Припустимо, ви хочете оновити всі пікселі текстури до заданого кольору. У GDScript ваш код використовуватиме цикли for:

for x in range(width):
    for y in range(height):
        set_color(x, y, some_color)

Ваш код уже є частиною циклу в шейдері, тому відповідний код виглядатиме так.

void fragment() {
    COLOR = some_color;
}

Примітка

Відеокарта викликає функцію fragment() один або кілька разів для кожного пікселя, який вона має намалювати. Детальніше про це нижче.

Шейдери в Godot

Godot пропонує мову затінення на основі популярної мови затінення OpenGL (GLSL), але спрощену. Механізм виконує частину роботи з ініціалізації нижчого рівня за вас, полегшуючи написання складних шейдерів.

У Godot шейдери складаються з основних функцій, які називаються «функціями процесора». Функції процесора є точкою входу для вашого шейдера в програму. Існує сім різних функцій процесора.

  1. Функція vertex() виконується по всіх вершинах сітки та встановлює їхні положення, а також деякі інші змінні для кожної вершини. Використовується в canvas_item shaders та spatial shaders.

  2. Функція fragment() виконується для кожного пікселя, покритого сіткою. Вона використовує значення, виведені функцією vertex(), інтерпольовані між вершинами. Використовується в canvas_item shaders та spatial shaders.

  3. Функція light() виконується для кожного пікселя та для кожного джерела світла. Вона приймає змінні з функції fragment() та з її попередніх запусків. Використовується в canvas_item shaders та spatial shaders.

  4. Функція start() запускається для кожної частинки в системі частинок один раз, коли частинка вперше породжується. Використовується в particles shaders.

  5. Функція process() запускається для кожної частинки в системі частинок для кожного кадру. Використовується в particles shaders.

  6. Функція sky() запускається для кожного пікселя в кубічній карті радіації, коли її потрібно оновити, а також для кожного пікселя на поточному екрані. Використовується в sky shaders.

  7. Функція fog() виконується для кожного фрокселя в об’ємному буфері фрокселя туману, який перетинається з FogVolume. Використовується fog shaders.

Попередження

Функція light() не працюватиме, якщо ввімкнено режим візуалізації vertex_lighting або якщо в налаштуваннях проекту ввімкнено Відтворення > Якість > Затінення > Примусове затінення вершини. Він увімкнено за замовчуванням на мобільних платформах.

Примітка

Godot також надає користувачам API для написання повністю власних шейдерів GLSL. Для отримання додаткової інформації див. Використання обчислювальних шейдерів.

Типи шейдерів

Замість надання конфігурації загального призначення для всіх видів використання (2D, 3D, частинки, небо, туман), ви повинні вказати тип шейдера, який ви пишете. Різні типи підтримують різні режими візуалізації, вбудовані змінні та функції обробки.

У Godot усі шейдери повинні вказувати свій тип у першому рядку, наприклад:

shader_type spatial;

Ось доступні типи:

  • spatial для 3D візуалізації.

  • canvas_item для 2D візуалізації.

  • particles для систем частинок.

  • sky рендерити Skies.

  • fog для відтворення FogVolumes

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

Шейдери мають додаткові режими візуалізації, які можна вказати у другому рядку після типу шейдера, наприклад:

shader_type spatial;
render_mode unshaded, cull_disabled;

Режими візуалізації змінюють спосіб застосування шейдера Godot. Наприклад, у режимі unshaded механізм пропускає вбудовану функцію світлового процесора.

Кожен тип шейдера має різні режими візуалізації. Повний список режимів візуалізації див. у довідці для кожного типу шейдера.

Вершиний процесор

Функція обробки vertex() викликається один раз для кожної вершини в spatial і canvas_item шейдерах.

Кожна вершина геометрії вашого світу має такі властивості, як положення та колір. Функція змінює ці значення та передає їх у функцію фрагмента. Ви також можете використовувати його для надсилання додаткових даних до функції фрагменту за допомогою варіацій.

За замовчуванням Godot перетворює інформацію про вершини, необхідну для проектування геометрії на екран. Ви можете використовувати режими візуалізації, щоб самостійно трансформувати дані; дивіться приклад Spatial shader doc.

Процесор фрагментів

Функція обробки fragment() використовується для налаштування параметрів матеріалу Godot для кожного пікселя. Цей код виконується на кожному видимому пікселі, який малює об'єкт або примітив. Він доступний лише в шейдерах spatial та canvas_item.

Стандартне використання функції fragment полягає в налаштуванні властивостей матеріалу, що використовуються для розрахунку освітлення. Наприклад, ви встановлюєте значення для ROUGHNESS, RIM або TRANSMISSION, які повідомляють функції освітлення, як освітлення реагує на цей фрагмент. Це дозволяє керувати складним конвеєром затінення без необхідності писати багато коду користувачем. Якщо вам не потрібна ця вбудована функціональність, ви можете ігнорувати її та написати власну функцію обробки світла, і Godot оптимізує її. Наприклад, якщо ви не запишете значення в RIM, Godot не розрахує освітлення обідка. Під час компіляції Godot перевіряє, чи використовується RIM; якщо ні, він видаляє весь відповідний код. Таким чином, ви не витрачатимете обчислення на ефекти, які не використовуєте.

Легкий процесор

Процесор light() також працює на піксель, і він запускається один раз для кожного світла, яке впливає на об’єкт. Він не запускається, якщо на об’єкт не впливає світло. Він існує як функція, що викликається всередині процесора fragment() і зазвичай працює з налаштуванням властивостей матеріалу всередині функції fragment().

Процесор light() працює інакше у 2D, ніж у 3D; для опису того, як це працює в кожному, дивіться їхню документацію, CanvasItem shaders і Spatial shaders відповідно.