Лучшие практики команды Spotlight: Создание правдоподобных визуальных эффектов в Unity

Будучи частью команды Spotlight, мне посчастливилось участвовать в некоторых очень интересных проектах. Команда Spotlight в Unity работает над играми вместе с нашими клиентами, и значительная часть моей роли заключается в том, чтобы помочь разработчикам добиться желаемого внешнего вида и качества их проектов. Я слышу множество историй из разных уголков индустрии и могу определить общие проблемы, с которыми сталкиваются создатели контента. Несколько проектов, над которыми я работал, были нацелены на достаточно реалистичную визуальную составляющую. Учитывая художественное содержание проекта, как сделать сцену в Unity, которая будет выглядеть правдоподобно?
Существует множество тем, которые необходимо затронуть, чтобы сделать правдоподобные визуальные образы. В этом посте я расскажу о настройках освещения и рендеринга. Далее в этом посте я также поделюсь нашим образцом сцены туннеля Spotlight и расскажу, как вы можете использовать его для обучения и экспериментов.
Понимание того, как можно использовать возможности рендеринга Unity для реалистичной имитации реального мира, поможет вам достичь визуальной цели вашего проекта.
Линейный режим рендеринга
Проще говоря, это позволяет Unity выполнять расчеты освещения и затенения с использованием физически точной математики, а затем преобразовывать конечный результат в формат, который лучше всего подходит для мониторов.
Чтобы задать гамму или линейный рабочий процесс,
перейдите в меню Edit > Project Settings > Player и откройте Player Settings.
Затем перейдите в Other Settings > Rendering и измените Color Space на Linear.
Определение цветового пространства должно быть одним из самых ранних решений в вашем проекте, поскольку оно оказывает значительное влияние на конечные результаты затенения и освещения.
Режим рендеринга.
В образце сцены Spotlight Tunnel Sample Scene мы используем отложенный путь рендеринга. Это позволяет создателям контента эффективно работать с несколькими динамическими источниками света, комбинировать несколько кубических карт отражения и использовать существующие в Unity 2017+ функции Screen Space Reflection.
Чтобы установить этот параметр, перейдите в меню Graphic Settings > Rendering Path или Camera > Rendering Path.
Более подробную информацию о режимах рендеринга вы можете найти в этой части документации Unity.
Камера с высоким динамическим диапазоном (HDR).
При рендеринге правдоподобного освещения, как в реальной жизни, создатели контента будут иметь дело со значениями освещенности и излучающими поверхностями, яркость которых превышает 1 (высокий динамический диапазон). Затем эти значения нужно перенести в соответствующий диапазон экрана (это называется тоновым отображением). Эта настройка необходима для того, чтобы камера Unity могла обрабатывать эти высокие значения и не обрезать их.
Чтобы включить эту функцию, выберите основную камеру на сцене и убедитесь, что на вкладке "Инспектор" для выбранной камеры установлен флажок HDR.
Кодирование HDR Lightmap. (необязательно)
В примере сцены Spotlight Tunnel не использовалось запеченное освещение, однако если вы планируете работать с запеченным освещением высокой интенсивности (HDR), мы рекомендуем вам установить кодировку lightmap на HDR lightmap, чтобы убедиться, что результат запеченного освещения будет соответствовать.
Опцию можно найти в меню Edit > Project > Player settings > Other settings > Lightmap encoding (только для Unity 2017.3+).
Подробную информацию о кодировании Lightmap можно найти в руководстве.
Tonemapper для вашей сцены (часть стека постобработки).
Для правильного отображения HDR-освещения в проекте должен быть включен тоновый маппер.
Сначала установите Unity Post Processing Stack (версия 1) из магазина Asset Store.
Создайте в проекте ассет Post Process Profile Asset и настройте его следующим образом:
- Включить цветокоррекцию > Tonemapper > ACES
(Стандарты кодирования цвета Академии) - Включить дизеринг. Dithering позволяет сцене уменьшить артефакт полосчатости, возникающий при 8-битовом/канальном выходе из HDR-сцены. Современные движки используют эту технику, чтобы обойти ограничение на вывод 16M цветов. Остальные настройки в tonemapper пока оставьте в покое.
- Выберите "Основную камеру" и добавьте компонент Post Processing Behaviour.
- Назначьте созданный ранее профиль Post Process в слот профиля. Если вы хотите использовать Post Processing Stack версии 2, обратитесь к readme пакета, так как в настоящее время он находится в бета-версии.
- Включите эффект изображения для области просмотра.
Это позволит вам постоянно видеть тональный маппер во время работы с представлением "Сцена".
Заметьте, как улучшилась передача светлых тонов и разделение значений темного туннеля в тонемаппированной сцене. Если вы посмотрите на нетонированную сцену, то увидите, как блики не сходятся в единый цвет (в данном случае - желтоватое жгучее солнце).
Эта установка, по сути, пытается воспроизвести съемку сцены цифровой камерой с фиксированной экспозицией (без включения функций адаптации экспозиции и адаптации глаз).

На этом этапе создатели контента достигли правильной базовой настройки рендеринга сцены, которая должна давать правдоподобные результаты при работе с широким спектром контента.
Unity рассчитана на множество различных стратегий/систем освещения и сценариев проектов. Мы рекомендуем вам ознакомиться с нашей обширной документацией по режимам освещения и настройкам, чтобы понять все возможные варианты.
Однако для быстрой итерации и простоты необходима отзывчивая визуальная обратная связь.
По этой причине в образце сцены Spotlight Tunnel Sample Scene используется освещение в реальном времени с помощью глобального освещения Realtime Global Illumination (GI). Это обеспечит нам хороший диапазон спекулярного отклика, хорошее отраженное освещение и позволит менять освещение на лету.
Освещение в реальном времени с помощью Realtime GI + Light Probe


Возвращаясь к самому освещению, можно сказать, что типичную сцену в дневное время с открытыми площадками можно разбить на 3 компонента освещения:
1) Полушарие (вклад в небо).
2) Прямой свет (солнце + местное освещение).
3) Непрямое освещение (GI освещение).
На этом этапе предполагается, что у создателей контента есть сетки с правильной текстурой и собранная сцена.
Первоначальное освещение полушария
Первым компонентом для наружного освещения является освещение полусферы, называемое в Unity Environment Lighting. Это модное слово для обозначения светового люка. Ночное небо имеет минимальный вклад, а дневное - очень яркий. Настройки полусферы можно найти на вкладке "Освещение" (Окно > Освещение > Настройки > Окружение).
Для начала вместо HDRI cubemap лучше использовать процедурный материал skybox. Создайте новый материал в проекте, назовите его SkyMaterial и установите для него режим Skybox / Procedural.

Назначьте его материалу Environment Skybox Material на вкладке Lighting > Scene.

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

Косвенное освещение / Глобальное освещение.
Направленный свет + окружение сами по себе не создадут правдоподобного освещения. Для правильного освещения полусферы необходимо заслонить освещение от светового люка. Нам также нужно имитировать солнечный свет, отражающийся от объектов в сцене. Небо в настоящее время отображает одно значение цвета в сцене, делая ее плоской. Здесь требуется Realtime Global Illumination или Baked Lighting для расчета окклюзии и непрямого отраженного освещения. Чтобы добиться этого, выполните следующие действия:
- Убедитесь, что все сетки, которые должны вносить вклад в Realtime GI или запекание, отмечены флажками Enable Lightmap Static и Reflection Probe Static. Как правило, это большие статические сетки.
- Затем включите глобальное освещение в реальном времени (оставьте средние настройки по умолчанию) на вкладке "Освещение" > "Сцена" > "Освещение в реальном времени".
- Нажмите кнопку Generate Lighting или установите флажок Auto Generate.

Ух ты, сцена стала темной после окончания генерации света. Усугубляет ситуацию то, что некоторые элементы сцены не на своем месте - обратите внимание на трамвай и дверь на заднем плане.
Статические объекты в сцене в настоящее время имеют правильную окклюзию для полусферы и непрямой отклик от направленного света, однако остальные объекты не имеют правильной настройки освещения.
Световые зонды и зонды отражения.
Чтобы динамические объекты или объекты, не являющиеся световыми картами, получали глобальное освещение в реальном времени (Realtime/Baked Global Illumination), в сцене должны быть распределены световые зонды. Убедитесь, что группы световых зондов в Сцене эффективно распределены вблизи областей, где находятся или будут проходить динамически освещаемые объекты (например, игрок). Подробнее о группе Light Probe в руководстве.
Нажмите кнопку Generate Lighting еще раз или дождитесь окончания предварительных вычислений, если установлен флажок Auto Generate.

Трамвай и дверь на заднем плане отшлифованы лучше, но отражения выглядят неуместно. Отражение неба повсюду и проявляется внутри туннеля. Именно здесь на помощь приходят зонды отражения. Эффективное размещение зондов отражения с надлежащим покрытием в Сцене по мере необходимости. В приведенной выше сцене достаточно одного отражающего зонда для главного помещения и двух для каждого внутреннего туннеля.
Разрешение Cubemap в 128 пикселей при использовании проекции коробки обычно является хорошим базовым уровнем для типичных случаев и позволит сохранить память и время запекания отражений.
Вот более подробная информация о Reflection Probe.

Теперь сцена выглядела обоснованной и целостной, что является важной составляющей правдоподобной сцены. Но все стало еще мрачнее, чем раньше, и не приближается к правдоподобному качеству.
Значение освещения HDR
Многие создатели контента не понимают, что на самом деле освещение полусферы и солнечный свет - это очень яркие источники света. Они гораздо ярче, чем значение 1. Именно здесь на помощь приходит HDR-освещение.
На данный момент отключите направленный свет, а затем установите для SkyMaterial Exposure значение 16.
Это даст вам представление о том, как правильное освещение полусферы влияет на сцену.

Все начинает выглядеть правдоподобно. Представьте себе это состояние как пасмурный день, когда солнечный свет полностью рассеян в небе, поэтому нет направленного света.
В этот момент вы можете вернуть солнечный свет в сцену с гораздо более высоким значением. Попробуйте для начала интенсивность 5. Несмотря на то, что солнце выглядит почти белым, важно правильно выбрать цвет направленного света, так как влияние непрямого цвета от сильного солнца может кардинально изменить облик Сцены.

Теперь солнце (направленный свет) выглядит как высокоэнергетический свет, как и ожидалось в реальной жизни. На данный момент сцена выглядит вполне правдоподобно.
Окружающее пространство экрана (Ambient Occlusion) и отражение пространства экрана (Screen Space Reflection)
Хотя освещение в Scene выглядит довольно хорошо, вы можете добавить к нему дополнительные детали, чтобы расширить его возможности. Прорисовка детальной окклюзии обычно невозможна из-за ограниченного разрешения, установленного в Realtime GI для приемлемой производительности. Здесь на помощь может прийти Screen Space Ambient Occlusion. Включите SSAO в профиле постобработки в разделе Ambient occlusion. Настройки для этого примера установлены: интенсивность 0,5, радиус 1, среднее количество образцов с понижающей дискретизацией и флажок Ambient Only для начала.

В то время как SSAO заботится о дополнительной окклюзии окружающего освещения, отражение могло бы получить некоторые улучшения точности в дополнение к простым пробникам отражения.
Screen Space Raytraced Reflections поможет исправить эту ситуацию. Включите отражение пространства экрана в профиле постобработки.

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

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

Обратите внимание, что перила на переднем плане имеют лучшую четкость по сравнению с Сценой без тумана.
Туман включается на вкладке Освещение > Сцена > Другие настройки. Цвет тумана #6D6B4EFF, здесь включена экспоненциальная плотность 0,025. При отложенном рендеринге в Unity 2017 вам также может потребоваться включить туман в профиле постпроцесса, если он не активирован автоматически.
Прожектор / точечный светильник
Основными элементами локального освещения в реальном времени являются прожекторы и точечные светильники. Освещение области можно использовать только при запекании освещения, если вы не используете HD Scriptable Render Pipeline (SRP), представленный в бета-версии 2018.1. В режиме HD SRP появились новые светильники, которые можно визуализировать в реальном времени.
По сути, оба этих типа осветительных приборов излучают свет из одной точки пространства и ограничены по дальности, а прожектор имеет дополнительное ограничение по углу наклона. Более подробная информация об освещении находится в соответствующем разделе документации Unity.
Основные различия между этими двумя источниками света связаны с тем, как они отбрасывают тени и взаимодействуют с печеньем. При затенении точечным светом используется 6 карт теней по сравнению с одной картой тени прожектора. По этой причине точечные светильники, отбрасывающие тень, стоят гораздо дороже и должны использоваться очень редко.
ПРИМЕЧАНИЕ: С запеченными лампами этот вопрос не стоит.
Еще одно различие заключается в том, что текстура печенья на Spotlight - это простая прямая 2D-текстура, в то время как для точечного света требуется кубическая карта, обычно создаваемая в 3D-программе.
Цвет и интенсивность света.
Чтобы получить правдоподобные результаты, при выборе цвета и интенсивности освещения необходимо придерживаться некоторых рекомендаций.
При выборе интенсивности освещения в помещении старайтесь, чтобы интенсивность освещения не превышала интенсивность солнечного света. В зависимости от сцены это может создать несбалансированный вид.

Учитывая эту настройку Sample Scene, очень маловероятно, что с потолка светит свет высокой интенсивности, превышающий яркость дневного света.
При выборе цвета старайтесь не оставлять ни один из цветовых каналов полностью. Это создает свет, который с трудом сходится к белой точке.

Хотя технически это правильный светлый цвет, светлый цвет на левом изображении удаляет весь синий цвет из конечного результата. Ограниченная финальная цветовая палитра в Scene для базового уровня - не самая лучшая идея, особенно если вы хотите впоследствии заняться цветокоррекцией.
Излучающие поверхности
В Unity излучающие поверхности могут вносить свой вклад в освещение, если включена функция Realtime GI или baked GI, что дает эффект освещения области. Это особенно полезно, если включен режим Realtime GI. Создатели контента могут изменять интенсивность и цвет излучающей поверхности и получать обратную связь немедленно, при условии, что предварительный расчет был выполнен заранее.

На изображении выше показан тонкий рассеянный свет от сетки на потолке.
Команда Unity San Francisco Spotlight Team создала Spotlight Tunnel Sample Scene, чтобы помочь создателям контента в обучении и экспериментах.

Получить файл с образцом проекта Spotlight Tunnel Sample можно здесь.
Просто распакуйте проект в папку и откройте его с помощью Unity.
Проект Spotlight Tunnel был создан с помощью Unity 2017.1.0f3.
При открытии этого проекта в новой версии Unity потребуется переделать освещение, так как возможна несовместимость формата данных освещения между версиями.
Все активы, предоставленные в этом проекте, могут быть использованы только в проекте, разработанном на движке Unity Engine.
Как уже говорилось, есть много вещей, о которых нужно знать при создании правдоподобных визуальных образов. Подробнее об этой теме вы можете узнать из этого руководства. Мы также собираемся добавить полное руководство по лучшим практикам в Unity Docs. Следите за новостями!

Надеюсь, этот блог поможет создателям контента не сбиться с пути в достижении правдоподобных визуальных эффектов в Unity. Мы ждем не дождемся, когда нас ошеломят все создатели контента Unity.