Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Шейдеры Spatial

Пространственные шейдеры используются для затенения 3D-объектов. Это самый сложный тип шейдеров, который предлагает Godot. Пространственные шейдеры очень хорошо настраиваются, в них можно использовать различные режимы рендеринга и различные опции рендеринга (например, Subsurface Scattering, Transmission, Ambient Occlusion, Rim lighting и т. д.). Пользователи могут писать функции вершинного, фрагментного и светового процессоров, чтобы влиять на отрисовку объектов.

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

Режим рендеринга

Описание

blеnd_mix

Режим смешивания (альфа как прозрачность), по умолчанию.

blеnd_add

Аддитивный режим наложения.

blеnd_sub

Режим наложения с вычитанием.

blеnd_mul

Режим наложения с умножением.

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

Отрисовка геометрии с линиями.

diffuse_burleу

Burley (Disney PBS) для диффузного (по умолчанию).

diffusе_lambert

Затенение Ламберта для диффузии.

diffusе_lambert_wrap

Обертывание Ламберта (зависит от шероховатости) для диффузного.

diffuse_toоn

Toon-затенение для диффузного.

specular_schlick_ggх

Schlick-GGX for specular (default).

spеcular_toon

Toon for specular.

speculаr_disabled

Disable specular.

skіp_vertex_transform

VERTEX/NORMAL/etc. необходимо преобразовать вручную в функции вершин.

wоrld_vertex_coords

VERTEX/NORMAL/etc. изменяются в мировых координатах, а не в локальных.

ensure_correct_normals

Используется, когда к сетке применяется неравномерный масштаб.

shadows_disabled

Отключение вычисления теней в шейдере.

ambient_light_disabled

Disable contribution from ambient light and radiance map.

shadow_to_opacity

Освещение изменяет альфа-канал так, что затененные области становятся непрозрачными, а незатененные - прозрачными. Полезно для наложения теней на камеру в AR.

vеrtex_lighting

Использовать вершинное освещение.

particle_trails

Enables the trails when used on particles geometry.

alpha_to_coverage

Alpha antialiasing mode, see here for more.

alpha_to_coverage_and_one

Alpha antialiasing mode, see here for more.

fog_disabled

Отключает получение тумана на основе глубины или объемного тумана. Полезно для материалов blend_add, таких как частицы.

Встроенные функции

Значения, помеченные как "in", предназначены только для чтения. Значения, помеченные как "out", предназначены для необязательной записи и не обязательно будут содержать разумные значения. Значения, помеченные как "inout", содержат разумное значение по умолчанию и могут быть записаны по желанию. Сэмплеры не являются объектами записи и не помечаются.

Глобальные встроенные функции

Глобальные встроенные модули доступны везде, включая пользовательские функции.

Встроенный

Описание

in float TIME

Глобальное время в секундах.

in float PI

Константа PI (3.141592). Отношение окружности круга к его диаметру и количество радианов в половине оборота.

in float TAU

Константа TAU (6.283185). Эквивалент PI * 2 и количество радианов в полном обороте.

in float E

Константа E (2,718281). Число Эйлера и основание натурального логарифма.

Вершинные встроенные константы

Данные вершин (VERTEX, NORMAL, TANGENT, BITANGENT) представлены в локальном пространстве модели. Если не записывать эти значения, то они не будут изменены и будут переданы в том виде, в котором пришли.

По желанию они могут быть представлены в мировом пространстве с помощью режима рендеринга 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);
    // same as above for binormal and tangent, if normal mapping is used
}

Другие встроенные функции, такие как UV, UV2 и COLOR, также передаются в функцию fragment, если они не изменены.

Пользователи могут переопределить преобразования вида модели и проекции с помощью встроенной функции POSITION. При использовании POSITION значение из VERTEX игнорируется, и проецирование не происходит. Однако значение, передаваемое в шейдер фрагмента, по-прежнему берётся из VERTEX.

При инстансировании переменная INSTANCE_CUSTOM содержит пользовательские данные экземпляра. При использовании частиц эта информация обычно является:

  • x: Угол поворота в радианах.

  • y: Фаза в течение жизни (от 0 до 1).

  • z: Кадр анимации.

Это позволяет легко настроить шейдер на систему частиц, использующую материал частиц по умолчанию. При написании собственного шейдера частиц это значение можно использовать по своему усмотрению.

Встроенный

Описание

in vec2 VIEWPORT_SIZE

Размер области просмотра (в пикселях).

in mat4 VIEW_MATRIX

Мировое пространство для просмотра трансформации пространства.

in mat4 INV_VIEW_MATRIX

View space to world space transform.

in mat4 INV_PROJECTION_MATRIX

Clip space to view space transform.

in vec3 NODE_POSITION_WORLD

Положение узла в мировом пространстве.

in vec3 NODE_POSITION_VIEW

Node view space position.

in vec3 CAMERA_POSITION_WORLD

Положение камеры в мировом пространстве.

in vec3 CAMERA_DIRECTION_WORLD

Направление камеры в мировом пространстве.

in bool OUTPUT_IS_SRGB

true, если вывод осуществляется в цветовом пространстве sRGB (это true в рендере Compatibility, false в Forward+ и Forward Mobile).

in int INSTANCE_ID

Instance ID for instancing.

in vec4 INSTANCE_CUSTOM

Instance custom data (for particles, mostly).

in int VIEW_INDEX

Вид, который мы рендерим. VIEW_MONO_LEFT (0) для Mono (не мультиракурс) или левого глаза, VIEW_RIGHT (1) для правого глаза.

in int VIEW_MONO_LEFT

Постоянная для Mono или левого глаза, всегда 0.

in int VIEW_RIGHT

Константа для правого глаза, всегда 1.

in vec3 EYE_OFFSET

Смещение позиции для отрисовываемого глаза. Применяется только для многоракурсного рендеринга.

inout vec3 VERTEX

Вершина в локальных координатах.

in int VERTEX_ID

Индекс текущей вершины в буфере вершин.

inout vec3 NORMAL

Нормаль в локальных координатах.

inout vec3 TANGENT

Tangent in local coordinates.

inout vec3 BINORMAL

Бинормаль в локальных координатах.

out vec4 POSITION

Если записано в, то отменяет конечную позицию вершины.

inout vec2 UV

UV main channel.

inout vec2 UV2

UV secondary channel.

inout vec4 COLOR

Цвет из вершин.

out float ROUGHNESS

Шероховатость для вершинного освещения.

inout float POINT_SIZE

Размер точки для рендеринга точек.

inout mat4 MODELVIEW_MATRIX

Пространство модели для просмотра преобразования пространства (используется, если возможно).

inout mat3 MODELVIEW_NORMAL_MATRIX

inout mat4 MODEL_MATRIX

Преобразование пространства модели в мировое пространство.

inout mat3 MODEL_NORMAL_MATRIX

inout mat4 PROJECTION_MATRIX

Преобразование пространства просмотра для обрезки пространства.

inout uvec4 BONE_INDICES

inout vec4 BONE_WEIGHTS

in vec4 CUSTOM0

in vec4 CUSTOM1

in vec4 CUSTOM2

in vec4 CUSTOM3

Примечание

MODELVIEW_MATRIX объединяет в себе MODEL_MATRIX и VIEW_MATRIX и лучше подходит для тех случаев, когда могут возникнуть проблемы с плавающей точкой. Например, если объект находится очень далеко от начала мира, то при использовании раздельных MODEL_MATRIX и VIEW_MATRIX могут возникнуть проблемы с плавающей точкой.

Фрагментные встроенные константы

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

Встроенный

Описание

in vec2 VIEWPORT_SIZE

Размер области просмотра (в пикселях).

vec4 FRAGCOORD

Координата центра пикселя в пространстве экрана. xy задаёт позицию в окне, z задает глубину фрагмента, если DEPTH не используется. Ориентир - левый нижний угол.

bool FRONT_FACING

true, если текущая грань передняя.

vec3 VIEW

Normalized vector from fragment position to camera (in view space). This is the same for both perspective and orthogonal cameras.

vec2 UV

UV исходящее из вершинной функции.

vec2 UV2

UV2, который поступает из вершинной функции.

vec4 COLOR

COLOR, который берётся из вершинной функции.

vec2 POINT_COORD

Координата точки для рисования точек с POINT_SIZE (РАЗМЕР_ТОЧКИ).

in bool OUTPUT_IS_SRGB

true, если вывод осуществляется в цветовом пространстве sRGB (это true в рендере Compatibility, false в Forward+ и Forward Mobile).

mat4 MODEL_MATRIX

Преобразование пространства модели в мировое пространство.

mat3 MODEL_NORMAL_MATRIX

in mat4 VIEW_MATRIX

Мировое пространство для просмотра трансформации пространства.

in mat4 INV_VIEW_MATRIX

View space to world space transform.

mat4 PROJECTION_MATRIX

Преобразование пространства просмотра для обрезки пространства.

in mat4 INV_PROJECTION_MATRIX

Clip space to view space transform.

in vec3 NODE_POSITION_WORLD

Положение узла в мировом пространстве.

in vec3 NODE_POSITION_VIEW

Положение узла в пространстве обзора.

in vec3 CAMERA_POSITION_WORLD

Положение камеры в мировом пространстве.

in vec3 CAMERA_DIRECTION_WORLD

Направление камеры в мировом пространстве.

vec3 VERTEX

Вершина, полученная из вершинной функции (по умолчанию, в пространстве просмотра).

in int VIEW_INDEX

Вид, который мы рендерим. VIEW_MONO_LEFT (0) для Mono (не мультиракурс) или левого глаза, VIEW_RIGHT (1) для правого глаза.

in int VIEW_MONO_LEFT

Постоянная для Mono или левого глаза, всегда 0.

in int VIEW_RIGHT

Константа для правого глаза, всегда 1.

in vec3 EYE_OFFSET

Смещение позиции для отрисовываемого глаза. Применяется только для многоракурсного рендеринга.

sampler2D SCREEN_TEXTURE

Убрано в Godot 4. Вместо этого используйте sampler2D с hint_screen_texture.

vec2 SCREEN_UV

Экранная UV-координата для текущего пикселя.

sampler2D DEPTH_TEXTURE

Убрано в Godot 4. Вместо этого используйте sampler2D` с ``hint_depth_texture.

out float DEPTH

Пользовательское значение глубины (0..1). Если DEPTH записывается в любую шейдерную ветвь, то вы отвечаете за установку DEPTH для всех других ветвей. В противном случае графический API оставит их неинициализированными.

inout vec3 NORMAL

Нормаль, исходящая из вершинной функции (по умолчанию, в пространстве вида).

inout vec3 TANGENT

Tangent that comes from vertex function.

inout vec3 BINORMAL

Бинормаль, возникающая из вершинной функции.

out vec3 NORMAL_MAP

Установите здесь нормаль, если читаете нормаль из текстуры вместо NORMAL.

out float NORMAL_MAP_DEPTH

Глубина из переменной выше. По умолчанию 1.0.

out vec3 ALBEDO

Альбедо (по умолчанию белый).

out float ALPHA

Альфа (0..1); если записано в, материал будет передан в конвейер прозрачности.

out float ALPHA_SCISSOR_THRESHOLD

При записи значения ниже определенного количества альфа отбрасываются.

out float ALPHA_HASH_SCALE

out float ALPHA_ANTIALIASING_EDGE

out vec2 ALPHA_TEXTURE_COORDINATE

out float METALLIC

Металличность (0..1).

out float SPECULAR

Specular. По умолчанию 0.5, лучше не изменять, если вы не хотите изменить IOR.

out float ROUGHNESS

Шероховатость (0..1).

out float RIM

Rim (0..1). If used, Godot calculates rim lighting.

out float RIM_TINT

Rim Tint, goes from 0 (white) to 1 (albedo). If used, Godot calculates rim lighting.

out float CLEARCOAT

Small added specular blob. If used, Godot calculates Clearcoat.

out float CLEARCOAT_GLOSS

Gloss of Clearcoat. If used, Godot calculates Clearcoat.

out float ANISOTROPY

For distorting the specular blob according to tangent space.

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

Сила Ambient Occlusion. Для использования с предварительно запечённым АО.

out float AO_LIGHT_AFFECT

Насколько АО влияет на освещение (0..1; по умолчанию 0).

out vec3 EMISSION

Цвет излучения (может превышать 1,1,1 для HDR).

out vec4 FOG

Если записано, смешивает окончательный цвет пикселя с FOG.rgb на основе FOG.a.

out vec4 RADIANCE

Если записано, смешивает яркость карты окружения с RADIANCE.rgb на основе RADIANCE.a.

out vec4 IRRADIANCE

Если записано, смешивает карту окружения IRRADIANCE с IRRADIANCE.rgb на основе IRRADIANCE.a.

Примечание

Шейдеры, проходящие через конвейер прозрачности при записи ALPHA, могут иметь проблемы с сортировкой прозрачности. Прочитайте раздел сортировка прозрачности на странице ограничений 3D-рендеринга для получения дополнительной информации и способов избежать проблем.

Встроенные константы шейдеров света

Написание функций обработки света совершенно необязательно. Вы можете пропустить функцию освещения, установив render_mode в unshaded. Если функция освещения не написана, Godot будет использовать свойства материала, записанные в функции fragment, чтобы рассчитать освещение за вас (с учётом режима render_mode).

Функция освещения вызывается для каждого источника света в каждом пикселе. Он вызывается внутри цикла для каждого типа освещения.

Ниже приведен пример пользовательской функции освещения с использованием модели освещения Ламберта:

void light() {
    DIFFUSE_LIGHT += clamp(dot(NORMAL, LIGHT), 0.0, 1.0) * ATTENUATION * LIGHT_COLOR;
}

Если вы хотите, чтобы освещение суммировалось, добавьте вклад освещения в DIFFUSE_LIGHT, используя +=, а не перезаписывайте его.

Предупреждение

Функция light() не будет выполняться, если включен режим рендеринга vertex_lighting или если в настройках проекта включено Rendering > Quality > Shading > Force Vertex Shading. (На мобильных платформах он включен по умолчанию.)

Встроенный

Описание

in vec2 VIEWPORT_SIZE

Размер области просмотра (в пикселях).

vec4 FRAGCOORD

Координата центра пикселя в пространстве экрана. xy задаёт позицию в окне, z задает глубину фрагмента, если DEPTH не используется. Ориентир - левый нижний угол.

mat4 MODEL_MATRIX

Преобразование пространства модели в мировое пространство.

in mat4 INV_VIEW_MATRIX

View space to world space transform.

in mat4 VIEW_MATRIX

Мировое пространство для просмотра трансформации пространства.

mat4 PROJECTION_MATRIX

Преобразование пространства просмотра для обрезки пространства.

in mat4 INV_PROJECTION_MATRIX

Clip space to view space transform.

in vec3 NORMAL

Normal vector, in view space.

vec2 UV

UV исходящее из вершинной функции.

vec2 UV2

UV2, который поступает из вершинной функции.

vec3 VIEW

View vector, in view space.

in vec3 LIGHT

Light Vector, in view space.

in vec3 LIGHT_COLOR

Color of light multiplied by energy * PI. The PI multiplication is present because physically-based lighting models include a division by PI.

in float SPECULAR_AMOUNT

2.0 * light_specular property for OmniLight3D and SpotLight3D. 1.0 for DirectionalLight3D.

in bool LIGHT_IS_DIRECTIONAL

true if this pass is a DirectionalLight3D.

in float ATTENUATION

Attenuation based on distance or shadow.

in vec3 ALBEDO

Base albedo.

in vec3 BACKLIGHT

in float METALLIC

Metallic.

in float ROUGHNESS

Шероховатость.

in bool OUTPUT_IS_SRGB

true, если вывод осуществляется в цветовом пространстве sRGB (это true в рендере Compatibility, false в Forward+ и Forward Mobile).

out vec3 DIFFUSE_LIGHT

Diffuse light result.

out vec3 SPECULAR_LIGHT

Specular light result.

out float ALPHA

Альфа (0..1); если записано в, материал будет передан в конвейер прозрачности.

Примечание

Шейдеры, проходящие через конвейер прозрачности при записи ALPHA, могут иметь проблемы с сортировкой прозрачности. Прочитайте раздел сортировка прозрачности на странице ограничений 3D-рендеринга для получения дополнительной информации и способов избежать проблем.

Прозрачные материалы также не могут отбрасывать тени или появляться в uniform-переменных hint_screen_texture и hint_depth_texture. Это, в свою очередь, не позволяет этим материалам появляться в отражениях или преломлениях в экранном пространстве. SDFGI резкие отражения не видны на прозрачных материалах (на прозрачных материалах видны только грубые отражения).