3D свет и тени

Введение

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

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

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

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

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

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

Узлы света

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

../../_images/light_params.png

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

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

  • Energy: Множитель энергии. Полезен для насыщения света или работы с Освещение с высоким динамическим диапазоном.

  • Indirect Energy: Вторичный множитель, используемый с непрямым светом (свет отражается). Это работает в запеченном свете или GIProbe.

  • Negative: свет будет вычитаться, а прибавляться. Полезно для выравнивания света в слишком тёмных местах.

  • Specular: влияет на интенсивность зеркального пятна на объектах, на объектах освещённых этим источником. При нуле свет будет чисто рассеивающим.

  • Режим запекания: Устанавливает режим запекания для света. Что бы узнать больше, посмотрите doc_backed_lightmaps

  • Маска отбраковки: объекты, находящиеся в выбранных ниже слоях, будут подвержены влиянию этого света. Обратите внимание, что объекты, отключенные с помощью этой маски отбраковки, по-прежнему будут отбрасывать тени. Если вы не хотите, чтобы отключенные объекты отбрасывали тени, настройте свойство cast_shadow в GeometryInstance на желаемое значение.

Наложение теней

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

  • Включено: установите флажок, чтобы включить наложение теней от этого источника света.

  • Цвет: перекрытые области умножаются на этот цвет. По умолчанию он черный, но его можно изменить на оттенок теней.

  • Смещение: Когда этот параметр слишком мал, то происходит самозатенение. Когда этот параметр слишком большой, то тени разделяются источниками теней. Настройте этот параметр наилучшим для вас образом.

  • Контакт: Осуществляет короткий raycast в пространстве экрана для уменьшения зазора, создаваемого смещением. Контакт теней доступен только при использовании GLES3.

  • Reverse Cull Face: Некоторые сцены работают лучше, когда отображение теней визуализируется с перевернутой отбраковкой лиц.

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

../../_images/shadow_bias.png

Наконец, если зазоры не удаётся устранить, на помощь может прийти опция Contact (влияет на производительность):

../../_images/shadow_contact.png

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

Совет

Если смещение теней является проблемой в вашей сцене, следующие настройки являются хорошей отправной точкой:

  • Включите Реверс Cull Face. Это значительно уменьшает пиетет тени и предотвращает появление теневых прыщей при углах падения. Основным недостатком является то, что это может привести к утечке освещения в некоторых углах. Другим недостатком является то, что материалы, у которых режим cull установлен на Disabled или MeshInstances с Cast Shadow установлен на Double-Sided могут проявлять теневые прыщи.

  • Установите Bias на -0.01. Смещение должно быть отрицательным, когда Reverse Cull Face включен, но должно быть положительным, когда он отключен.

  • Для DirectionalLight установите направленную тень Normal Bias на 0.0 и Bias Split Scale на 0.0. В зависимости от вашей сцены вы также можете дополнительно уменьшить Bias до значения от -0.05 до -0.1.

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

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

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

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

../../_images/light_directional.png

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

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

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

../../_images/shadow_blocky.png

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

../../_images/pssm_explained.png

При этом тени становятся более детализированными:

../../_images/shadow_pssm.png

Для управления PSSM воздействию подвергается ряд параметров:

../../_images/directional_shadow_params.png

Расстояние каждого сплита контролируется относительно дальней камеры (или Max Distance тени, если больше нуля), поэтому 0.0 - это положение глаз, а 1.0 - место, где тень заканчивается на расстоянии. Сплиты находятся между ними. Значения по умолчанию обычно работают хорошо, но для придания большей детализации близким объектам (например, персонажу в игре от третьего лица) первое деление можно немного править.

Всегда следите за тем, чтобы установить максимальное расстояние тени в соответствии с тем, что требуется сцене. Меньшее максимальное расстояние приведёт к более красивым теням.

Иногда переход от одного сплита к другому может выглядеть плохо. Чтобы исправить это, можно включить опцию "Blend Splits ", которая жертвует деталями в обмен на более плавные переходы:

../../_images/blend_splits.png

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

../../_images/normal_bias.png

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

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

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

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

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

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

../../_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. Если ничего из вышеперечисленного не произошло, ничего не будет сделано и тень останется нетронутой.

Если слоты в квадранте заполнены, светильники перемещаются в меньшие слоты, в зависимости от размера и расстояния.

Эта стратегия распределения работает для большинства игр, но в некоторых случаях вам может понадобиться отдельная стратегия (например, в игре "сверху вниз", где все огни примерно одинакового размера, а квадранты могут иметь одинаковое подразделение).

Качество теневого фильтра

Качество фильтрации теней можно настроить. Это можно найти в Project Settings -> Rendering -> Quality -> Shadows. Godot поддерживает без фильтра, PCF5 и PCF13.

../../_images/shadow_pcf1.png

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

../../_images/shadow_pcf2.png