Определение шейдера
Каждый шейдер имеет YAML-прототип, хранящийся в Resources/Prototypes/Shaders. Все шейдеры имеют поля:- ype: должно быть shader
- id: уникальный ID прототипа (строка), идентифицирующий этот шейдер
- kind: canvas или source (см. ниже)
Шейдеры canvas
Это шейдер с предустановленными опциями, похожий на Godot CanvasItemMaterial. Имеет два обязательных свойства:- lend_mode: Способ отрисовки объекта поверх сцены. Аналогичен эквиваленту в Godot, за исключением небольших отличий в именовании. Возможные значения: mix, dd, subtract, multiply и premultiplied_alpha
- light_mode: Способ взаимодействия объекта со светом. Также эквивалентен Godot, со значениями ormal, unshaded и light_only.
- type: shader id: unshaded kind: canvas light_mode: unshaded `
Шейдеры source
Это custom-шейдеры, написанные на Space Wizard Shader Language (SWSL). Шейдеры source имеют одно обязательное свойство:- path: Путь относительно директории Resources/ к файлу исходного кода шейдера SWSL.
- type: shader id: GreyscaleFullscreen kind: source path: “/Textures/Shaders/greyscale_fullscreen.swsl” `
SWSL
Space Wizard Shader Language (SWSL) основан на языке шейдеров Godot. Большинство различий в совместимости между Godot и SWSL обрабатываются автоматически, за исключением следующих:- Вы ОБЯЗАНЫ убедиться, что все числовые типы (например, loat, ec3) имеют квалификатор точности highp или lowp. См. эту статью о причинах.
- Избегайте использования имён переменных, которые являются зарезервированными словами в распространённых спецификациях шейдеров. Ваш компьютер может их игнорировать, но они сломаются на других машинах. Проверьте раздел keywords (3.8) здесь
glsl void fragment() { COLOR = vec4(r, g, b, a); }
Доступные переменные (Fragment Shaders)
Параметры трафаретного теста
Шейдеры поддерживают операции с трафаретом. Это продвинутая функция рендеринга, которая может быть полезна для некоторых вещей, если вы знаете, что делаете. Функциональность тесно имитирует параметры трафарета, предоставляемые OpenGL (и, насколько я могу судить, Vulkan тоже). См. The OpenGL wiki для справки. Параметры трафарета определяются в отдельном объекте stencil. Например: `yml- type: shader id: stencilDraw kind: canvas stencil: ref: 1 op: Keep func: NotEqual `
- По умолчанию 0.
- op: Операция, применяемая к буферу трафарета, если тест пройден. Можно установить только op при прохождении (третий параметр glStencilOp).
- Варианты: Keep, Zero, Replace, IncrementClamp, IncrementWrap, DecrementClamp, DecrementWrap, Invert
- По умолчанию: Keep.
- unc: Функция сравнения для определения прохождения теста (первый параметр glStencilFunc).
- Варианты: Always, Never, Less, LessOrEqual, Greater, GreaterOrEqual, NotEqual, Equal.
- По умолчанию: Always.
- По умолчанию все единицы.
- writeMask: Маска для записи в буфер трафарета (параметр glStencilMask).
- По умолчанию все единицы.
Overlays
Overlay применяет шейдер ко всему экрану или окну просмотра (в отличие от отдельных спрайтов). Эффекты наркотиков, слепоты и искривления пространства сингулярности — примеры overlay’ев (написанных на C#), которые загружают прототипы шейдеров (определённые в YAML), которые могут загружать custom-шейдерные эффекты (написанные на SWSL). Overlay’и расширяют Overlay, например:Тестирование и отладка
Вы можете использовать команду /rldshader для перезагрузки шейдеров .swsl без перезапуска игры. Это означает, что вы часто можете использовать цветовые выводы для интерактивной отладки шейдеров.
Внешние инструменты
- renderdoc — Отличный инструмент для отладки рендеринга и шейдеров.