Industry

Книга мертвых: Квиксел, ветер, построение сцен и приемы оптимизации контента

JULIEN HEIJMANS / UNITY TECHNOLOGIESAnonymous
Jun 29, 2018|18 Мин
Книга мертвых: Квиксел, ветер, построение сцен и приемы оптимизации контента
Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.

В этой серии блогов мы рассмотрим все аспекты создания нашей демоверсии Книга мертвых. Сегодня мы расскажем о нашем сотрудничестве с Quixel, о нашей ветровой системе, о создании сцен и приемах оптимизации контента. Это четвертый блог из нашей серии "Making Of". Если вы пропустили, посмотрите три предыдущих поста, в которых рассказывается о творческом процессе создания персонажей, концепт-арта и фотограмметрических активов, деревьев и VFX в Book of the Dead.

Привет! Меня зовут Джулиен Хейманс, я работаю художником по окружению в команде Unity Demo. Я присоединился к Unity только в прошлом году, но у меня за плечами около 7 лет опыта работы в индустрии видеоигр. В этом блоге вы узнаете о создании "Книги мертвых" с моей точки зрения, с точки зрения создателя контента и художника по окружению.

Я вроде бы новичок в работе с фотограмметрическими активами, но отчетливо помню тот день, когда Quixel объявил о создании Megascans несколько лет назад. С тех пор я с нетерпением ждал возможности поработать с их активами. Присоединившись к команде Unity по разработке демоверсий, я начал работать над The Book of the Dead.

Если вы хотите начать экспериментировать с инструментами, о которых шла речь в этом блоге, вы можете скачать "Книгу мертвых": Экологический проект уже сейчас.

Скачать проект

Партнерство с Quixel
Quixel、Megascans、フォトグラメトリ、環境アート

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

В процессе производства команда демонстраторов создавала список необходимых им активов, а Quixel подбирал новые активы, если в существующей библиотеке не было подходящих. Многие из этих объектов представляли собой растительность, такую как трава, растения и кусты, для сканирования которых требуется соответствующее оборудование и настройки.

Quixel не только предоставили нам текстурные листы для этих активов, но и создали геометрию с их LOD и настройкой цвета вершин для поддержки нашего шейдера ветра.

Заголовок

Между выпуском "Книги мертвых": Мы получили более 50 высококачественных и сложных активов, которые с трудом бы уложились в сроки с тем небольшим количеством художников, которое есть в команде.

Во время производства мы смогли довольно быстро запустить активы в движок, и они выглядели хорошо. Мы часто настраиваем текстуры (в основном альбедо, настраиваем яркость/уровни/кривые и часто настраиваем цвета, чтобы унифицировать их по всей сцене), перепаковываем их должным образом, немного подправляем LOD до нужного уровня, назначаем текстуры новому материалу HDRP Lit, и на этом все.

К счастью, компания Quixel недавно выпустила инструмент Megascans Bridge, который сделает большую часть работы по импорту, которую мы выполняли вручную. Это позволяет сэкономить время на перепаковке текстур для HDRP и т.п.

Заголовок

Для тех, кто интересуется другими активами Megascans, напоминаем, что в Unity Asset Store есть несколько коллекций Megascans. Все активы готовы к импорту в проект, настроенный с помощью конвейера рендеринга высокой четкости или облегченного конвейера рендеринга.

Ветер
Изображение

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

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

Торбьорн Лаэдре, наш технический руководитель, создал шейдер, который поддерживает несколько различных типов растительности, используя 3 разных техники:

  • Hierarchy Pivot, для наших деревьев и некоторых растений с очень определенной структурой/иерархией
  • Одноповоротный, для травы, мелких растений и для крупного кустарника с неопределенной структурой/иерархией
  • Процедурная анимация - для растительных объектов, где невозможно предсказать повороты.
Изображение

Деревья оказались более сложными для подготовки активами: с точки зрения контента они используют анимацию типа Hierarchy Pivot и опираются на 3 разных уровня иерархии:

  • Багажник, который лежит на земле.
  • Филиалы уровня A, которые подключены к магистрали.
  • Филиалы уровня B, которые соединены с филиалами уровня A.

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

Изображение
  • Значение 0 для зеленого канала цвета вершины означает, что это ствол.
  • Значение между 0 и 1 будет означать уровень ветвей A
  • Значение 1 соответствует уровню ветвей B

Я сделал это, используя Autodesk Maya, с помощью небольших скриптов я смог настроить все LOD для актива за 10-15 минут.

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

Заголовок

Подготовив всю эту информацию, я мог использовать сценарий C#, который вводил мой префаб дерева и генерировал новый префаб с информацией о повороте каждой вершины. После добавления объекта WindControl в сцену я могу импортировать дерево в сцену и начать играть со свойствами материала.

Вы можете видеть, что каждый уровень иерархии имеет свойство range (в основном длина ствола или ветвей) и свойство elasticity (эластичность).

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

И последнее, но не менее важное: мы должны были сделать звук ветра FX влияющим на анимацию ветра. Громкость звука определяет силу ветра в анимации. Удивительно, как простая идея может дополнить проект. Если вы еще не сделали этого, откройте проект и прогуляйтесь по нему. Вы заметите, как деревья и вся трава вокруг задрожат, когда услышите сильные порывы ветра, обрушивающиеся на окрестности.

Макет

При выборе уровня детализации и плотности проекта, подобного "Книге мертвых", мне было важно продумать, как я буду структурировать уровень, чтобы избежать проблем с производительностью на более поздних этапах производства. Одна из вещей, которую я старался тщательно продумать, - это ограничение больших расстояний просмотра в сцене. Вы можете сделать это, разместив "коридоры" и "узкие места" в макете сцены.

Изображение

Эти макеты, а также активы, правильно настроенные на флаги 'Occluder static' и 'Occludee static', сделают работу Unity по устранению окклюзии более эффективной.

В этом видео показана визуализация Occlusion Culling, и по виду сверху можно легко догадаться, куда смотрит камера. Примерно в конце видео я включаю/выключаю окклюзионную фильтрацию и смотрю, какие объекты подвергаются окклюзионной фильтрации.

Вы также сможете увидеть, что некоторые объекты не отсеиваются. В основном это очень высокие деревья, некоторые более 25 метров в высоту, которые имеют очень большую ограничительную область и поэтому их трудно отсеять за скалами.

Использование унаследованных от Unity ландшафтов

Когда вышел трейлер, мы увидели комментарии о том, что мы никак не можем использовать старую систему рельефа. Но мы используем именно это, и мы модифицировали шейдер Layered Lit в HD Render Pipeline для его поддержки.

HDRP Layered Shader позволяет смешивать слои, используя их текстуру heightmap, поэтому результат получается лучше, чем линейное смешивание, поставляемое с устаревшим шейдером рельефа.

Изображение

Это, конечно, временное решение, и оно не интегрировано в пользовательский интерфейс должным образом. Чтобы изменить рельеф, вам нужно отредактировать материал, который к нему применен, а не использовать кнопку "Редактировать текстуру" на вкладке "Текстура рисования" объекта рельефа.

Изображение
Изображение

Если вы хотите создать новый рельеф и применить к нему различные текстуры, вам нужно будет продублировать этот материал TerrainLayeredLit и назначить его новому рельефу. Вам также нужно будет создать эти 4 набора текстур на вкладке Paint Texture. Текстуры, назначенные там, не будут использоваться для рендеринга местности, но они позволят вам нарисовать различные слои на вашей местности. Там же можно изменить свойства плиток для разных слоев.

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

Заголовок

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

Разрозненные детали

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

Заголовок

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

Ветки - это простые вырезанные плоскости с альфа-материалом. Мы добавили к ним физические капсульные коллайдеры.

Заголовок

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

Этот скрипт используется объектами под названием 'UberTreeSpawner' в сцене, и вы можете использовать его по своему усмотрению.

Побочное замечание об этом инструменте: Чтобы ветки и другие разбросанные объекты правильно падали на землю и другие объекты, вам нужно иметь достаточно высокую плотность сетчатых коллайдеров на всех объектах в сцене. В то же время вы не хотите, чтобы эти тяжелые коллайдеры использовались во время игры. По этой причине большинство объектов в сцене имеют два разных коллайдера: Один свет, который будет использоваться в режиме реального времени в режиме игры контроллером PlayerController с назначенным слоем по умолчанию. А один используется исключительно для симуляции физики этих веток, с назначенным слоем 'GroundScatter' Layer.

Освещение

Книга мертвых: В проекте "Окружающая среда" используется запеченное непрямое глобальное освещение с прямым освещением в реальном времени.

Как косвенное освещение от солнца, так и прямое плюс косвенное освещение от неба запекаются в лайтмапах и световых зондах. Также запекаются зонды отражения, зонды окклюзии и другие источники окклюзии. С другой стороны, прямой солнечный свет - это освещение в режиме реального времени. Затенение в HD Render Pipeline лучше всего выглядит при использовании прямого света в реальном времени, и это также дает нам некоторую свободу в изменении вращения, интенсивности и цветовой температуры направленного света во время выполнения.

Заголовок

Поскольку косвенное освещение запечено, мы не можем слишком сильно менять интенсивность и цвет направленного света, иначе он перестанет сочетаться с запеченным освещением. Мы не смогли бы обойтись без полного цикла "день/ночь" в этой установке, хотя лес - это довольно щадящая среда с точки зрения затемнения несоответствующего косвенного освещения.

Запеченные карты освещенности используются в основном для рельефа и некоторых других объектов, но мы предпочли использовать сочетание зондов освещенности и зондов окклюзии для всех скал и утесов в проекте, поскольку они обеспечивают лучшие результаты для объектов с острыми углами и четкими картами нормалей.

Окклюзионные зонды

Освещение густого леса - сложная задача, которую нужно решить в режиме реального времени. Деревья, со всеми их листьями и ветвями, имеют огромную площадь и сложную геометрию, поэтому покрывать их лайтмапами нецелесообразно. Использование одного светового зонда на дерево обеспечит равномерное освещение снизу доверху. Light Probe Proxy Volumes ближе к тому, что нам нужно, но увеличивать разрешение сетки для получения мелких деталей нецелесообразно.

По этой причине наш старший программист по графике Роберт Купиш (Robert Cupisz) разработал зонды окклюзии.

С точки зрения художника, это очень приятная и простая в использовании функция: вы просто добавляете объект в сцену, и она отображает гизмо объема, который нужно масштабировать, чтобы он покрыл нужную область, а затем настроить параметры его разрешения по X, Y и Z.

Изображение

Он также позволяет создавать окклюзионные зонды "Detail", если вы хотите, чтобы в какой-то области сцены их количество было выше. Когда все будет готово, вам нужно будет запечь освещение всей сцены. Во время этого процесса зонды окклюзии будут запекаться.

Каждый зонд в 3D-сетке проверяет видимость неба, пуская лучи в верхнюю полусферу, и сохраняет их в виде 8-битного значения от 0 до 1. В результате мы получаем более темные участки там, где больше листьев и веток - тем более, когда несколько деревьев сгруппированы вместе.

Зонды, которым не повезло приземлиться внутри стволов или камней, будут полностью черными. Чтобы избежать утечки информации, они помечаются как недействительные и перезаписываются соседними действительными зондами.

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

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

изображение

Если вы хотите получить более четкое представление о том, как они влияют на сцену, вы также можете использовать вид SkyOcclusion Debug.

Заголовок

В Unity 2018.1 добавлен API для запекания зондов окклюзии и исключения прямого вклада неба от зондов света, а все скрипты и шейдеры доступны в проекте.

Рассеяние в атмосфере

Мы перенесли и повторно использовали решение Atmospheric Scattering, которое первоначально было разработано для демо-версии Blacksmith.

Наш старший программист Лассе Йон Фуглсанг Педерсен (Lasse Jon Fuglsang Pedersen) расширил его, чтобы использовать временную супердискретизацию, в результате чего он стал выглядеть гораздо более гладким.

изображение
Передача конвейера HD-рендера

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

изображение

Этот эффект устанавливается в двух разных местах:

  • В материале нужно выбрать тип материала "Полупрозрачный", ввести карту толщины и выбрать профиль диффузии, который находится во втором месте:
  • Настройки профиля диффузии, где вы можете редактировать все остальные параметры эффекта передачи
Заголовок

Примечание: Наша команда добавила дополнительные ползунки для раздельного управления прямой и косвенной передачей, чтобы иметь больше контроля над конечным результатом. Но это изменение не соответствует правилам PBR и поэтому не попадет в конвейер рендеринга HD.

Объемы площадей

Area Volumes построены на базе основной системы томов, предлагаемой SRP, и очень похожи на Post Process Volumes. Их функция - управлять свойствами объекта в зависимости от положения объекта "Главная камера".

Свойства некоторых объектов, включая Directional Light, Atmospheric Scattering, Auto Focus и WindControl, определяются Area Volumes, поэтому, если вы хотите, например, изменить текущую настройку освещения, вам нужно будет сделать это в соответствующем Area Volume. Эти объекты Area Volumes находятся в основной сцене, в разделе _SceneSettings > _AREASETTINGS, и имеют суффикс '_AV'.

Окно отладки

Для тех, кто не часто использует HD Render Pipeline, теперь есть специальное окно отладки SRP, которое можно открыть через меню Window > General > Render Pipeline Debug.

изображение
изображение

С его помощью вы сможете увидеть отдельные слои GBuffer, компоненты освещения или определенные карты текстур из ваших материалов, а также переопределить альбедо/гладкость/нормальность. Это действительно полезный инструмент, когда у вас есть объекты, которые неправильно отображаются, или любые другие визуальные ошибки. Это поможет вам гораздо быстрее определить источник проблемы.

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

изображение

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

Оптимизация

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

  • Все наши материалы используют GPU Instancing.
  • Мы используем LOD для большинства объектов в этой сцене, поэтому это необходимая вещь.
  • Функция LOD Crossfade великолепна, она позволяет получить плавное смешение между различными уровнями детализации объекта. Но эта функция довольно тяжелая и может сильно увеличить количество вызовов рисования в вашем проекте. По этой причине мы отключили его на максимально возможном количестве активов.
  • Чтобы избежать заметного перехода между LOD, мы начали использовать карты нормалей Object Space для многих крупных скал и утесов.
название
изображение

Примечание: Использование карты нормалей Object Space вместо карты нормалей Tangent Space снизит точность карты нормалей. Это не очень заметно на наших объектах, которые очень грубые и шумные, но вы, вероятно, не захотите использовать его для объектов с твердой поверхностью.

  • Несмотря на важность ограничения расстояния обзора при построении сцены и использовании окклюзии, стоит также знать, что многие вызовы рисования, используемые для рендеринга сцены, на самом деле происходят от рендеринга каждого каскада ваших карт теней (в нашем проекте - направленного света).
  • У нас было много вызовов, исходящих от небольших растительных объектов, разбросанных по местности, - сотни и сотни в некоторых местах. Мы добились значительного сокращения количества вызовов, создав большие участки травы и растений. Вместо сотен их у нас будет всего 15-20.
    Обратите внимание, что это влияет на визуальное качество: с такими большими активами становится очень трудно избежать обрезания травы камнями и другими активами, расположенными на земле.
  • Мы используем очистку слоев, эта функция уже есть в Unity, но у нее нет пользовательского интерфейса. Эта функция позволяет отбирать объекты, назначенные определенному слою, в зависимости от расстояния, на котором они находятся от камеры. Торбьорн расширил эту функцию, чтобы также убирать тени, отбрасываемые этими объектами на другом расстоянии. Например, большинство наших небольших растительных активов перестают отбрасывать тени на расстоянии около 15 метров, что не очень заметно, учитывая количество шума от травы и других растений на земле, а затем они полностью вырезаются на расстоянии около 25 метров - независимо от того, как настроены их LODGroup.

---

Следите за следующей статьей в блоге. Мы изучим, как создавались тени, освещение, постобработка и многое другое в "Книге мертвых".

Если вы не смогли приехать на Unite Berlin, мы скоро выпустим презентацию Джулиена Хейманса об искусстве окружения в демо-версии. Вы можете следить за нашим каналом на YouTube, чтобы быть в курсе, когда выйдет это видео.

Дополнительная информация о книге мертвых