Шейдеры Spatial
Spatial shaders are used for shading 3D objects. They are the most complex type of shader Godot offers. Spatial shaders are highly configurable with different render modes and different rendering options (e.g. Subsurface Scattering, Transmission, Ambient Occlusion, Rim lighting, etc.). Users can optionally write vertex, fragment, and light processor functions to affect how objects are drawn.
Режимы визуализации
Визуальные примеры этих режимов рендеринга см. в разделе 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 |
Отключение проверки глубины. |
depth_test_default |
Depth test will discard the pixel if it is behind other pixels. In Forward+ only, the pixel is also discarded if it's at the exact same depth as another pixel. |
depth_test_inverted |
Depth test will discard the pixel if it is in front of other pixels. Useful for stencil effects. |
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 |
Enables the trails when used on particle geometry. |
alpha_to_coverage |
Режим альфа-сглаживания, более подробную информацию см. здесь. |
alpha_to_coverage_and_one |
Режим альфа-сглаживания, более подробную информацию см. здесь. |
fog_disabled |
Отключить получение глубинного или объёмного тумана. Полезно для материалов |
Stencil modes
Примечание
Stencil support is experimental, use at your own risk. We will try to not break compatibility as much as possible, but if significant flaws are found in the API, it may change in the next minor version.
Stencil operations are a set of operations that allow writing to an efficient buffer in an hardware-accelerated manner. This is generally used to mask in or out parts of the scene.
Some of the most well-known uses are:
Outlines: Mask out the inner mesh that is being outlined to avoid inner outlines.
X-Ray: Display a mesh behind other objects.
Portals: Draw geometry that is normally "impossible" (non-Euclidian) by masking objects.
Примечание
You can only read from the stencil buffer in the transparent pass. Any attempt to read in the opaque pass will fail, as it's currently not supported behavior.
Note that for compositor effects, the main renderer's stencil buffer can't be copied to a custom texture.
Stencil mode |
Описание |
|---|---|
read |
Read from the stencil buffer. |
write |
Write reference value to the stencil buffer. |
write_if_depth_fail |
Write reference value to the stencil buffer if the depth test fails. |
compare_always |
Always pass stencil test. |
compare_equal |
Pass stencil test if the reference value is equal to the stencil buffer value. |
compare_not_equal |
Pass stencil test if the reference value is not equal to the stencil buffer value. |
compare_less |
Pass stencil test if the reference value is less than the stencil buffer value. |
compare_less_or_equal |
Pass stencil test if the reference value is less than or equal to the stencil buffer value. |
compare_greater |
Pass stencil test if the reference value is greater than the stencil buffer value. |
compare_greater_or_equal |
Pass stencil test if the reference value is greater than or equal to the stencil buffer value. |
Встроенные функции
Значения, отмеченные как in, доступны только для чтения. Значения, отмеченные как out, могут быть записаны и не обязательно содержат осмысленные значения. Значения, отмеченные как inout, предоставляют осмысленное значение по умолчанию и могут быть записаны. Сэмплеры не могут быть записаны, поэтому они не отмечены.
Не все встроенные функции доступны во всех функциях обработки. Для доступа к встроенной функции вершины из функции fragment() можно использовать varying. То же самое относится к доступу к встроенным функциям фрагментов из функции light().
Глобальные встроенные функции
Глобальные встроенные модули доступны везде, включая пользовательские функции.
Встроенный |
Описание |
|---|---|
в плавающем TIME |
Global time since the engine has started, in seconds. It repeats after every |
в float PI |
A |
в float TAU |
A |
В float E |
An |
в 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: Кадр анимации.
This allows you to easily adjust the shader to a particle system using default particle material. When writing a custom particle shader, this value can be used as desired.
Встроенный |
Описание |
|---|---|
в vec2 VIEWPORT_SIZE |
Размер области просмотра (в пикселях). |
в mat4 VIEW_MATRIX |
Мировое пространство для просмотра трансформации пространства. |
в mat4 INV_VIEW_MATRIX |
Преобразование из пространства вида в мировое пространство. |
в mat4 MAIN_CAM_INV_VIEW_MATRIX |
View space to world space transform of the camera used to draw the current viewport. |
в 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 |
Color from vertices. Limited to values between |
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 |
Пользовательское значение из примитива вершины. |
out float Z_CLIP_SCALE |
If written to, scales the vertex towards the camera to
avoid clipping into things like walls.
Lighting and shadows will continue to work correctly
when this is written to, but screen-space effects like
SSAO and SSR may break with lower scales. Try to keep
this value as close to |
Примечание
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 |
Coordinate of pixel center in screen space. |
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 |
Screen UV coordinate for the current pixel. |
sampler2D DEPTH_TEXTURE |
Убрано в Godot 4. Вместо этого используйте |
out float DEPTH |
Custom depth value (range |
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 |
Alpha (range |
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 |
Metallic (range |
out float SPECULAR |
Зеркальный (физически некорректно изменять). Значение по умолчанию: |
out float ROUGHNESS |
Roughness (range |
out float RIM |
Rim (range |
out float RIM_TINT |
Rim Tint, range from |
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 |
How much ambient occlusion affects direct light (range |
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 |
Screen UV coordinate for the current pixel. |
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 (range |
Примечание
Шейдеры, проходящие через конвейер прозрачности при записи ALPHA, могут иметь проблемы с сортировкой прозрачности. Прочитайте раздел сортировка прозрачности на странице ограничений 3D-рендеринга для получения дополнительной информации и способов избежать проблем.
Прозрачные материалы также не могут отбрасывать тени или появляться в uniform-переменных hint_screen_texture и hint_depth_texture. Это, в свою очередь, не позволяет этим материалам появляться в отражениях или преломлениях в экранном пространстве. SDFGI резкие отражения не видны на прозрачных материалах (на прозрачных материалах видны только грубые отражения).