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 |
Константа |
in float TAU |
Константа |
in float E |
Константа |
Вершинные встроенные константы¶
Данные вершин (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 |
|
in int INSTANCE_ID |
Instance ID for instancing. |
in vec4 INSTANCE_CUSTOM |
Instance custom data (for particles, mostly). |
in int VIEW_INDEX |
Вид, который мы рендерим. |
in int VIEW_MONO_LEFT |
Постоянная для Mono или левого глаза, всегда |
in int VIEW_RIGHT |
Константа для правого глаза, всегда |
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 |
Координата центра пикселя в пространстве экрана. |
bool FRONT_FACING |
|
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 |
|
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 |
Вид, который мы рендерим. |
in int VIEW_MONO_LEFT |
Постоянная для Mono или левого глаза, всегда |
in int VIEW_RIGHT |
Константа для правого глаза, всегда |
in vec3 EYE_OFFSET |
Смещение позиции для отрисовываемого глаза. Применяется только для многоракурсного рендеринга. |
sampler2D SCREEN_TEXTURE |
Убрано в Godot 4. Вместо этого используйте |
vec2 SCREEN_UV |
Экранная UV-координата для текущего пикселя. |
sampler2D DEPTH_TEXTURE |
Убрано в Godot 4. Вместо этого используйте |
out float DEPTH |
Пользовательское значение глубины (0..1). Если |
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 |
Координата центра пикселя в пространстве экрана. |
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 |
in float SPECULAR_AMOUNT |
2.0 * |
in bool LIGHT_IS_DIRECTIONAL |
|
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 |
|
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 резкие отражения не видны на прозрачных материалах (на прозрачных материалах видны только грубые отражения).