3D свет и тени
Введение
Источники света излучают свет, который смешивается с материалами и дает видимый результат. Свет может исходить от нескольких типов источников в сцене:
Из самого материала через цвет свечения (не влияет на соседние объекты без запекания или включённого screen-space indirect lighting).
Узлы света: DirectionalLight3D, OmniLight3D и SpotLight3D.
Окружающий свет в Environment или ReflectionProbe.
Глобальное освещение (LightmapGI, VoxelGI или SDFGI).
Цвет свечения — это свойство материала. Подробнее о нём можно узнать в руководстве Стандартный материал 3D и материал ORM 3D.
См. также
Сравнить различные типы источников света можно в демонстрационном проекте 3D Lights and Shadows.
Узлы света
Существует три типа источников света: DirectionalLight3D, OmniLight3D и SpotLight3D. Рассмотрим их общие параметры:
Каждое свойство выполняет определённую функцию:
Color (Цвет): Базовый цвет излучаемого света.
Energy (Энергия): Множитель интенсивности. Полезен для насыщения света или работы с Освещение с высоким динамическим диапазоном.
Indirect Energy (Непрямая энергия): Дополнительный множитель для отражённого света. Работает с Использование глобального освещения LightmapGI, VoxelGI и SDFGI.
Volumetric Fog Energy (Энергия объемного тумана): Вторичный множитель, используемый с объемным туманом. Имеет эффект только при включенном объемном тумане.
Negative (Отрицательный): Свет становится вычитающим. Полезно для ручной коррекции тёмных участков.
Specular (Зеркальность): Влияет на интенсивность бликов. При нулевом значении свет становится чисто диффузным.
Bake Mode (Режим запекания): Устанавливает режим запекания света. См. Использование глобального освещения LightmapGI.
Cull Mask (Маска отсечения): Влияет только на объекты в выбранных слоях. Объекты, исключённые маской, всё равно отбрасывают тени. Для отключения теней настройте свойство Cast Shadow у GeometryInstance3D.
См. также
См. Физические световые и камерные блоки, если вы хотите использовать реальные единицы измерения для настройки интенсивности и цветовой температуры вашего освещения.
Ограничения количества источников света
При использовании рендерера Forward+ Godot использует подход clustering (кластеризации) для освещения в реальном времени. Можно добавить столько источников света, сколько необходимо (при условии, что позволяет производительность). Однако по-прежнему существует ограничение по умолчанию в 512 кластеризованных элементов, которые могут присутствовать в текущем виде камеры. Кластеризованный элемент — это всенаправленный свет, точечный свет, decal или reflection probe. Этот лимит можно увеличить, настроив Max Clustered Elements в Project Settings > Rendering > Limits > Cluster Builder.
При использовании Mobile рендерера существует ограничение в 8 OmniLights + 8 SpotLights на ресурс сетки. Также существует ограничение в 256 OmniLights + 256 SpotLights, которые могут быть отрисованы в текущем виде камеры. Эти ограничения в настоящее время не могут быть изменены.
При использовании Compatibility renderer можно визуализировать до 8 OmniLights + 8 SpotLights на ресурс сетки. Этот лимит можно увеличить в расширенных настройках проекта, отрегулировав Max Renderable Elements и/или Max Lights per Object в Rendering > Limits > OpenGL, за счет производительности и более длительного времени компиляции шейдера. Лимит также можно уменьшить, чтобы сократить время компиляции шейдера и немного улучшить производительность.
При всех методах рендеринга одновременно могут быть видны до 8 DirectionalLight. Однако каждый дополнительный DirectionalLight с включенными тенями уменьшит эффективное разрешение теней каждого DirectionalLight. Это связано с тем, что атлас направленных теней является общим для всех источников света.
Если лимит рендеринга превышен, свет начнет появляться и исчезать во время движения камеры, что может отвлекать. Включение Distance Fade на узлах освещения может помочь уменьшить эту проблему, а также повысить производительность. Разделение сеток на более мелкие части также может помочь, особенно для геометрии уровня (что также повышает эффективность отбраковки).
Если вам нужно визуализировать больше источников света, чем возможно в данном рендерере, рассмотрите возможность использования baked lightmaps с режимом запекания источников света Static. Это позволяет полностью запекать источники света, что также значительно ускоряет их визуализацию. Вы также можете использовать излучающие материалы с любой техникой global lighting в качестве замены для световых узлов, которые излучают свет на большую площадь.
Наложение теней
Свет может опционально создавать тени. Это придает им большую реалистичность(свет не достигает закрытых областей), но это уменьшает производительность. Здесь список основных параметров тебе, каждый имеет специфичную функцию:
Enabled (Включено): Активирует карты теней для этого источника.
Opacity (Непрозрачность): Затемнение перекрытых областей с этим коэффициентом. По умолчанию тени полностью непрозрачны, но это можно изменить для создания полупрозрачных теней.
Bias (Смещение): При слишком низком значении возникает самозатенение. При слишком высоком — тени отрываются от объектов. Настройте оптимальное значение.
Normal Bias (Смещение по нормалям): При низком значении — самозатенение, при высоком — тени смещаются относительно объектов. Настройте под вашу сцену.
Transmittance Bias (Смещение пропускания): При низком значении — самозатенение на материалах с прозрачностью, при высоком — тени неправильно влияют на такие материалы. Требует тонкой настройки.
Reverse Cull Face (Инвертировать отбраковку граней): Улучшает качество теней в некоторых сценах за счёт инвертирования отбраковки невидимых граней.
Blur (Размытие): Умножает радиус размытия тени для этого источника света. Это работает как с традиционным отображением теней, так и с тенями с контактным упрочнением (источники света с Angular Distance (Угловым расстоянием) или Size (Размером) больше
0.0). Более высокие значения приводят к более мягким теням, которые также будут казаться более стабильными во времени для движущихся объектов. Недостатком увеличения размытия тени является то, что оно сделает зернистый рисунок, используемый для фильтрации, более заметным. См. также Режим фильтрации теней.Caster Mask (Маска затвора): Тени отбрасываются только объектами в этих слоях. Обратите внимание, что эта маска не влияет на то, на какие объекты отбрасываются тени.
Настройка смещения теней
На изображении ниже показана настройка смещения. Значения по умолчанию работают в большинстве случаев, но оптимальные параметры зависят от размера и сложности геометрии.
Если Shadow Bias или Shadow Normal Bias установлены слишком низко для данного освещения, тень будет "размазана" по объектам. Это приведет к тому, что предполагаемый вид освещения потемнеет, и это называется shadow acne:
С другой стороны, если Shadow Bias или Shadow Normal Bias установлены слишком высоко для данного освещения, тень может казаться оторванной от объекта. Это называется peter-panning:
Увеличение Normal Bias (Смещения по нормалям) предпочтительнее увеличения Bias (Основного смещения). Оно меньше вызывает эффект "отрыва теней" (peter-panning), но эффективно устраняет большинство артефактов самозатенения. Недостаток — может истончать тени у некоторых объектов.
Проблемы со смещением можно решить увеличением разрешения карты теней, ценой снижения производительности.
Примечание
Настройка параметров отображения теней — это искусство, и не существует настроек «один размер подходит всем». Для достижения наилучших визуальных эффектов вам может потребоваться использовать различные значения смещения тени для каждого источника света.
Примечание об изменении внешнего вида: При включении теней для света имейте в виду, что отображение света может измениться по сравнению с рендерингом без теней в рендере совместимости. Из-за ограничений старых мобильных устройств тени реализованы с использованием многопроходного рендеринга, поэтому свет с тенями рендерится в пространстве sRGB, а не в линейном пространстве. Такое изменение пространства рендеринга иногда может кардинально изменить внешний вид света. Чтобы добиться схожего с незатененным светом внешнего вида, вам может потребоваться изменить настройки силы света.
Направленный свет
Это самый обычный тип освещения, который представляет собой очень удаленный источник света (такой как солнце). Также это самый дешевый для вычислений тип освещения, который стоит использовать при любой возможности (хотя при этом не самый дешевый для вычисления карты теней, но об этом позже).
Направленный свет моделирует бесконечное число параллельных лучей света в сцене. Узел направленного света можно представить в виде большой стрелкой которая обозначает направление лучей света. Как всегда, позиция узла не влияет на освещение всего и может быть где угодно.
Освещаются только грани, на которые падает свет с лицевой стороны. В отличие от других источников, DirectionalLight3D не имеет специфических параметров.
Направленный свет также обладает свойством Angular Distance (Угловое расстояние), которое определяет угловой размер источника света в градусах. Увеличение этого параметра выше 0.0 сделает тени более мягкими на больших расстояниях от источника света, а также повлияет на внешний вид солнца в материалах процедурного неба. Это называется тенью контактного упрочнения (также известной как PCSS).
Для справки, угловое расстояние Солнца от Земли составляет примерно 0.5. Такая тень ресурсоёмка, поэтому ознакомьтесь с рекомендациями в Рекомендации по PCSS при установке этого значения выше 0.0 для освещения с включёнными тенями.
Направленное отображение теней
Для вычисления теней сцена рендерится (только глубина) с ортогональной точки, охватывающей всю сцену. Проблема в том, что близкие к камере объекты получают тени низкого разрешения, которые выглядят блочными.
Чтобы исправить эту проблему, используется техника, называемая Параллельные карты теней (PSSM). Эта техника разделяет объем обзора на 2 или 4 области, каждая из которых получает свою карту теней. Это позволяет небольшим областям, находящимся близко к зрителю, иметь такое же разрешение теней, как и у большой, удаленной области. Когда тени включены для DirectionalLight3D, режим теней по умолчанию - это PSSM с 4 разделениями. В сценариях, когда объект достаточно велик, чтобы появляться во всех четырех разделениях, это приводит к увеличению количества вызовов отрисовки. В частности, такой объект будет отрисован пять раз: один раз для каждой из четырех карт теней и один раз для финальной отрисовки сцены. Это может повлиять на производительность, и понимание этого поведения важно для оптимизации вашей сцены и управления ожиданиями по производительности.
При этом тени становятся более детализированными:
Для управления PSSM воздействию подвергается ряд параметров:
Каждое разделение расстояние контролируется относительно дальней камеры (или тени Max Distance, если больше 0.0). 0.0 - это положение глаз, а 1.0 - это то, где заканчивается тень на расстоянии. Разделения находятся между ними. Значения по умолчанию обычно работают хорошо, но небольшая настройка первого разделения является обычным делом, чтобы придать больше деталей близким объектам (например, персонажу в игре от третьего лица).
Всегда устанавливайте Максимальное расстояние для теней в соответствии с потребностями сцены. Меньшее максимальное расстояние приведёт к более красивым теням и лучшей производительности, так как меньше объектов нужно будет включать в рендеринг теней. Вы также можете настроить Fade Start, чтобы контролировать, насколько агрессивным должно быть затухание тени на расстоянии. Для сцен, в которых Max Distance полностью покрывает сцену при любом положении камеры, вы можете увеличить Fade Start до 1.0, чтобы предотвратить затухание тени на расстоянии. Этого не следует делать в сценах, где Max Distance не полностью покрывает сцену, так как тень будет казаться внезапно обрезанной на расстоянии.
Иногда переход между разделами может выглядеть неестественно. Для исправления можно включить опцию Blend Splits, которая жертвует детализацией и производительностью ради более плавных переходов:
Shadow > Normal Bias устраняет самозатенение перпендикулярных объектов. Недостаток — тени становятся тоньше. В большинстве случаев увеличивайте его перед основным Shadow > Bias.
И наконец, Pancake Size (размер блина)- это свойство, которое можно настроить для устранения недостающих теней при использовании больших объектов с неразделённой сеткой. Изменяйте это значение только в том случае, если вы заметили отсутствие теней, не связанное с проблемами смещения теней.
Омни-свет
Омни-свет - это точечный источник, который излучает свет сферически во всех направлениях до заданного радиуса.
В реальной жизни ослабление света является обратной функцией, что означает, что у омни-светильников нет радиуса. Это проблема, потому что это означает, что вычисление нескольких омни-светильников станет требовательным.
Для решения проблемы добавлены параметры Range (Диапазон) и функция затухания.
Эти два параметра позволяют визуально настраивать работу, чтобы получить эстетически приятные результаты.
В OmniLight3D также доступен параметр Size. При увеличении этого параметра свет будет затухать медленнее, а тени будут казаться более размытыми на большом расстоянии от наблюдателя. Это может быть использовано для имитации площадного освещения. Это называется тенью контактного упрочнения (также известной как PCSS). Этот вид тени ресурсозатратный, поэтому проверьте рекомендации в Рекомендации по PCSS при установке этого значения выше 0.0 для света с включёнными тенями.
Картографирование омни-тени
Сопоставление теней и света относительно простое. Основной вопрос, который необходимо рассмотреть, - это алгоритм, используемый для рендеринга.
Тени OmniLight3D можно рендерить как Dual Paraboloid (быстро, возможны деформации) или Cube (точнее, но медленнее). По умолчанию — Cube, но для неприметных источников лучше использовать Dual Paraboloid.
Dual Paraboloid обычно достаточно для неправильных форм. Так как тени кэшируются в теневом атласе, разница в производительности часто незаметна.
Светильники Omni с включенными тенями могут использовать проекторы. Текстура проектора умножит цвет света на цвет в заданной точке текстуры. В результате свет обычно будет казаться темнее после назначения текстуры проектора; вы можете увеличить Energy, чтобы компенсировать это.
Текстуры проектора Omni Light требуют специального панорамного отображения на 360°, аналогичного текстурам PanoramaSkyMaterial.
С использованием текстуры проектора, представленной ниже, получается следующий результат:
Совет
Если вы приобрели всенаправленные проекторы в виде изображений кубической карты, вы можете использовать этот веб-инструмент преобразования, чтобы преобразовать их в единое панорамное изображение.
Точечный свет
Точечные светильники похожи на омни-светильники, за исключением того, что они излучают свет только в конус (или "срез"). Они полезны для имитации фонариков, автомобильных фар, отражателей, пятен и т.д. Этот тип света также ослабляется в направлении, противоположном тому, на которое он направлен.
SpotLight3D имеет те же параметры Range, Attenuation и Size, что и OmniLight3D, плюс два дополнительных:
Angle (Угол): Угол раскрытия конуса света.
Angle Attenuation (Затухание угла): Смягчает границы светового конуса.
Точечное отображение теней
Spots имеют те же параметры, что и omni lights для теневого картирования. Рендеринг точечных карт теней значительно быстрее по сравнению с omni lights, поскольку требуется рендеринг только одной текстуры тени (вместо рендеринга 6 граней или 2 в режиме двойного параболида).
Точечные светильники с включенными тенями могут использовать проекторы. Текстура проектора умножит цвет света на цвет в заданной точке текстуры. В результате, как правило, свет будет казаться темнее после назначения текстуры проектора; вы можете увеличить Энергию, чтобы компенсировать это.
В отличие от омни-проекторов, текстура проектора точечного света не должна следовать специальному формату, чтобы выглядеть правильно. Она будет отображаться подобно decal.
С использованием текстуры проектора, представленной ниже, получается следующий результат:
Примечание
Точечные светильники с широкими углами будут иметь менее качественные тени, чем точечные светильники с узкими углами, так как карта теней распределяется по большей поверхности. При углах более 89 градусов тени от точечных светильников перестают работать. Если вам нужны тени для более широкого освещения, используйте омни-свет.
Shadow atlas (Атлас теней)
В отличие от DirectionalLight3D с отдельной текстурой, OmniLight3D и SpotLight3D используют общий теневой атлас. Настраивается в Проект > Настройки > Рендеринг > Тени > Позиционные тени.
Указанное разрешение применяется ко всему теневому атласу. Атлас разделён на четыре квадранта:
Каждый квадрант можно разделить на части, чтобы выделить любое количество карт теней; по умолчанию используется следующее разделение:
Пространство теневого атласа распределяется следующим образом:
Самые большие карты теней (без подразделения) соответствуют источникам света размером с экран или больше.
Подразделения (меньшие карты) соответствуют источникам света, находящимся дальше от камеры и пропорционально меньшим.
Каждый кадр для всех ламп выполняется следующая процедура:
Проверьте, находится ли светильник на слоте нужного размера. Если нет, перерисуйте его и переместите в слот большего/меньшего размера.
Проверьте, не изменился ли какой-либо объект, влияющий на карту теней. Если это произошло, перерендерите свет.
Если ничего из вышеперечисленного не произошло, ничего не будет сделано и тень останется нетронутой.
При заполнении слотов в квадранте источники переназначаются в меньшие слоты в зависимости от размера и расстояния. Если все слоты заполнены, некоторые источники не смогут отбрасывать тени, даже если эта функция включена.
Стратегия распределения теней по умолчанию позволяет отрисовывать до 88 источников света с включенными тенями во фрустуме камеры (4 + 4 + 16 + 64):
Первый и самый детализированный квадрант может содержать 4 тени.
Второй квадрант может содержать 4 другие тени.
Третий квадрант может содержать 16 теней с меньшей детализацией.
Четвёртый и наименее подробный квадрант может хранить 64 тени с ещё меньшей детализацией.
Использование большего количества теней на квадрант позволяет поддерживать большее количество света с включёнными тенями, а также повысить производительность (так как тени будут отрисовываться с меньшим разрешением для каждого света). Однако за увеличение количества теней на квадрант приходится платить более низким качеством теней.
В некоторых случаях (например, в играх topdown) можно использовать одинаковое подразделение для всех квадрантов, чтобы обеспечить равное качество теней для всех источников света.
Баланс производительности и качества
Рендеринг теней - важнейшая тема в производительности 3D-рендеринга. Здесь важно сделать правильный выбор, чтобы потом не создавать "узких мест".
Настройки качества направленной тени можно изменить во время выполнения, вызвав соответствующие методы RenderingServer.
Настройки качества позиционной (всенаправленной/точечной) тени можно изменить во время выполнения в корневом Viewport.
Размер карты теней
Высокое разрешение теней позволяет получить более чёткие тени, но за счёт значительных затрат производительности. Следует также отметить, что более резкие тени не всегда более реалистичны. В большинстве случаев это значение следует оставить по умолчанию на 4096 или уменьшить до 2048 для низкопроизводительных GPU.
Если позиционные тени становятся слишком размытыми после уменьшения размера карты теней, вы можете противодействовать этому, настроив квадранты shadow atlas, чтобы они содержали меньше теней. Это позволит визуализировать каждую тень с более высоким разрешением.
Режим фильтрации теней
Здесь можно выбрать несколько настроек качества карты теней. Значение по умолчанию Soft Low обеспечивает хороший баланс между производительностью и качеством для сцен с детализированными текстурами, поскольку детализация текстур поможет сделать рисунок дизеринга менее заметным.
Однако в проектах с менее подробными текстурами шаблон сглаживания теней может быть более заметен. Чтобы скрыть этот шаблон, вы можете либо включить Временное сглаживание (TAA), AMD FidelityFX Супер разрешение 2.2 (FSR2), Быстрое приближённое сглаживание (FXAA), либо увеличить качество фильтра теней до Soft Medium или выше.
Настройка Soft Very Low автоматически уменьшит размытие теней, чтобы сделать артефакты от низкого количества образцов менее заметными. Наоборот, настройки Soft High и Soft Ultra автоматически увеличат размытие теней, чтобы лучше использовать увеличенное количество образцов.
16-бит против 32-бит
По умолчанию Godot использует 16-битные текстуры глубины для рендеринга карты теней. Это рекомендуется в большинстве случаев, так как это работает лучше без заметной разницы в качестве.
Если 16 бит отключено, вместо этого будут использоваться 32-битные текстуры глубины. Это может привести к уменьшению артефактов в больших сценах и больших источниках света с включенными тенями. Однако разница часто едва заметна, но это может иметь существенные потери производительности.
Затухание света/теней на расстоянии
OmniLight3D и SpotLight3D предлагают несколько свойств для скрытия дальних источников света. Это может значительно улучшить производительность в больших сценах с десятками источников света или более.
Enabled (Включено): Управляет включением затухания на расстоянии (форма LOD). Свет будет затухать в течение Begin + Length (Начало + Длина), после чего он будет отсеян и вообще не будет отправлен в шейдер. Используйте это, чтобы уменьшить количество активных источников света в сцене и тем самым повысить производительность.
Begin (Начало): Расстояние от камеры, на котором свет начинает затухать (в трехмерных единицах).
Shadow: Расстояние от камеры, на котором тень начинает исчезать (в 3D-единицах). Это можно использовать для более быстрого исчезновения теней по сравнению со светом, что еще больше повышает производительность. Доступно только в том случае, если для света включены тени.
Length (Длина): Расстояние, на котором свет и тень затухают (в 3D-единицах). Свет постепенно становится более прозрачным на этом расстоянии и полностью невидим в конце. Более высокие значения приводят к более плавному переходу затухания, что больше подходит для случаев, когда камера движется быстро.
Рекомендации по PCSS
Процентно-ближенные мягкие тени (PCSS) обеспечивают более реалистичный вид теневого отображения, при этом размер полутени варьируется в зависимости от расстояния между источником света и поверхностью, принимающей тень. Это приводит к высокой стоимости производительности, особенно для направленного света.
Чтобы избежать проблем с производительностью, рекомендуется:
Используйте только несколько источников света с включенными тенями PCSS в определенное время. Эффект обычно наиболее заметен на больших, ярких источниках света. Вторичные источники света, которые более слабые, обычно не получают большой выгоды от использования теней PCSS.
Предоставьте пользователям возможность отключить тени PCSS. Для направленного света это можно сделать, установив свойство
light_angular_distanceDirectionalLight3D на0.0в скрипте. Для позиционного света это можно сделать, установив свойствоlight_sizeOmniLight3D или SpotLight3D на0.0в скрипте.
Режим фильтра проектора
Способ рендеринга проекторов также влияет на производительность. Расширенная настройка проекта Рендеринг > Текстуры > Проекторы света > Фильтр позволяет вам контролировать, как должны фильтроваться текстуры проектора. Ближайшие/Линейные не используют MIP-карты, что ускоряет их рендеринг. Однако проекторы будут выглядеть зернистыми на расстоянии. Ближайшие/Линейные MIP-карты будут выглядеть более гладкими на расстоянии, но проекторы будут выглядеть размытыми при просмотре под косыми углами. Эту проблему можно решить с помощью Ближайшие/Линейные MIP-карты Анизотропные, который является режимом наивысшего качества, но и самым дорогим.
Если ваш проект имеет стиль пиксельной графики, рассмотрите возможность установки фильтра на одно из значений Nearest, чтобы проекторы использовали фильтрацию ближайшего соседа. В противном случае придерживайтесь Linear.