Оптимизация источников освещения
Источники света в сцене ресурсоемки (особенно, если их много). Например, в зависимости от типа источника света для расчета теней, отбрасываемых освещенными объектами, может потребоваться до 6 проходов рендеринга. Некоторые специфические для типа настройки источников света также могут влиять на производительность.
В статье описаны основные приемы оптимизации света.
Общие принципы оптимизации#
Некоторые подходы к оптимизации различаются в зависимости от типа источника света. Однако есть несколько общих оптимизаций, которые можно применить ко всем источникам света в сцене.
Отключение теней для поверхностей#
Вы можете отключить рендеринг теней для некоторых поверхностей или материалов. Например, это можно сделать для самой дальней поверхности LOD (когда тени не имеют значения).
Чтобы отключить рендеринг теней для поверхности :
- В окне World Hierarchy выберите ноду и перейдите в раздел Surfaces на вкладке Node окна Parameters.
-
Выберите необходимые поверхности и выключите параметр Cast Proj and Omni Shadows. Чтобы отключить тени от мирового освещения, отключите параметр Cast World Shadows.
Чтобы отключить рендеринг теней для материала :
- В окне Materials Hierarchy выберите материал и перейдите на вкладку Common окна Parameters.
-
Отключите параметр Cast Proj and Omni Shadow. Чтобы отключить тени от World Light, отключите параметр Cast World Shadow.
Включение статического освещения и теней#
Динамическое освещение обеспечивает правильную визуализацию всех теней от движущихся источников света, отбрасываемых движущимися объектами. Этот подход подразумевает, что геометрия вашей сцены рендерится еще один раз в каждом кадре для расчета теней для каждого источника света Projected (или еще шесть раз — для каждого Omni). Использование нескольких динамических источников света в сцене и вычисление теней для них на лету может привести к падению производительности, особенно когда сцена содержит сложную геометрию с большим количеством полигонов. Это может быть ужасной тратой ресурсов, когда большинство объектов и источников света статичны.
Лучше избегать динамических теней и использовать запеченные для всего статического, где это возможно. Вы можете заменить динамические источники света Omni и Projected на статические (тени для них предварительно вычисляются и сохраняются в текстурах глубины).
Типы отображаемых теней определяются режим освещения и теневые режимы установлены для обоих огни а также поверхности объекта .
В зависимости от ваших потребностей, вы можете рендерить только запеченные тени или комбинировать рендеринг как запеченных, так и динамических. В таблице ниже представлены все возможные варианты настройки теней.
Таким образом, для динамического освещения тени от всех освещенных объектов визуализируются как динамические.
Для статического источника света в режиме теней Static визуализируются только запеченные тени от объектов с режимом теней Mixed; динамические тени вообще не отрисовываются.
Для Статического источника света в режиме теней Mixed рендерятся оба типа теней: запеченные (от поверхностей с режимом теней Mixed) и динамические (от поверхностей с режимом теней Dynamic).
Смешанный режим подразумевает, что динамическая карта теней копируется в статическую. текстура глубины и результат визуализируется. Если выбрать более высокое разрешающая способность , процесс копирования карты теней может занять время и повлиять на производительность. Поэтому разрешение 4K в теневом режиме Mixed имеет смысл, если в сцене больше 1,5 млн треугольников, иначе режим Dynamic может оказаться быстрее. Кроме того, обратите внимание на потребление видеопамяти, так как одна текстура глубины разрешения 4K для омнилайта занимает около 400 МБ.
Исходный код World Light работает аналогичным образом, но использует теневые каскады . В режиме Dynamic каскады теней строятся динамически относительно положения камеры, а в режиме Static они запекаются и их площадь определяется положением источника света. Режим Static World Light подходит в качестве метода оптимизации производительности для проектов ArchViz с небольшой площадью, где теневые каскады можно разделить на две части: проходимая область с тенями высокого разрешения (поскольку они наблюдаются вблизи) и непроходимая область с тени с низким разрешением (как они наблюдаются на расстоянии). Обратите внимание, что изменение времени суток недоступно в режиме Static, так как каскады теней запекаются.
Использование масок теней#
Маска Shadow позволяет управлять отрисовкой теней. Вы можете указать, какие поверхности, освещенные источником света, должны отбрасывать тени:
-
Для источника света укажите маску Shadow: откройте окно World Hierarchy и выберите ваш источник света. В разделе Shadow Mask вкладки Node окна Parameters укажите теневую маску.
- Для всех поверхностей, которые освещаются источником света и должны отбрасывать тени, укажите маску Shadow, которая соответствует маске Shadow источника света (не менее одного бита).
- Для всех материалов, применяемых к таким поверхностям, также укажите соответствующую теневую маску.
Использование теней в экранном пространстве (Screen-Space Shadows)#
Для всех типов источников света вместо карт теней на больших расстояниях можно рендерить скринспейсовые тени. Это повышает производительность, так как такие тени не зависят от сложности геометрии.
Вы можете включить тени в экранном пространстве одним из следующих способов:
- В строке меню выберите Rendering -> Shadows -> Screen Space Shadows.
- В строке меню выберите Windows -> Settings, а затем перейдите в раздел Shadows. Здесь вы можете включить параметр Screen Space Shadows.
Вы также можете настроить тени экранного пространства для каждого источника света на вкладках определенного типа (Light World, Light Omni и т. д.) окна Parameters.
Уменьшение размера источника света#
Все источники света Omni и Projected подлежат общей технике отложенной оптимизации — Scissor Test: для каждого источника света находится прямоугольник-ножницы, определяющий его границы и, следовательно, область его влияния. Прямоугольник-ножницы определяет размер цели рендеринга для текущего источника света, поскольку все, что выходит за пределы этой области, не подвергается воздействию света в текущий момент.
Включите визуальный помощник Scissors или используйте консольную команду render_show_scissors 1, чтобы включить визуализацию файла Scissor Test.
Следовательно размер источника света существенно влияет на производительность: чем больше площадь экрана, на которой визуализируется освещаемая поверхность, тем ниже световая производительность. Таким образом, держите размер как можно меньше.
Включение рендеринга источников света с чередованием#
В этом режиме освещение рендерится на отложенном проходе в половинном разрешении (1/4 всех пикселей) с последующей реконструкцией соседних пикселей по данным предыдущих кадров, что позволяет снизить нагрузку на рендеринг.
Для получения более подробной информации см. статью Рендеринг источников света с чередованием.
Настройка дистанций видимости#
Вы можете управлять визуализацией источников света и отбрасываемых теней, указав параметр visibility distances.
Глобальные настройки для всех источников света (World, Omni, Projected) можно установить в разделе Visibility Distances окна Settings.
Установка ограничений для прозрачных объектов#
Непрозрачная геометрия затеняется на Forward проходе рендеринга. Поскольку все источники света применяются к каждой прозрачной поверхности в цикле, настоятельно рекомендуется, чтобы количество источников света, воздействующих на прозрачные объекты, было как можно меньше для обеспечения оптимальной производительности.
Глобальные настройки освещения включают Forward Per-Object Limits, где вы можете ограничить количество определенных источников света, которые одновременно воздействуют на каждый прозрачный объект.
Рендеринг света на воде#
Если ваша сцена содержит водные объекты, вы можете отключить рендеринг освещения от источников света на них. Это значительно повысит производительность.
-
Выберите источник света в файле World Hierarchy.
-
В окне Parameters перейдите в раздел Render и отключите параметр Water.
World Light#
World Light источник освещает все объекты, расположенные в пределах дистанции видимости теней тем самым увеличивая объем вычислений теней. Поэтому рекомендуется, чтобы количество объектов World Light в сцене было как можно меньше. Для большинства задач с точки зрения производительности проекта больше подходят другие источники света (Projected Light и т.д.).
Для World Light движок создает каскадные карты теней (максимум каскады 4). Для каждого каскада требуется отдельный проход рендеринга.
На производительность можно повлиять, уменьшив количество рендеримых каскадов в окне Parameters (параметр Number of Cascades). Однако изменение количества каскадов также влияет на качество визуализируемого изображения, поэтому постарайтесь найти баланс.
Omni Light#
Источники света Omni излучают свет во всех направлениях, что позволяет воспроизводить реалистичные тени.
Источник света Omni использует 6 камер , которые генерируют карты теней, поэтому затенение этим источником света требует 6 проходов рендеринга и может значительно снизить производительность. Поэтому старайтесь, чтобы количество таких источников света было как можно меньше. Для повышения производительности вы можете отключить рендеринг теней, создаваемых источником света Omni в определенных направлениях или использовать источники света Projected вместо Omni.
Однако есть способ использовать в сцене много источников света Omni без негативного влияния на производительность: для них следует отключить тени (нескринспейсовые тени ). Поскольку движок использует тайловый рендеринг для источников света Omni с отключенной формой и тенями Point, они будут сгруппированы и отрисованы в пакетах, что уменьшит количество вызовов DIP и сделает источники света Omni самыми быстрыми источниками света в сцене.
Соответствующие настройки доступны в разделе Batching:
Эта оптимизация позволяет задействовать большое количество источников света Omni без существенного снижения производительности.
Вы также можете управлять рендерингом источников света Omni и отбрасывать тени, указав дистанции видимости для источников света. Когда камера находится на заданном расстоянии от источника света, он отключается. То же самое можно указать для отбрасываемых теней:
- Откройте окно World Hierarchy и выберите источник света Omni.
- В окне Parameters настройте Distance Visibility Settings.
Projected Light#
Источники света Projected излучают свет из одной точки, образуя световую пирамиду. Такие источники света создают тени, которые требуют только 1 прохода рендеринга, поэтому они дешевле с точки зрения производительности.
Однако влияние этих источников света на производительность также можно уменьшить, указав дистанции видимости для источников света и отбрасываемых теней:
- Откройте окно World Hierarchy и выберите источник света Projected.
- В окне Parameters укажите файл Distance Visibility Settings.
Voxel и Environment Probe#
Источник света Voxel Probe обеспечивает статическое воксельное освещение и затенение объекта внутри Probe с помощью предварительно запеченной 3D-карты освещения. Voxel Probe является обязательным объектом для запекания непрямого освещения от источников света в статическом режиме.
Использование Voxel Probe в качестве вставки внутри другого Voxel Probe значительно снижает производительность. Более того, если вы добавите несколько вложенных объектов Voxel Probe с совпадающим размером, визуальный результат будет таким же, как если бы вы добавили один Voxel Probe. Однако производительность упадет. Поэтому по возможности старайтесь избегать подобных ситуаций.
Основной параметр Voxel Probe, существенно снижающий производительность, — Cubic Filtering. Отключите его, если линейной фильтрации окружающего освещения достаточно.
Еще один параметр, влияющий на производительность, — Reflections. При включении Voxel Probe используется и для окружающего освещения, и для отражений. Для моделирования отражений мы рекомендуем использовать Environment Probe.
Источник света Environment Probe обеспечивает проецирование окружающего освещения и отражений на объект внутри Probe с помощью кубической карты. Однако основная цель Environment Probe — рендеринг отражений. А для освещения мы рекомендуем использовать Voxel Probe: просто отключите освещение Ambient в окне Parameters.
Такой подход позволяет повысить производительность приложения без потери визуального качества: использование одновременно Environment и Voxel Probes для окружающего освещения и отражений редко дает заметное визуальное улучшение.
Фейковое освещение#
Когда вам нужна только визуализация источника света без подсветки, вы можете воспользоваться одним из приемов, описанных ниже.
Использование биллбордов#
Billboards можно использовать для имитации небольших источников света, наблюдаемых с больших расстояний. В таких случаях имеет значение только визуализация самих источников света. Например, вы можете использовать Billboards для огней взлетно-посадочных полос. Сами по себе они ничего не освещают, но выглядят как настоящие огни.
Чтобы создать Billboard, заменяющий реальный источник света, выполните следующие действия:
-
Добавьте объект Billboard на сцену, выбрав Create -> Billboards -> Base в строке меню, и поместите его где-нибудь в мире.
- Назначьте материал, унаследованный от материала billboards_base.
-
Укажите следующие параметры для этого материала:
-
На вкладке Common установите для смешивания Preset значение Additive и выключите параметр Depth Write, чтобы избежать создания препятствий объектам за Billboard.
-
На вкладке States отключите запись в Deferred Buffers и включите следующие состояния:
- Emission, чтобы обеспечить эффект излучения с помощью соответствующей текстуры.
- Geometry Inflation, чтобы ограничить минимальный размер экрана Billboard фиксированным значением и, следовательно, обеспечить видимость с дальних расстояний.
- Soft Interaction, чтобы сделать взаимодействие Billboard с другими объектами сцены более мягким и избежать артефактов.
-
Во вкладке Textures укажите текстуры Diffuse и Emission.
-
В окне Parameters укажите следующие значения:
- Установите множитель цвета Diffuse на черный , чтобы Billboard стал полностью прозрачным.
- Увеличьте Emission Scale, чтобы сделать Billboard ярче.
- Увеличьте параметры геометрии для масштабирования размера Billboard и ограничения минимального размера Billboard.
- При необходимости исправьте значение Soft Interaction.
-
В результате вы получаете Billboard, который можно использовать для имитации небольшого источника света на дальних расстояниях. Вы можете добавить любое нужное количество Billboards к существующему объекту Billboard: в окне Parameters выберите в списке созданный Billboard и нажмите Add.
Использование волюметриков#
Объекты Volumetric можно использовать для имитации объемов видимого света вместо использования реальных источников света. Такие объекты следует использовать, когда вам не нужна подсветка. Например, используя объекты Volumetric, вы можете создавать сферы , лучи , или объемы, симулировать солнечные лучи попадающие в помещение через проемы и так далее.
Чтобы создать такие световые объемы, выполните следующие действия:
-
Добавьте объект Volume Sphere, выбрав Create -> Volume -> Sphere Light в строке меню, и сделайте его дочерним элементом ноды, которая должна излучать свет.
- В разделе Volume Sphere окна Parameters измените размер сферы на 0.15.
-
Во вкладке Node окна Parameters установите координаты объемной сферы на родительскую ноду, а затем немного подкорректируйте положение сферы, чтобы она выглядела реалистично.
-
Назначьте материал, унаследованный от базового материала volume_light_base, и укажите необходимые значения на вкладке Parameters. Например, вы можете установить цвет световой сферы и масштабировать плотность света.
-
Добавьте объект Volume Projected, выбрав Create -> Volume -> Projected в строке меню, и сделайте его дочерним элементом ноды, которая должна излучать свет.
-
На вкладке Node окна Parameters сбросьте положение и поворот Volume Projected на родительские ноды.
-
В секции Volume Projected окна Parameters укажите необходимые параметры светового луча. Например, изменить его размер, радиус, угол раскрытия и шаг .
- Назначьте материал, унаследованный от базового материала volume_proj_base.
-
В окне Parameters материала установите цвет светового луча так же, как и для Volume Sphere, и уменьшить диффузная шкала на 0.5, чтобы сделать цвет менее ярким.
В результате у вас получится световая сфера и луч, имитирующий настоящий источник света.