3D свет и тени¶
Введение¶
Источники света излучают свет, который смешивается с материалами и дает видимый результат. Свет может исходить от нескольких типов источников в сцене:
Из самого Материала в виде цвета излучения (хотя он не влияет на близлежащие объекты, если его не запекать).
Узлы Света: Направленный, Всенаправленный и Точечный.
Окружающий свет в Environment.
Запечённый свет (читайте doc_backed_lightmaps).
Цвет излучения — это свойство материала. Вы можете узнать больше о нём в руководстве Spatial Material.
Узлы света¶
Есть три типа узлов освещения: Directional light, ` Omni light`_ и Spot light. Давайте посмотрим на общие параметры для источников света:

У каждого есть своя функция:
Color: Основной цвет излучаемого света.
Energy: Множитель энергии. Полезен для насыщения света или работы с Освещение с высоким динамическим диапазоном.
Indirect Energy: Вторичный множитель, используемый с непрямым светом (свет отражается). Это работает в запеченном свете или GIProbe.
Negative: свет будет вычитаться, а прибавляться. Полезно для выравнивания света в слишком тёмных местах.
Specular: влияет на интенсивность зеркального пятна на объектах, на объектах освещённых этим источником. При нуле свет будет чисто рассеивающим.
Режим запекания: Устанавливает режим запекания для света. Что бы узнать больше, посмотрите doc_backed_lightmaps
Маска отбраковки: объекты, находящиеся в выбранных ниже слоях, будут подвержены влиянию этого света. Обратите внимание, что объекты, отключенные с помощью этой маски отбраковки, по-прежнему будут отбрасывать тени. Если вы не хотите, чтобы отключенные объекты отбрасывали тени, настройте свойство
cast_shadow
в GeometryInstance на желаемое значение.
Наложение теней¶
Свет может опционально создавать тени. Это придает им большую реалистичность(свет не достигает закрытых областей), но это уменьшает производительность. Здесь список основных параметров тебе, каждый имеет специфичную функцию:
Включено: установите флажок, чтобы включить наложение теней от этого источника света.
Цвет: перекрытые области умножаются на этот цвет. По умолчанию он черный, но его можно изменить на оттенок теней.
Смещение: Когда этот параметр слишком мал, то происходит самозатенение. Когда этот параметр слишком большой, то тени разделяются источниками теней. Настройте этот параметр наилучшим для вас образом.
Контакт: Осуществляет короткий raycast в пространстве экрана для уменьшения зазора, создаваемого смещением. Контакт теней доступен только при использовании GLES3.
Reverse Cull Face: Some scenes work better when shadow mapping is rendered with face-culling inverted.
Ниже изображено, как выглядит настройка смещения. Встроенные значения работают в общем случае, но в целом всё зависит от размера и сложности геометрии.

Finally, if gaps can't be solved, the Contact option can help (at a performance cost):

Any sort of bias issues can always be fixed by increasing the shadow map resolution, although that may lead to decreased performance.
Совет
If shadow biasing is a problem in your scene, the following settings are a good starting point:
Включите Реверс Cull Face. Это значительно уменьшает пиетет тени и предотвращает появление теневых прыщей при углах падения. Основным недостатком является то, что это может привести к утечке освещения в некоторых углах. Другим недостатком является то, что материалы, у которых режим cull установлен на Disabled или MeshInstances с Cast Shadow установлен на Double-Sided могут проявлять теневые прыщи.
Установите Bias на
-0.01
. Смещение должно быть отрицательным, когда Reverse Cull Face включен, но должно быть положительным, когда он отключен.For DirectionalLight, set the directional shadow Normal Bias to
0.0
and Bias Split Scale to0.0
. Depending on your scene, you may also want to further decrease Bias to a value between-0.05
and-0.1
.
Следуя приведенным выше советам, вы сможете избежать разрывов в тенях, не прибегая к контактным теням (которые имеют множество собственных проблем). Если после выполнения вышеуказанных действий прыщи в тенях все еще заметны, попробуйте еще больше разделить сетку в программе 3D-моделирования.
Направленный свет¶
Это самый обычный тип освещения, который представляет собой очень удаленный источник света (такой как солнце). Также это самый дешевый для вычислений тип освещения, который стоит использовать при любой возможности (хотя при этом не самый дешевый для вычисления карты теней, но об этом позже).
Направленный свет моделирует бесконечное число параллельных лучей света в сцене. Узел направленного света можно представить в виде большой стрелкой которая обозначает направление лучей света. Как всегда, позиция узла не влияет на освещение всего и может быть где угодно.

Каждая грань об лицевую сторону которой касаются лучи света освещена, пока другие грани остаются темными. Большинство типов освещения имеют особенные параметры, но направленный свет очень прост по своей природе.
Направленное отображение теней¶
Чтобы вычислить карты теней, сцена визуализируется (только глубина) с ортогональной точки зрения, которая покрывает всю сцену (или вплоть до максимального расстояния). Однако у этого подхода есть проблема, потому что объекты, расположенные ближе к камере, получают блочные тени.

Что бы исправить это, существует техника под названием "Паралельное Разделение Карты Теней" (или ПРКТ). Эта техника разделяет усеченную пирамиду обзора на 2 или 4 области. Каждая область получает свою карту теней. Это позволяет маленьким поверхностям расположенным близко к камере иметь такое же большое разрешение теней, как и у далеких поверхностей.

With this, shadows become more detailed:

To control PSSM, a number of parameters are exposed:

Each split distance is controlled relative to the camera far (or shadow Max Distance if greater than zero), so 0.0 is the eye position and 1.0 is where the shadow ends at a distance. Splits are in-between. Default values generally work well, but tweaking the first split a bit is common to give more detail to close objects (like a character in a third person game).
Always make sure to set a shadow Max Distance according to what the scene needs. A lower maximum distance will result in better-looking shadows.
Иногда переход от одного сплита к другому может выглядеть плохо. Чтобы исправить это, можно включить опцию "Blend Splits ", которая жертвует деталями в обмен на более плавные переходы:

Параметр "Normal Bias " можно использовать для исправления особых случаев самозатенения, когда объекты расположены перпендикулярно свету. Единственным недостатком является то, что тень становится немного тоньше.

Параметр "Bias Split Scale " позволяет управлять дополнительным смещением для удаленных от центра фрагментов. Если самозатенение происходит только на удаленных участках, это значение может их исправить.
Наконец, "Диапазон глубины " имеет две настройки:
Стабильность: Сохраняет стабильность тени при движении камеры, при этом блоки, появляющиеся в контуре вблизи краев тени, остаются на месте. Это значение используется по умолчанию и обычно желательно, но оно снижает эффективное разрешение тени.
Optimized: Пытается достичь максимального разрешения, доступного в любой момент времени. Это может привести к эффекту "движущейся пилы" на краях тени, но в то же время тень выглядит более детализированной (поэтому этот эффект может быть достаточно тонким, чтобы его можно было простить).
Просто поэкспериментируйте, какая настройка лучше подходит для вашей сцены.
Размер карты теней для направленных источников света можно изменить в Настройки проекта -> Рендеринг -> Качество:

Увеличение этого параметра может решить проблемы со смещением, но снизить производительность. Наложение теней - это искусство настройки.
Омни-свет¶
Омни-свет - это точечный источник, который излучает свет сферически во всех направлениях до заданного радиуса.

В реальной жизни ослабление света является обратной функцией, что означает, что у омни-светильников нет радиуса. Это проблема, потому что это означает, что вычисление нескольких омни-светильников станет требовательным.
Для решения этой проблемы вводится Диапазон вместе с функцией затухания.

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

Картографирование омни-тени¶
Сопоставление теней и света относительно простое. Основной вопрос, который необходимо рассмотреть, - это алгоритм, используемый для рендеринга.
Всенаправленные Тени могут отображаться как «Двойной параболоид» или «Кубическая карта». Первый рендерится быстро, но может вызвать деформацию, в то время как второй более правильный, но более затратный.

Если визуализируемые объекты в основном нерегулярные, обычно достаточно Dual Paraboloid. В любом случае, поскольку эти тени кэшируются в атласе теней (подробнее об этом в конце), для большинства сцен это может не иметь значения для производительности.
Точечный свет¶
Точечные светильники похожи на омни-светильники, за исключением того, что они излучают свет только в конус (или "срез"). Они полезны для имитации фонариков, автомобильных фар, отражателей, пятен и т.д. Этот тип света также ослабляется в направлении, противоположном тому, на которое он направлен.

Точечные источники света имеют те же параметры Диапазон и Затухание, что и Всенаправленный Свет, и добавляют два дополнительных параметра:
Угол: Апертурный угол света
Аттенюация угла: Затухание диффузора, которое помогает смягчить границы диффузора.
Точечное отображение теней¶
Пятнам не нужны никакие параметры для наложения теней. Помните, что при диафрагме более 89 градусов тени перестают работать для спотов, и вам следует рассмотреть возможность использования вместо них омни-света.
Shadow atlas¶
В отличие от направленных источников света, которые имеют собственную текстуру тени, всенаправленные и точечные источники света назначаются на ячейки теневого атласа. Этот атлас можно настроить в Настройки проекта -> Рендеринг -> Качество -> Атлас теней.

Разрешение распространяется на весь Атлас теней. Этот атлас разделен на четыре квадранта:

Каждый квадрант можно разделить на части, чтобы выделить любое количество карт теней; по умолчанию используется следующее разделение:

Логика распределения проста. Самый большой размер карты теней (когда не используется подразделение) представляет свет размером с экран (или больше). Подразделы (карты меньшего размера) представляют тени для света, который находится дальше от экрана и пропорционально меньше.
Каждый кадр для всех ламп выполняется следующая процедура:
Проверьте, находится ли светильник на слоте нужного размера. Если нет, перерисуйте его и переместите в слот большего/меньшего размера.
Проверьте, не изменился ли какой-либо объект, влияющий на карту теней. Если это произошло, перерендерите свет.
Если ничего из вышеперечисленного не произошло, ничего не будет сделано и тень останется нетронутой.
Если слоты в квадранте заполнены, светильники перемещаются в меньшие слоты, в зависимости от размера и расстояния.
Эта стратегия распределения работает для большинства игр, но в некоторых случаях вам может понадобиться отдельная стратегия (например, в игре "сверху вниз", где все огни примерно одинакового размера, а квадранты могут иметь одинаковое подразделение).
Качество теневого фильтра¶
Качество фильтрации теней можно настроить. Это можно найти в Project Settings -> Rendering -> Quality -> Shadows. Godot поддерживает без фильтра, PCF5 и PCF13.

Это влияет на блочность контура тени:
