Бенчмарк Valley
![](https://habrastorage.org/storage2/e3a/e76/a17/e3ae76a1712ccbc5084fadcf52b9b35b.jpg)
Это вторая и заключительная часть статьи, посвященной процедурным методам производства контента для 3D приложений. Первую часть Вы можете найти здесь.
В этой части, так же как и в предыдущей, приводятся ссылки на скачивание созданных нами исходных материалов, которые можно свободно использовать (с изменениями или без) в своих проектах, но только не продавать/распространять в чистом виде и/или в составе каких-либо библиотек.
Напоминаем, что все эти исходные файлы не подвергались никакой специальной подготовке, обработке или оптимизации, чтобы не приукрашивать реальную ситуацию (довольно часто в процессе работы приходится жертвовать универсальностью/удобством создаваемых решений в пользу сэкономленного времени).
В этот раз речь пойдёт о том, какими средствами и приёмами мы пользовались при создании бенчмарка Valley, чтобы в максимально сжатые сроки произвести большое количество фотореалистичного контента.
То, что у нас получилось, Вы можете оценить здесь, бесплатно скачав бенчмарк или же просто просмотрев видеоролик:
Итак, при работе над этим проектом перед нами стояла задача создания максимально реалистичной сибирской горной долины размерами 8 на 8 километров с большим разбросом масштабов создаваемых объектов (от горы до цветка на лугу) и высоким уровнем детализации.
Перед тем, как приступить непосредственно к производству, мы разбили весь необходимый контент по принципам подхода к его созданию:
- меши и текстуры камней, деревьев, травы, цветов и т.д.
- ландшафт (и маски распространения по нему различных объектов)
- текстуры для специфических эффектов, некоторых природных явлений и объектов
Если контент, указанный в первом пункте, создаётся в большинстве случаев любыми привычными средствами 3D моделирования и текстурирования, то перечисленное в пунктах 2 и 3 требует особых подходов, в которых и были использованы средства процедурной генерации.
Так, например, программа World Machine использовалась как специализированный инструмент для генерирования ландшафтов и масок распространения объектов, а программа Filter Forge — для создания:
- текстур облаков
- текстур мха
- эффекта пыли от ветра
- эффекта светящейся пылевой взвеси
- эффекта грязной линзы (Lens Flares Dirt)
Облака
Billboard clouds в бенчмарке Valley
![](https://habrastorage.org/storage2/47c/06c/c53/47c06cc5362c6d8f432c2ed9720b7397.jpg)
В движке Unigine есть инструменты для симуляции как физически корректных динамически изменяющихся облаков (physically-based volumetric clouds), так и создания статичных облаков нужной формы в требуемых местах (billboard clouds).
Инструмент для создания billboard clouds позволяет формировать массив billboard’ов (billboard — полигон, который всегда направлен в камеру) случайным образом, заполняя ими исходный габаритный меш (bound mesh) по заданным параметрам (например, таким как количество, базовый размер, разброс размера), и в дальнейшем манипулировать всеми параметрами вплоть до изменения позиции любого отдельного billboard’а.
Настройка параметров объекта Billboards в движке Unigine
![](https://habrastorage.org/storage2/004/955/b9d/004955b9dba3644b089a4481313d7517.jpg)
Чтобы превратить полученный массив полигонов в облака, на него назначается специальный материал, учитывающий освещение от глобального источника света (солнца), а также рассеивание света (light scattering). В этом материале назначается диффузная текстура, состоящая из нескольких отдельных полупрозрачных фрагментов облака, которые случайным образом назначаются каждому отдельному billboard’у.
Диффузная текстура фрагментов облака была создана процедурными средствами редактора Filter Forge.
Меш, в объёме которого генерируются billboard’ы облака (сверху) и диффузная текстура облаков (снизу)
![](https://habrastorage.org/storage2/6fc/a6b/615/6fca6b6153292e5cbeb937eb79803d8c.jpg)
![](https://habrastorage.org/storage2/f77/bd6/94e/f77bd694ebeb204506820849b93926c1.jpg)
Скачать clouds_variation.ffxml
Мох на камнях
Мох на камнях в бенчмарке Valley
![](https://habrastorage.org/storage2/280/8bb/246/2808bb246cf0eee79419e02684f0336b.jpg)
Для создания мха на камнях в Unigine используется специальный материал, который позволяет комбинировать 2 материала, один из которых проецируется на второй по маске в world space.
Параметры материала мха
![](https://habrastorage.org/storage2/884/6a0/4e7/8846a04e7b3d79f43e9f88ce16a2f238.jpg)
Удобство этого материала сложно переоценить, потому как если просто запекать мох в текстуры камней, мы сразу же лишаемся возможности свободно вращать (по всем трём осям) и позиционировать эти камни на ландшафте (хочется, чтобы мох лежал только сверху камней), а также лишаемся необходимой хаотичности симулируемого природного объекта, что сразу же будет бросаться в глаза и в целом плохо скажется на реализме получаемой картинки.
Форму фрагментов мха определяют две текстуры — грубая, но уникальная для всей поверхности ландшафта маска и детальный, но повторяющийся (из-за тайлинга) альфа-канал диффузной текстуры. Эти два исходных значения прозрачности перемножаются, и в итоге получается детализированный уникальный рисунок мха в каждой точке поверхности.
Все текстуры (включая карту нормалей) и маска для этого природного объекта были сгенерированы в Filter Forge.
Diffuse (сверху), normal (посередине), irregularity (снизу) текстуры мха
![](https://habrastorage.org/storage2/d99/c62/646/d99c6264668abef50c072593a066a6a8.jpg)
![](https://habrastorage.org/storage2/134/74a/11d/13474a11d244827ff8411487d4e5db92.jpg)
![](https://habrastorage.org/storage2/e5e/e75/c71/e5ee75c711531a418adda50ad6a89e39.jpg)
Скачать moss.ffxml
С помощью этого материала также легко можно симулировать ржавчину, коррозию или плесень на объектах.
Lens Flares Dirt
Эффект Lens Flares Dirt в действии
![](https://habrastorage.org/storage2/239/c01/582/239c01582cae5909a683e5f8580a257e.jpg)
В движке Unigine есть эффект, симулирующий засветку линз объектива камеры яркими источниками света. Так как в реальности не существует идеально чистых и ровных линз, а наличие на них даже крошечных пылинок вызывает при засветке довольно характерные визуальные артефакты, для большей реалистичности мы добавили возможность использовать текстуру загрязнения объектива, которая проявляется только на его очень засвеченных участках.
Необходимую текстуру для этого эффекта проще и удобнее было реализовать средствами Filter Forge, что и было сделано.
Текстура, использованная для создания эффекта грязной линзы
![](https://habrastorage.org/storage2/2c3/330/84d/2c333084dec5ad3e8230a0a780b5e998.jpg)
Скачать lens_dirt.ffxml
Ландшафт
Создание больших открытых (outdoor) сцен является довольно сложной задачей как в плане рендеринга ландшафта и множества объектов на нем в реальном времени, так и в плане создания контента для таких сцен.В Unigine для этих целей существует множество инструментов, позволяющих:
- создавать пригодные для рендеринга в реальном времени ландшафты сколь угодно больших размеров (такие возможности помимо инструментария даёт реализованная в движке асинхронная подгрузка данных)
- процедурно распределять массивы объектов на ландшафте по маскам
- формировать облака, звёзды, дождь, океан, настраивать атмосферные эффекты (atmospheric light scattering) и т.д.
Перед созданием контента для больших открытых пространств рекомендуется собрать как можно больше референсных материалов с фотографиями местности, которую требуется реализовать. Пригодятся как наземные снимки, так и аэрофотосъемка. Анализируя собранные референсные материалы, необходимо понять процессы, участвующие в формировании земной поверхности — работа в процедурных генераторах ландшафтов требует понимания таких вещей для достижения наилучшего результата.
Ландшафт в движке Unigine представляет собой объект, динамически изменяющий уровень детализации своей сетки и текстур в зависимости от степени удалённости камеры для оптимальной производительности при большой дальности видимости (более 40 километров).
Объект ландшафта с динамически изменяемой детализацией
![](https://habrastorage.org/storage2/bc8/b75/4f5/bc8b754f52348a5cda9ded7bff6fbe97.jpg)
Для создания ландшафта в движке Unigine необходимо иметь следующие исходные текстуры:
- карта высот (height map) — 16-битная grayscale текстура, которая описывает рельеф (высоту каждой точки ландшафта)
- диффузная карта (diffuse map) — текстура, которая определяет базовый цвет
- маска материалов — текстура, которая определяет области детализации тем или иным материалом (см. ниже)
Карта нормалей не требуется, потому как создается инструментами движка автоматически по карте высот.
Для детализации ландшафта используются дополнительные материалы, текстуры которых тайлятся по всей его поверхности, а степень смешивания (blending) этих материалов задаётся маской. Таким образом передаётся требуемый характер поверхности в нужных местах, будь то трава, песок, камни или любые другие типы поверхностей.
Для создания перечисленных выше исходных текстур существуют свои специализированные программы-генераторы ландшафтов. Одной из таких программ является World Machine.
World Machine
Эта программа, как и любая другая, не лишена недостатков, но была выбрана нами среди прочих (см. список в конце статьи) по ряду причин, среди которых качество получаемого результата, нодовая архитектура и богатый набор необходимых нам функций. Отдельно стоит отметить возможность выборочно рассчитывать небольшие участки текстур ландшафтов (для экономии времени вычислений), за счёт чего появляется возможность быстрого итерирования при проработке деталей, что всегда является огромным плюсом, благодаря которому заметно повышается качество создаваемого контента.Процесс создания текстур ландшафта мы разбиваем на три этапа:
- создание базовых текстур ландшафта
- создание масок детализации ландшафта и масок распространения объектов
- создание диффузной текстуры ландшафта
Для каждого этапа создаётся свой граф в World Machine, и каждый следующий этап использует результаты расчётов предыдущего. Конечно, World Machine довольно умная программа и при изменении параметров узлов, в отличие от Filter Forge, она производит перепросчёт только той ветки графа, на которую эти изменения повлияли, однако при повторном открытии файла этот просчёт осуществляется полностью с самого начала. А так как, например, расчёт результатов эрозии довольно сложен, то разбиением на разные этапы, помимо удобства работы, мы получаем ещё и сэкономленное время.
Создание базовых текстур ландшафта
Граф в World Machine, которым формируются все основные текстуры ландшафта
![](https://habrastorage.org/storage2/0c5/e33/183/0c5e33183be43e364818d49bb15acd40.jpg)
Скачать terrain_height.tmd
В самой основе графа, формирующего ландшафт, лежат три генератора шума с разным масштабом, результаты расчётов которых комбинируются для формирования, соответственно, крупных, средних и мелких элементов базовой поверхности:
![](https://habrastorage.org/storage2/3fc/3f8/b2e/3fc3f8b2eabdf18caf9c00519b4718db.jpg)
Ближе к впадинам преобладает холмистый характер поверхности, который воссоздаётся расширением областей вокруг гор фильтром (а в терминологии World Machine — устройством) Expander:
![](https://habrastorage.org/storage2/a38/26e/d1a/a3826ed1af7568d6d22d30969422a752.jpg)
Далее к полученным холмам добавляются мелкие детализированные скалы — остатки гор после эрозии:
![](https://habrastorage.org/storage2/a0c/ea8/3b9/a0cea83b940d86c11e55210167fb15a5.jpg)
Устройством Terrace добавляются уступы, затем зашумляются для устранения регулярности эффекта и ограничиваются по высоте и углу поверхности:
![](https://habrastorage.org/storage2/170/635/430/1706354307d5f7ccff035864620bda2e.jpg)
Добавляется эрозия. Это самое значимое устройство в World Machine, которое предназначено для симуляции процессов разрушения и смещения грунта под воздействием воды, ветра и температуры. Без него весь ландшафт оставался бы просто далёким от реальности набором смешанных процедурных шумов.
![](https://habrastorage.org/storage2/495/f15/8a8/495f158a86678fa4d2bdd5af23155c70.jpg)
Добавляются волнообразные смещения грунта. Под воздействием гравитации и процессов эрозии грунт стремится сползти с наклонных поверхностей к низинам, но из-за большого числа находящихся в нём корней деревьев и растений это сползание происходит целыми массивами, что визуально проявляется через складки на поверхности земли. Сформировать и отработать этот эффект более детально в World Machine помогает возможность производить вычисления результата только указанного участка ландшафта (через установку нужных Extents):
![](https://habrastorage.org/storage2/501/e0c/391/501e0c39144dde253159e05fcb786856.jpg)
На вершины гор добавляется снег. В основном это осуществляется устройством Snow, которое позволяет симулировать эффект накопления снега с учётом таких параметров как интенсивность, количество, направление ветра и т.д.
![](https://habrastorage.org/storage2/0c0/8ae/364/0c08ae3647e09d31b87db887e6e242da.jpg)
Полученные на данном этапе результаты растеризуются средствами World Machine и сохраняются в файлы. В итоге получается карта высот, карта эрозии и карта толщины снежного покрова.
Карта высот (сверху), карта эрозии (посередине), карта толщины снежного покрова (снизу)
![](https://habrastorage.org/storage2/bc8/f34/6c1/bc8f346c1eccddfeaa28ddde8244ed0a.jpg)
![](https://habrastorage.org/storage2/c58/d68/605/c58d68605367598392b2af1673e1e4c2.jpg)
![](https://habrastorage.org/storage2/9e0/c2c/da3/9e0c2cda30cd6c1e04200e94ddea7141.jpg)
Создание масок детализации ландшафта
В бенчмарке Valley для детализации ландшафта было использовано 4 материала, передающих следующие типы поверхностей:
Маски, определяющие видимость материалов этих поверхностей на ландшафте, создаются также в World Machine из полученных на предыдущем этапе текстур.
Граф в World Machine, которым формируются все необходимые маски
![](https://habrastorage.org/storage2/288/216/9a8/2882169a8af981ce572e23f7aef6a628.jpg)
Скачать terrain_masks.tmd
Маска снега
Маска снежного покрова на поверхности ландшафта
![](https://habrastorage.org/storage2/4d1/79a/446/4d179a446dfd3959db11c737ab165043.jpg)
Маска снега формируется таким образом, что интенсивность исходной карты толщины снежного покрова определяет размеры и количество кусков снега (чем темнее пиксель исходной текстуры — тем меньше количество кусков и их размер).
Маска камней
Маска распространения камней на поверхности ландшафта
![](https://habrastorage.org/storage2/a1e/fd1/c86/a1efd1c8630f12e49c7ded5032e078a6.jpg)
Карта эрозии показывает, как стекают потоки разрушенного эрозией грунта. Для получения маски камней из неё убираются места с большим наклоном поверхности ландшафта (как правило, камни на таких поверхностях не задерживаются) и убираются области с малым наклоном на низких высотах (в этих местах доминирует мелкая осадочная порода, грунт и почва).
Маска травы
Маска распространения травы на поверхности ландшафта
![](https://habrastorage.org/storage2/09f/2b6/a9c/09f2b6a9ca6e75222378844c5e4f6c5b.jpg)
Для этой маски исключаются высоты с которых уже начинается снежный покров.
В природе трава растёт на почве, которая в свою очередь не задерживается на скалистых и крутых поверхностях — соответственно, из карты высот исключаются места с большим наклоном.
Из карты эрозии получается информация о местах сползания осадочной породы. На определённых высотах, где эта порода более активна (скатывающиеся и сползающие валуны), трава растёт менее активно. Всё это также учитывается при формировании маски распространения травы.
Маска скал
Маска скальной поверхности на ландшафте
![](https://habrastorage.org/storage2/4e0/1e9/18e/4e01e918e3104ddc7b88aaf8d4ec7785.jpg)
Карта скал получается исключением всех остальных масок.
Создание масок распространения объектов
Маски деревьев
Маска распредления елей на поверхности ландшафта
![](https://habrastorage.org/storage2/2c4/2e4/fd5/2c42e4fd5104151c2ffce9be858dad34.jpg)
Маски деревьев создаются из маски травы, карты высот и нескольких процедурно сгенерированных шумов таким образом, чтобы ели располагались на больших высотах (но там, где ещё растёт трава), сосны — на средней высоте, а берёзы — во впадинах и равнинах.
Все маски деревьев являются взаимоисключающими, чтобы было чёткое разделение зон леса. Небольшие пересечения встречаются только в смежных областях.
В результате получаем маски, по которым можно расположить 4 типа деревьев: ель (spruce), мёртвая ель (spruce dead), сосна (pine), берёза (birch).
Маски цветов
Маски распределения ромашек (сверху) и кипрея (снизу) по ландшафту
![](https://habrastorage.org/storage2/e97/bec/19b/e97bec19b04b2b64f8c0ccbe77632820.jpg)
![](https://habrastorage.org/storage2/cc1/b63/888/cc1b63888a2e8bb885fa66f93364832c.jpg)
Маски ромашек (camomile) и кипрея (blooming sally) получаются простым добавлением процедурного шума в маску травы.
Маски кустарников
Маска распределения кустарников на ландшафте
![](https://habrastorage.org/storage2/2a2/8c1/24c/2a28c124c4a0b65ac29c627ccac83ab9.jpg)
Маска кустарников (bush mask) создаётся также из маски травы, но с помощью маски эрозии на ней учитываются места, в которых вероятнее всего скапливается больше воды, и отсекается зона, на которой расположены камни.
Камни
Для расположения камней, булыжников и валунов будет использована уже имеющаяся маска камней.
Создание диффузной текстуры ландшафта
Граф в World Machine, которым формируется диффузная текстура ландшафта
![](https://habrastorage.org/storage2/d02/6f6/166/d026f61662c4718b4ac21cc569e86e17.jpg)
Скачать terrain_color.tmd
Текстура цвета создаётся комбинированием полученных на предыдущих этапах масок. Смешиваются различные цвета, добавляются шумы.
Так, например, добавляется два вида травы — зелёная и сухая. Зелёная трава преобладает в низинах, сухая — на вершинах холмов. Для того чтобы сделать ландшафт визуально темнее под лесом, на него накладывается маска деревьев.
Если потребуется — производятся необходимые доводки цвета в Photoshop или GIMP.
Полученная диффузная текстура ландшафта
![](https://habrastorage.org/storage2/868/856/b95/868856b95ab0b5cce2dc23bb77a121c3.jpg)
Расстановка объектов по маскам
Настройка параметров объекта MeshClutter
![](https://habrastorage.org/storage2/252/dd6/07b/252dd607b9685af137ded01c4835ced3.jpg)
После того, как получены все необходимые текстуры и маски, сгенерирован ландшафт, настроены все необходимые материалы, остаётся только распространить по нему все подготовленные объекты (деревья, камни, траву, цветы и кустарники).
Сложно даже представить, сколько бы времени заняла расстановка такого огромного количества мелких (в сравнении с ландшафтом) объектов вручную. Поэтому, для экономии времени и оптимизации рендеринга в движке Unigine был создан специальный объект MeshClutter, который даёт возможность псевдослучайным образом распространять объекты на ландшафте по исходной маске и, например, таким параметрам как плотность, случайный разброс углов поворота объектов, их масштаба, что в результате позволяет добиться желаемого эффекта неоднородности.
Особенно стоит обратить внимание на то, что распределение объектов в этом случае псевдослучайно — то есть при одних и тех же значениях параметров (и одинаковом значении seed) для двух разных генераторов создаваемые ими объекты всегда будут расположены в одних и тех же местах. Таким образом достигается ещё и детерминированность получаемого результата.
Выводы
World Machine
Достоинства
- Кэширование результатов вычислений. При изменениях графа не происходит перерасчёт узлов, на которые эти изменения не повлияли. Это очень удобно и сильно экономит время создания нового контента.
- Наличие output ноды, которая позволяет выводить в файлы любое количество просчитываемых текстур из любого места графа и пересохранять их по нажатию одной кнопки.
- Возможность тайлового просчёта больших текстур (tiled build). При этом текстуры рендерятся фрагментами, благодаря чему появляется возможность распараллеливать рендеринг (задействуется многоядерность) и оптимально использовать занимаемую память. Однако не стоит забывать о том, что алгоритм эрозии в этом случае просчитывается симуляцией отдельно для каждого тайла, а не для всей поверхности ландшафта, и склеивание получившихся тайлов текстуры эрозии осуществляется перекрытием их смежных областей.
- Достаточный набор устройств (базовых блоков которыми создаётся алгоритм по которому формируется ландшафт), для реализации практически любых алгоритмов построения ландшафта.
- Есть возможность группировки частей графа для создания новых устройств с целью их дальнейшего переиспользования, но, к сожалению, отсутствует инстансинг — вставленные таким образом устройства будут являться копиями.
- Возможность точного расчета только заданного фрагмента ландшафта. Сильно экономит время при работе над детализацией выбранных участков.
Недостатки
- Огромное количество проблем при работе с большими объёмами исходных данных (как векторных, так и растровых) и ландшафтами больших размеров. Например, при открытии вектора с данными береговой линии (в несколько тысяч точек) — FPS в редакторе стремится к нулю.
- Поведение алгоритма эрозии (блока Erosion Device) зависит от финального разрешения ландшафта.
- Отсутствие инструментов для создания горных рек. Вырезание ландшафта по сплайнам под реку без применения эрозии даёт нереалистичный результат. Если же применять эрозию, то в некоторых местах реку может засыпать поперёк.
- Отсутствие возможности изменить или отключить интерполяцию исходных текстур.
- Некоторые мелкие, но очень неприятные недоработки редактора. Например, такие как невозможность задания цифровых значений цвета в устройстве Colorizer (это можно сделать только визуально), использование int вместо float для некоторых параметров и непонятные ограничения в диапазонах значений параметров.
Помимо World Machine можно так же присмотреться к Quad Software Grome Editor, Planetside Software Terragen, или же дописать под свои нужды открытый (лицензия AGPL) GPU-driven генератор ландшафтов Litosphere.
Процедурные генераторы
Главной идеей развития всех процедурных генераторов в идеале должно стать стирание грани между 2D и 3D, ведь 2D — это лишь частный случай 3D.
На данный момент не существует ни одного процедурного генератора, который позволил бы:
- создавать алгоритмы формирования трёхмерных объектов (вокселями)
- создавать свои собственные алгоритмы запекания текстур и легко перестраивать их под свои нужды
То есть, нет возможности использовать в процедурном генераторе какую-либо информацию с low-poly, high-poly или алгоритмически сформированной воксельной 3D модели для создания, например, генератора бесшовных текстур камня или текстур потёков ржавчины для любой исходной модели.
В таких программах, как 3DS MAX или Substance Designer, есть возможность запекать некоторые карты с моделей, но все они рендерятся зашитыми в программу алгоритмами, которые никак нельзя изменить, и нет возможности создать новые. Надежду подаёт недавно начавшееся внедрение AngelSript в 3D-Coat, но ещё непонятно, к чему хочет привести его автор.
Также давно стоит проблема, которую можно было бы решить уже на текущем уровне развития процедурных генераторов текстур: эти редакторы хорошо научились убирать швы по краям формируемого прямоугольника текстуры (например, методами offset или splat), но до сих пор ни один из них не умеет убирать эти швы на текстуре в местах разрыва UV координат модели.
Если бы все эти недостающие возможности были реализованы, их можно бы было применить для создания библиотек с автоматическими генераторами текстур (например, поверхностей металла с повлиявшими на них погодными, пылевыми и грязевыми факторами), исходными данными, для которых являлась бы только трёхмерная модель и настройки материала.
Полезные ссылки
- Движок Unigine, использованный для игры Oil Rush и бенчмарка Valley
- Valley Benchmark
- Процедурный генератор Filter Forge
- Процедурный генератор ландшафтов World Machine
- Quad Software Grome Editor
- Planetside Software Terragen
- GPU-driven генератор ландшафтов Litosphere
- Voxelogic Acropora procedural voxel modeler
Андрей Кушнер plu1on, Вячеслав Седович slice3d (технические художники Unigine Corp.)