Шейдеры Spatial
Пространственные шейдеры используются для затенения 3D-объектов. Это самый сложный тип шейдеров, который предлагает Godot. Пространственные шейдеры очень хорошо настраиваются, в них можно использовать различные режимы рендеринга и различные опции рендеринга (например, Subsurface Scattering, Transmission, Ambient Occlusion, Rim lighting и т. д.). Пользователи могут писать функции вершинного, фрагментного и светового процессоров, чтобы влиять на отрисовку объектов.
Режимы визуализации
Визуальные примеры этих режимов рендеринга см. в разделе Standard Material 3D and ORM Material 3D.
Режим рендеринга |
Описание |
|---|---|
blеnd_mix |
Режим смешивания (альфа как прозрачность), по умолчанию. |
blеnd_add |
Аддитивный режим наложения. |
blеnd_sub |
Режим наложения с вычитанием. |
blеnd_mul |
Режим наложения с умножением. |
blеnd_premul_alpha |
Режим предварительно умноженного альфа-смешивания (полностью прозрачный = add, полностью непрозрачный = mix). |
dеpth_draw_opaque |
Прорисовка глубины только для непрозрачной геометрии. |
dеpth_draw_always |
Постоянная отрисовка глубины (непрозрачная и прозрачная). |
dеpth_draw_never |
Никогда не отрисовывать глубину. |
depth_prepass_alpha |
Выполнение предварительного прохождения непрозрачной глубины для прозрачной геометрии. |
depth_test_disabled |
Отключение проверки глубины. |
sss_mode_skin |
Режим подповерхностного рассеяния для кожи (оптимизирует визуальные эффекты для кожи человека, например, усиливает красный канал). |
cull_baсk |
Обрезка задних поверхностей (по-умолчанию). |
cull_frоnt |
Обрезка передних поверхностей. |
cull_disablеd |
Выключение обрезки (двойная сторона). |
unshadеd |
Результат — просто альбедо. Материал не подвергается воздействию света и тени, что ускоряет рендеринг. |
wireframe |
Геометрия рисуется с помощью линий (полезно для устранения неполадок). |
debug_shadow_splits |
Направленные тени рисуются с использованием разных цветов для каждого разделения (полезно для устранения неполадок). |
diffuse_burleу |
Burley (Disney PBS) для диффузного (по умолчанию). |
diffusе_lambert |
Затенение Ламберта для диффузии. |
diffusе_lambert_wrap |
Затенение по методу Ламберта (зависящее от шероховатости) для диффузии. |
diffuse_toоn |
Toon-затенение для диффузного. |
specular_schlick_ggх |
Schlick-GGX для зеркальных лепестков прямого света (по умолчанию). |
spеcular_toon |
Настройка зеркальных отражений прямого света. |
speculаr_disabled |
Отключить зеркальные лепестки прямого света. Не влияет на отражённый свет (вместо этого используйте |
skіp_vertex_transform |
|
wоrld_vertex_coords |
|
ensure_correct_normals |
Используется, когда к сетке применен неравномерный масштаб (примечание: в настоящее время не реализовано). |
shadows_disabled |
Отключить расчёт теней в шейдере. Шейдер не будет получать тени, но сможет их отбрасывать. |
Свет_окружения_отключен |
Отключить влияние окружающего освещения и карты яркости. |
Тень_непрозрачна |
Освещение изменяет альфа-канал так, что затененные области становятся непрозрачными, а незатененные - прозрачными. Полезно для наложения теней на камеру в AR. |
vеrtex_lighting |
Используйте вершинное освещение вместо попиксельного. |
particle_trails |
Включает следы при использовании в геометрии частиц. |
alpha_to_coverage |
Режим альфа-сглаживания, более подробную информацию см. здесь. |
alpha_to_coverage_and_one |
Режим альфа-сглаживания, более подробную информацию см. здесь. |
fog_disabled |
Отключить получение глубинного или объёмного тумана. Полезно для материалов |
Встроенные функции
Значения, отмеченные как in, доступны только для чтения. Значения, отмеченные как out, могут быть записаны и не обязательно содержат осмысленные значения. Значения, отмеченные как inout, предоставляют осмысленное значение по умолчанию и могут быть записаны. Сэмплеры не могут быть записаны, поэтому они не отмечены.
Не все встроенные функции доступны во всех функциях обработки. Для доступа к встроенной функции вершины из функции fragment() можно использовать varying. То же самое относится к доступу к встроенным функциям фрагментов из функции light().
Глобальные встроенные функции
Глобальные встроенные модули доступны везде, включая пользовательские функции.
Встроенный |
Описание |
|---|---|
в плавающем TIME |
Глобальное время с момента запуска движка, в секундах. Оно повторяется каждые |
в float PI |
Константа |
в float TAU |
Константа |
В float E |
Константа |
в bool (логическом формате) OUTPUT_IS_SRGB |
|
в float CLIP_SPACE_FAR |
Значение |
Вершинные встроенные константы
Данные вершин (VERTEX, NORMAL, TANGENT и BITANGENT) представлены в пространстве модели (также называемом локальным пространством). Если эти значения не записаны, они не изменяются и передаются в том виде, в котором были получены, а затем преобразуются в пространство представления для использования в fragment().
При желании их можно представить в мировом пространстве, используя режим рендеринга world_vertex_coords.
Пользователи могут отключить встроенное преобразование modelview (проекция всё равно произойдет позже) и сделать это вручную с помощью следующего кода:
shader_type spatial;
render_mode skip_vertex_transform;
void vertex() {
VERTEX = (MODELVIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
NORMAL = normalize((MODELVIEW_MATRIX * vec4(NORMAL, 0.0)).xyz);
BINORMAL = normalize((MODELVIEW_MATRIX * vec4(BINORMAL, 0.0)).xyz);
TANGENT = normalize((MODELVIEW_MATRIX * vec4(TANGENT, 0.0)).xyz);
}
Другие встроенные функции, такие как UV, UV2 и COLOR, также передаются в функцию fragment(), если они не изменены.
Пользователи могут переопределять преобразования вида модели и проекции с помощью встроенного шейдера POSITION. Если POSITION записано в любом месте шейдера, оно будет использоваться всегда, поэтому пользователь несет ответственность за обеспечение его приемлемого значения. При использовании POSITION значение из VERTEX игнорируется, и проекция не выполняется. Однако значение, передаваемое во фрагментный шейдер, по-прежнему берется из VERTEX.
Для создания экземпляров переменная INSTANCE_CUSTOM содержит пользовательские данные экземпляра. При использовании частиц эта информация обычно выглядит следующим образом:
x: Угол поворота в радианах.
y: Фаза в течение жизни (от
0.0до1.0).z: Кадр анимации.
Это позволяет легко настроить шейдер на систему частиц, использующую материал частиц по умолчанию. При написании собственного шейдера частиц это значение можно использовать по своему усмотрению.
Встроенный |
Описание |
|---|---|
в vec2 VIEWPORT_SIZE |
Размер области просмотра (в пикселях). |
в mat4 VIEW_MATRIX |
Мировое пространство для просмотра трансформации пространства. |
в mat4 INV_VIEW_MATRIX |
Преобразование из пространства вида в мировое пространство. |
в mat4 MAIN_CAM_INV_VIEW_MATRIX |
Преобразование пространства вида в мировое пространство камеры, используемое для отрисовки текущего окна просмотра. |
в mat4 INV_PROJECTION_MATRIX |
Вырезать пространство, чтобы увидеть преобразование пространства. |
в vec3 NODE_POSITION_WORLD |
Положение узла в мировом пространстве. |
в vec3 NODE_POSITION_VIEW |
Положение узла в пространстве обзора. |
в vec3 CAMERA_POSITION_WORLD |
Camera position, in world space. Represents the midpoint of the two eyes when in multiview/stereo rendering. |
в vec3 CAMERA_DIRECTION_WORLD |
Направление камеры в мировом пространстве. |
в uint CAMERA_VISIBLE_LAYERS |
Отбрасывание слоев камеры, визуализирующей текущий проход. |
в int INSTANCE_ID |
Идентификатор экземпляра для создания экземпляра. |
в vec4 INSTANCE_CUSTOM |
Пользовательские данные экземпляра (в основном для частиц). |
в int VIEW_INDEX |
Вид, который мы рендерим. |
в int VIEW_MONO_LEFT |
Постоянная для Mono или левого глаза, всегда |
в int VIEW_RIGHT |
Константа для правого глаза, всегда |
in vec3 EYE_OFFSET |
Position offset for the eye being rendered, in view space. Only applicable for multiview rendering. |
inout (вход/выход) vec3 VERTEX |
Положение вершины в пространстве модели. В мировом пространстве, если используется |
в int VERTEX_ID |
Индекс текущей вершины в буфере вершин. |
inout vec3 NORMAL |
Нормаль в пространстве модели. В мировом пространстве, если используется |
inout vec3 TANGENT |
Касательная в пространстве модели. В мировом пространстве, если используется |
inout vec3 BINORMAL |
Бинормальна в модельном пространстве. В мировом пространстве, если используется |
out vec4 POSITION |
При записи переопределяет конечное положение вершины в пространстве отсечения. |
inout vec2 UV |
Основной UV-канал. |
inout vec2 UV2 |
Вторичный UV-канал. |
inout vec4 COLOR |
Цвет из вершин. |
out float ROUGHNESS |
Шероховатость для вершинного освещения. |
inout float POINT_SIZE |
Размер точки для рендеринга точек. |
inout mat4 MODELVIEW_MATRIX |
Модель/локальное пространство для просмотра преобразования пространства (используйте, если возможно). |
inout mat3 MODELVIEW_NORMAL_MATRIX |
|
mat4 MODEL_MATRIX |
Преобразование модельного/локального пространства в мировое пространство. |
mat3 MODEL_NORMAL_MATRIX |
|
inout mat4 PROJECTION_MATRIX |
Преобразование пространства просмотра для обрезки пространства. |
in uvec4 BONE_INDICES |
|
in vec4 BONE_WEIGHTS |
|
in vec4 CUSTOM0 |
Пользовательское значение из примитива вершины. При использовании дополнительных UV-координат |
in vec4 CUSTOM1 |
Пользовательское значение из примитива вершины. При использовании дополнительных UV-координат |
in vec4 CUSTOM2 |
Пользовательское значение из примитива вершины. При использовании дополнительных UV-координат |
in vec4 CUSTOM3 |
Пользовательское значение из примитива вершины. |
Примечание
MODELVIEW_MATRIX объединяет в себе MODEL_MATRIX и VIEW_MATRIX и лучше подходит для тех случаев, когда могут возникнуть проблемы с плавающей точкой. Например, если объект находится очень далеко от начала мира, то при использовании раздельных MODEL_MATRIX и VIEW_MATRIX могут возникнуть проблемы с плавающей точкой.
Примечание
INV_VIEW_MATRIX — это матрица, используемая для рендеринга объекта в этом проходе, в отличие от MAIN_CAM_INV_VIEW_MATRIX, которая является матрицей камеры в сцене. В проходе теней вид INV_VIEW_MATRIX основан на камере, расположенной в точке источника света.
Фрагментные встроенные константы
По умолчанию функция обработчика фрагментов Godot используется для настройки свойств материала вашего объекта и для того, чтобы встроенный рендерер выполнил финальное затенение. Однако вы не обязаны использовать все эти свойства, и если вы не будете записывать в них, Godot оптимизирует соответствующую функциональность.
Встроенный |
Описание |
|---|---|
в vec2 VIEWPORT_SIZE |
Размер области просмотра (в пикселях). |
vec4 FRAGCOORD |
Координаты центра пикселя в экранном пространстве. |
bool FRONT_FACING |
|
vec3 VIEW |
Нормализованный вектор от положения фрагмента до камеры (в пространстве вида). Он одинаков как для перспективной, так и для ортогональной камеры. |
vec2 UV |
UV, полученный из функции |
vec2 UV2 |
UV2, полученный из функции |
vec4 COLOR |
COLOR, который получается из функции |
vec2 POINT_COORD |
Координаты точки для рисования точек с помощью |
mat4 MODEL_MATRIX |
Преобразование модельного/локального пространства в мировое пространство. |
mat3 MODEL_NORMAL_MATRIX |
Преобразование пространства модели/локального пространства в мировое для нормалей. По умолчанию это то же самое, что |
в mat4 VIEW_MATRIX |
Мировое пространство для просмотра трансформации пространства. |
в mat4 INV_VIEW_MATRIX |
Преобразование из пространства вида в мировое пространство. |
mat4 PROJECTION_MATRIX |
Преобразование пространства просмотра для обрезки пространства. |
в mat4 INV_PROJECTION_MATRIX |
Вырезать пространство, чтобы увидеть преобразование пространства. |
в vec3 NODE_POSITION_WORLD |
Положение узла в мировом пространстве. |
в vec3 NODE_POSITION_VIEW |
Положение узла в пространстве обзора. |
в vec3 CAMERA_POSITION_WORLD |
Camera position, in world space. Represents the midpoint of the two eyes when in multiview/stereo rendering. |
в vec3 CAMERA_DIRECTION_WORLD |
Направление камеры в мировом пространстве. |
в uint CAMERA_VISIBLE_LAYERS |
Отбрасывание слоев камеры, визуализирующей текущий проход. |
vec3 VERTEX |
Положение фрагмента (пикселя) в пространстве вида. Это значение |
inout vec3 LIGHT_VERTEX |
Записываемая версия |
в int VIEW_INDEX |
Вид, который мы рендерим. Используется для различения видов при многоракурсном и стереорендеринге. |
в int VIEW_MONO_LEFT |
Постоянная для Mono или левого глаза, всегда |
в int VIEW_RIGHT |
Константа для правого глаза, всегда |
in vec3 EYE_OFFSET |
Position offset for the eye being rendered, in view space. Only applicable for multiview rendering. |
sampler2D SCREEN_TEXTURE |
Убрано в Godot 4. Вместо этого используйте |
vec2 SCREEN_UV |
Экранная UV-координата для текущего пикселя. |
sampler2D DEPTH_TEXTURE |
Убрано в Godot 4. Вместо этого используйте |
out float DEPTH |
Пользовательское значение глубины (диапазон |
inout vec3 NORMAL |
Нормаль, полученная функцией |
inout vec3 TANGENT |
Касательная, полученная функцией |
inout vec3 BINORMAL |
Бинормаль, полученная из функции |
out vec3 NORMAL_MAP |
Установите здесь значение normal, если считываете значение normal из текстуры вместо |
out float NORMAL_MAP_DEPTH |
Глубина от |
out vec3 ALBEDO |
Альбедо (по умолчанию белый). Базовый цвет. |
out float ALPHA |
Альфа (диапазон |
out float ALPHA_SCISSOR_THRESHOLD |
При записи значения ниже определенного количества альфа отбрасываются. |
out float ALPHA_HASH_SCALE |
Масштаб альфа-хеша при использовании режима прозрачности альфа-хеша. По умолчанию равен |
out float ALPHA_ANTIALIASING_EDGE |
Пороговое значение, ниже которого следует использовать сглаживание альфа-канала. Значение по умолчанию: |
out vec2 ALPHA_TEXTURE_COORDINATE |
Координаты текстуры, используемые для сглаживания альфа-канала. Требует режима рендеринга |
out float PREMUL_ALPHA_FACTOR |
Предварительно умноженный альфа-фактор. Действует только при использовании |
out float METALLIC |
Металлический (диапазон |
out float SPECULAR |
Зеркальный (физически некорректно изменять). Значение по умолчанию: |
out float ROUGHNESS |
Шероховатость (диапазон |
out float RIM |
Обод (диапазон |
out float RIM_TINT |
Оттенок контура, диапазон от |
out float CLEARCOAT |
Небольшое зеркальное пятно добавлено поверх существующего. При необходимости Godot рассчитывает прозрачный слой. |
out float CLEARCOAT_GLOSS |
Глянец прозрачного покрытия. Если используется, Godot рассчитывает количество прозрачного покрытия. |
out float ANISOTROPY |
Для искажения зеркального пятна в соответствии с касательным пространством. |
out vec2 ANISOTROPY_FLOW |
Направление искажения, используйте с flowmaps. |
out float SSS_STRENGTH |
Сила подповерхностного рассеяния. При использовании этого параметра к объекту будет применено подповерхностное рассеяние. |
out vec4 SSS_TRANSMITTANCE_COLOR |
Цвет коэффициента пропускания подповерхностного рассеяния. При использовании этого параметра к объекту будет применен коэффициент пропускания подповерхностного рассеяния. |
out float SSS_TRANSMITTANCE_DEPTH |
Цвет коэффициента пропускания подповерхностного рассеяния. При использовании этого параметра к объекту будет применен коэффициент пропускания подповерхностного рассеяния. |
out float SSS_TRANSMITTANCE_BOOST |
Увеличивает коэффициент пропускания подповерхностного рассеяния, если значение выше |
inout vec3 BACKLIGHT |
Цвет подсветки (работает как прямой свет, но принимается даже если нормаль слегка отвёрнута от источника). При использовании подсветка применяется к объекту. Может использоваться как более дешёвое приближение подповерхностного рассеяния. |
out float AO |
Сила окклюзии окружающего света. Для использования с предварительно запечёнными АО. |
out float AO_LIGHT_AFFECT |
Степень влияния фонового преграждения на прямой свет (диапазон |
out vec3 EMISSION |
Цвет излучения (может превышать |
out vec4 FOG |
При записи смешивает окончательный цвет пикселя с |
out vec4 RADIANCE |
Если указано, смешивает яркость карты окружения с |
out vec4 IRRADIANCE |
Если указано, смешивает освещенность карты окружения с |
Примечание
Шейдеры, проходящие через конвейер прозрачности при записи ALPHA, могут иметь проблемы с сортировкой прозрачности. Прочитайте раздел сортировка прозрачности на странице ограничений 3D-рендеринга для получения дополнительной информации и способов избежать проблем.
Встроенные константы шейдеров света
Написание функций светового процессора совершенно необязательно. Вы можете пропустить функцию light(), используя режим рендеринга unshaded. Если функция освещения не написана, Godot будет использовать свойства материала, записанные в функции fragment(), для расчёта освещения (в зависимости от режима рендеринга).
Функция light() вызывается для каждого источника света в каждом пикселе. Она вызывается внутри цикла для каждого типа источника света.
Ниже приведен пример пользовательской функции light(), использующей Ламбертовскую модель освещения:
void light() {
DIFFUSE_LIGHT += clamp(dot(NORMAL, LIGHT), 0.0, 1.0) * ATTENUATION * LIGHT_COLOR / PI;
}
Если вы хотите, чтобы освещение суммировалось, добавьте вклад освещения в DIFFUSE_LIGHT, используя +=, а не перезаписывайте его.
Предупреждение
Функция light() не будет запущена, если включен режим рендеринга vertex_lighting или если в настройках проекта включен параметр Rendering > Quality > Shading > Force Vertex Shading. (На мобильных платформах он включен по умолчанию.)
Встроенный |
Описание |
|---|---|
в vec2 VIEWPORT_SIZE |
Размер области просмотра (в пикселях). |
vec4 FRAGCOORD |
Координата центра пикселя в пространстве экрана. |
mat4 MODEL_MATRIX |
Преобразование модельного/локального пространства в мировое пространство. |
в mat4 INV_VIEW_MATRIX |
Преобразование из пространства вида в мировое пространство. |
в mat4 VIEW_MATRIX |
Мировое пространство для просмотра трансформации пространства. |
mat4 PROJECTION_MATRIX |
Преобразование пространства просмотра для обрезки пространства. |
в mat4 INV_PROJECTION_MATRIX |
Вырезать пространство, чтобы увидеть преобразование пространства. |
in vec3 NORMAL |
Нормальный вектор в пространстве вида. |
vec2 SCREEN_UV |
Экранная UV-координата для текущего пикселя. |
vec2 UV |
UV, полученный из функции |
vec2 UV2 |
UV2, полученный из функции |
vec3 VIEW |
Вид вектора в пространстве вида. |
in vec3 LIGHT |
Вектор света в пространстве зрения. |
in vec3 LIGHT_COLOR |
Цвет света умножается на Энергия света умножается на |
in float SPECULAR_AMOUNT |
Для OmniLight3D и SpotLight3D, |
in bool LIGHT_IS_DIRECTIONAL |
|
in float ATTENUATION |
Затухание в зависимости от расстояния или тени. |
in vec3 ALBEDO |
Базовое альбедо. |
in vec3 BACKLIGHT |
|
in float METALLIC |
Металлический. |
in float ROUGHNESS |
Шероховатость. |
out vec3 DIFFUSE_LIGHT |
Результат — рассеянный свет. |
out vec3 SPECULAR_LIGHT |
Результат зеркального света. |
out float ALPHA |
Альфа (диапазон |
Примечание
Шейдеры, проходящие через конвейер прозрачности при записи ALPHA, могут иметь проблемы с сортировкой прозрачности. Прочитайте раздел сортировка прозрачности на странице ограничений 3D-рендеринга для получения дополнительной информации и способов избежать проблем.
Прозрачные материалы также не могут отбрасывать тени или появляться в uniform-переменных hint_screen_texture и hint_depth_texture. Это, в свою очередь, не позволяет этим материалам появляться в отражениях или преломлениях в экранном пространстве. SDFGI резкие отражения не видны на прозрачных материалах (на прозрачных материалах видны только грубые отражения).