3D свет и тени

Введение

Источники света излучают свет, который смешивается с материалами и дает видимый результат. Свет может исходить от нескольких типов источников в сцене:

  • Из самого Материала в виде цвета излучения (хотя он не влияет на близлежащие объекты, если его не запекать).

  • Узлы Света: Направленный, Всенаправленный и Точечный.

  • Окружающий свет в Environment.

  • Запечённый свет (читайте doc_backed_lightmaps).

Цвет излучения — это свойство материала. Вы можете узнать больше о нём в руководстве Spatial Material.

Узлы света

Есть три типа узлов освещения: Directional light, ` Omni light`_ и Spot light. Давайте посмотрим на общие параметры для источников света:

../../_images/light_params.png

У каждого есть своя функция:

  • Color: Основной цвет излучаемого света.

  • Energy: Множитель энергии. Полезен для насыщения света или работы с High dynamic range lighting.

  • 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.

Ниже изображено, как выглядит настройка смещения. Встроенные значения работают в общем случае, но в целом всё зависит от размера и сложности геометрии.

../../_images/shadow_bias.png

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

../../_images/shadow_contact.png

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 to 0.0. Depending on your scene, you may also want to further decrease Bias to a value between -0.05 and -0.1.

Следуя приведенным выше советам, вы сможете избежать разрывов в тенях, не прибегая к контактным теням (которые имеют множество собственных проблем). Если после выполнения вышеуказанных действий прыщи в тенях все еще заметны, попробуйте еще больше разделить сетку в программе 3D-моделирования.

Направленный свет

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

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

../../_images/light_directional.png

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

Направленное отображение теней

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

../../_images/shadow_blocky.png

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

../../_images/pssm_explained.png

With this, shadows become more detailed:

../../_images/shadow_pssm.png

To control PSSM, a number of parameters are exposed:

../../_images/directional_shadow_params.png

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 ", которая жертвует деталями в обмен на более плавные переходы:

../../_images/blend_splits.png

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

../../_images/normal_bias.png

Параметр "Bias Split Scale " позволяет управлять дополнительным смещением для удаленных от центра фрагментов. Если самозатенение происходит только на удаленных участках, это значение может их исправить.

Наконец, "Диапазон глубины " имеет две настройки:

  • Стабильность: Сохраняет стабильность тени при движении камеры, при этом блоки, появляющиеся в контуре вблизи краев тени, остаются на месте. Это значение используется по умолчанию и обычно желательно, но оно снижает эффективное разрешение тени.

  • Optimized: Tries to achieve the maximum resolution available at any given time. This may result in a "moving saw" effect on shadow edges, but at the same time the shadow looks more detailed (so this effect may be subtle enough to be forgiven).

Просто поэкспериментируйте, какая настройка лучше подходит для вашей сцены.

Размер карты теней для направленных источников света можно изменить в Настройки проекта -> Рендеринг -> Качество:

../../_images/project_setting_shadow.png

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

Омни-свет

Омни-свет - это точечный источник, который излучает свет сферически во всех направлениях до заданного радиуса.

../../_images/light_omni.png

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

Для решения этой проблемы вводится Диапазон вместе с функцией затухания.

../../_images/light_omni_params.png

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

../../_images/light_attenuation.png

Картографирование омни-тени

Сопоставление теней и света относительно простое. Основной вопрос, который необходимо рассмотреть, - это алгоритм, используемый для рендеринга.

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

../../_images/shadow_omni_dp_cm.png

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

Точечный свет

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

../../_images/light_spot.png

Точечные источники света имеют те же параметры Диапазон и Затухание, что и Всенаправленный Свет, и добавляют два дополнительных параметра:

  • Угол: Апертурный угол света

  • Аттенюация угла: Затухание диффузора, которое помогает смягчить границы диффузора.

Точечное отображение теней

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

Shadow atlas

В отличие от направленных источников света, которые имеют собственную текстуру тени, всенаправленные и точечные источники света назначаются на ячейки теневого атласа. Этот атлас можно настроить в Настройки проекта -> Рендеринг -> Качество -> Атлас теней.

../../_images/shadow_atlas.png

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

../../_images/shadow_quadrants.png

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

../../_images/shadow_quadrants2.png

Логика распределения проста. Самый большой размер карты теней (когда не используется подразделение) представляет свет размером с экран (или больше). Подразделы (карты меньшего размера) представляют тени для света, который находится дальше от экрана и пропорционально меньше.

Каждый кадр для всех ламп выполняется следующая процедура:

  1. Проверьте, находится ли светильник на слоте нужного размера. Если нет, перерисуйте его и переместите в слот большего/меньшего размера.

  2. Проверьте, не изменился ли какой-либо объект, влияющий на карту теней. Если это произошло, перерендерите свет.

  3. Если ничего из вышеперечисленного не произошло, ничего не будет сделано и тень останется нетронутой.

If the slots in a quadrant are full, lights are pushed back to smaller slots, depending on size and distance.

This allocation strategy works for most games, but you may want to use a separate one in some cases (for example, a top-down game where all lights are around the same size and quadrants may all have the same subdivision).

Shadow filter quality

The filter quality of shadows can be tweaked. This can be found in Project Settings -> Rendering -> Quality -> Shadows. Godot supports no filter, PCF5 and PCF13.

../../_images/shadow_pcf1.png

It affects the blockyness of the shadow outline:

../../_images/shadow_pcf2.png