Шейдеры

Введение

Шейдеры - это уникальные программы запускаемые на GPU. Они используются для указания на то, как обрабатывать данные полисеток (позиции вершин, цвета, нормали, и т.д.) и выводить их на экран. Шейдеры обрабатывают информацию не так, как это делает обычная программа, поскольку они оптимизированы для запуска на GPU. Одним из следствий этого является то, что они не сохраняют свои данные после запуска; они выводят конечный цвет на экран и двигаются дальше. Соответственно, нет способа получения доступа к выводу цвета из последнего запуска шейдера.

Godot использует шейдерный язык, очень похожий на GLSL, но с дополнительным функционалом и немного меньшей гибкостью. Причина этого в том, что Godot интегрирует встроенный функционал, что делает написание сложных шейдеров значительно проще. Godot преобразовывает написанный пользователем код шейдера в собственный код. Таким образом Godot обрабатывает множество низкоуровневых вещей, о которых не нужно беспокоиться пользователю, и он способен анализировать ваш шейдерный код и использовать его, влияя на последовательность процесса визуализации. Для более продвинутых шейдеров вы можете отключить эту функцию в режиме render_mode.

Этот документ предоставляет вам некоторую информацию о шейдерах, характерных для Godot. Подробные сведения о языке шейдинга в Godot см. в Документации по языку шейдеров Godot.

Типы шейдеров

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

Все шейдеры должны указать свой тип в первой строке в следующем формате:

shader_type spatial;

Поддерживаемые типы:

  • spatial: Для 3D визуализации.

  • canvas_item: Для 2D визуализации.

  • particles: Для систем частиц.

Для получения подробной информации о каждом типе шейдинга смотрите соответствующий справочный документ.

Режимы визуализации

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

Режимы визуализации указываются ниже типа шейдера:

shader_type spatial;
render_mode unshaded, cull_disabled;

Каждый тип шейдера имеет свой список доступных режимов визуализации. Полный список режимов визуализации смотрите в документе по каждому типу шейдера.

Функции процессора

В зависимости от типа шейдера различные функции процессора могут быть опционально переопределены. Для "spatial" ("пространственный") и "canvas_item" ("элемент холста") можно переопределить vertex (вершину), fragment (фрагмент) и light (свет). Для "particles" ("частиц") можно переопределить только vertex.

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

Функция вершинной (vertex) обработки вызывается один раз для каждой вершины в шейдерах "spatial" и "canvas_item". В шейдерах "particles" он вызывается один раз для каждой частицы.

Функция vertex используется для изменения информации о каждой вершине, которая будет передаваться в фрагментную функцию. Её также можно использовать для установления переменных, которые будут отправляться в фрагментную функцию с помощью "varyings" (см. другой документ).

По умолчанию Godot берет информацию о ваших вершинах и соответствующим образом преобразует их для прорисовки. Если это нежелательно, вы можете использовать режимы рендеринга для самостоятельного преобразования данных; пример этого см. в документации шейдера Spatial.

Фрагментный процессор

Функция фрагментной (fragment) обработки используется для настройки параметров материала Godot для каждого пикселя. Этот код обрабатывает каждый видимый пиксель, отрисовывающий объект или примитив. Он доступен только в шейдерах "spatial" и "canvas_item".

Стандартным использованием фрагментной функции является настройка свойств материала, которые будут использоваться для расчета освещения. Например, вы должны установить значения для ROUGHNESS (шероховатости поверхности), RIM (контура света) или TRANSMISSION (пропускания света), которые сообщат световой функции, как свет реагирует на этот фрагмент. Это позволяет контролировать сложную последовательность процессов шейдинга без необходимости написания пользователем большого количества кода. Если вам не нужен этот встроенный функционал, вы можете игнорировать его и написать свою собственную функцию обработки света, и Godot её оптимизирует. Например, если вы не укажете значение для RIM, Godot не будет рассчитывать контурное освещение. Во время компиляции Godot проверяет, используется ли RIM; если нет, то он вырежет весь соответствующий код. Таким образом, вы не будете тратить вычисления на эффекты, которые не используете.

Световой процессор

Процессор light тоже работает попиксельно, но также работает и для каждого источника света, который влияет на объект (и не работает, если на объект не влияет ни один свет). Он существует как функция, вызываемая внутри процессора fragment, и обычно работает с настройками свойств материала внутри функции fragment.

Процессор light работает в 2D иначе, чем в 3D; описание того, как это работает в каждом из них, можно найти в их документации CanvasItem shaders и Spatial shaders соответственно.