- PVSM.RU - https://www.pvsm.ru -
Это вторая и заключительная часть статьи, посвященной процедурным методам производства контента для 3D приложений. Первую часть Вы можете найти здесь [2].
В этой части, так же как и в предыдущей, приводятся ссылки на скачивание созданных нами исходных материалов, которые можно свободно использовать (с изменениями или без) в своих проектах, но только не продавать/распространять в чистом виде и/или в составе каких-либо библиотек.
Напоминаем, что все эти исходные файлы не подвергались никакой специальной подготовке, обработке или оптимизации, чтобы не приукрашивать реальную ситуацию (довольно часто в процессе работы приходится жертвовать универсальностью/удобством создаваемых решений в пользу сэкономленного времени).
В этот раз речь пойдёт о том, какими средствами и приёмами мы пользовались при создании бенчмарка Valley, чтобы в максимально сжатые сроки произвести большое количество фотореалистичного контента.
То, что у нас получилось, Вы можете оценить здесь [3], бесплатно скачав бенчмарк или же просто просмотрев видеоролик:
Итак, при работе над этим проектом перед нами стояла задача создания максимально реалистичной сибирской горной долины размерами 8 на 8 километров с большим разбросом масштабов создаваемых объектов (от горы до цветка на лугу) и высоким уровнем детализации.
Перед тем, как приступить непосредственно к производству, мы разбили весь необходимый контент по принципам подхода к его созданию:
Если контент, указанный в первом пункте, создаётся в большинстве случаев любыми привычными средствами 3D моделирования и текстурирования, то перечисленное в пунктах 2 и 3 требует особых подходов, в которых и были использованы средства процедурной генерации.
Так, например, программа World Machine [4] использовалась как специализированный инструмент для генерирования ландшафтов и масок распространения объектов, а программа Filter Forge [5] — для создания:
В движке Unigine есть инструменты для симуляции как физически корректных динамически изменяющихся облаков (physically-based volumetric clouds), так и создания статичных облаков нужной формы в требуемых местах (billboard clouds).
Инструмент для создания billboard clouds позволяет формировать массив billboard’ов (billboard — полигон, который всегда направлен в камеру) случайным образом, заполняя ими исходный габаритный меш (bound mesh) по заданным параметрам (например, таким как количество, базовый размер, разброс размера), и в дальнейшем манипулировать всеми параметрами вплоть до изменения позиции любого отдельного billboard’а.
Чтобы превратить полученный массив полигонов в облака, на него назначается специальный материал, учитывающий освещение от глобального источника света (солнца), а также рассеивание света (light scattering). В этом материале назначается диффузная текстура, состоящая из нескольких отдельных полупрозрачных фрагментов облака, которые случайным образом назначаются каждому отдельному billboard’у.
Диффузная текстура фрагментов облака была создана процедурными средствами редактора Filter Forge.
Скачать clouds_variation.ffxml [13]
Для создания мха на камнях в Unigine используется специальный материал, который позволяет комбинировать 2 материала, один из которых проецируется на второй по маске в world space.
Удобство этого материала сложно переоценить, потому как если просто запекать мох в текстуры камней, мы сразу же лишаемся возможности свободно вращать (по всем трём осям) и позиционировать эти камни на ландшафте (хочется, чтобы мох лежал только сверху камней), а также лишаемся необходимой хаотичности симулируемого природного объекта, что сразу же будет бросаться в глаза и в целом плохо скажется на реализме получаемой картинки.
Форму фрагментов мха определяют две текстуры — грубая, но уникальная для всей поверхности ландшафта маска и детальный, но повторяющийся (из-за тайлинга) альфа-канал диффузной текстуры. Эти два исходных значения прозрачности перемножаются, и в итоге получается детализированный уникальный рисунок мха в каждой точке поверхности.
Все текстуры (включая карту нормалей) и маска для этого природного объекта были сгенерированы в Filter Forge.
Скачать moss.ffxml [19]
С помощью этого материала также легко можно симулировать ржавчину, коррозию или плесень на объектах.
В движке Unigine есть эффект, симулирующий засветку линз объектива камеры яркими источниками света. Так как в реальности не существует идеально чистых и ровных линз, а наличие на них даже крошечных пылинок вызывает при засветке довольно характерные визуальные артефакты, для большей реалистичности мы добавили возможность использовать текстуру загрязнения объектива, которая проявляется только на его очень засвеченных участках.
Необходимую текстуру для этого эффекта проще и удобнее было реализовать средствами Filter Forge, что и было сделано.
Создание больших открытых (outdoor) сцен является довольно сложной задачей как в плане рендеринга ландшафта и множества объектов на нем в реальном времени, так и в плане создания контента для таких сцен.
В Unigine для этих целей существует множество инструментов, позволяющих:
Перед созданием контента для больших открытых пространств рекомендуется собрать как можно больше референсных материалов с фотографиями местности, которую требуется реализовать. Пригодятся как наземные снимки, так и аэрофотосъемка. Анализируя собранные референсные материалы, необходимо понять процессы, участвующие в формировании земной поверхности — работа в процедурных генераторах ландшафтов требует понимания таких вещей для достижения наилучшего результата.
Ландшафт в движке Unigine представляет собой объект, динамически изменяющий уровень детализации своей сетки и текстур в зависимости от степени удалённости камеры для оптимальной производительности при большой дальности видимости (более 40 километров).
Для создания ландшафта в движке Unigine необходимо иметь следующие исходные текстуры:
Карта нормалей не требуется, потому как создается инструментами движка автоматически по карте высот.
Для детализации ландшафта используются дополнительные материалы, текстуры которых тайлятся по всей его поверхности, а степень смешивания (blending) этих материалов задаётся маской. Таким образом передаётся требуемый характер поверхности в нужных местах, будь то трава, песок, камни или любые другие типы поверхностей.
Для создания перечисленных выше исходных текстур существуют свои специализированные программы-генераторы ландшафтов. Одной из таких программ является World Machine.
Эта программа, как и любая другая, не лишена недостатков, но была выбрана нами среди прочих (см. список в конце статьи) по ряду причин, среди которых качество получаемого результата, нодовая архитектура и богатый набор необходимых нам функций. Отдельно стоит отметить возможность выборочно рассчитывать небольшие участки текстур ландшафтов (для экономии времени вычислений), за счёт чего появляется возможность быстрого итерирования при проработке деталей, что всегда является огромным плюсом, благодаря которому заметно повышается качество создаваемого контента.
Процесс создания текстур ландшафта мы разбиваем на три этапа:
Для каждого этапа создаётся свой граф в World Machine, и каждый следующий этап использует результаты рассчётов предыдущего. Конечно, World Machine довольно умная программа и при изменении параметров узлов, в отличие от Filter Forge, она производит перепросчёт только той ветки графа, на которую эти изменения повлияли, однако при повторном открытии файла этот просчёт осуществляется полностью с самого начала. А так как, например, рассчёт результатов эррозии довольно сложен, то разбиением на разные этапы, помимо удобства работы, мы получаем ещё и сэкономленное время.
Скачать terrain_height.tmd [29]
В самой основе графа, формирующего ландшафт, лежат три генератора шума с разным масштабом, результаты рассчётов которых комбинируются для формирования, соответственно, крупных, средних и мелких элементов базовой поверхности:
[30]
Ближе к впадинам преобладает холмистый характер поверхности, который воссоздаётся расширением областей вокруг гор фильтром (а в терминологии World Machine — устройством) Expander:
[31]
Далее к полученным холмам добавляются мелкие детализированные скалы — остатки гор после эррозии:
[32]
Устройством Terrace добавляются уступы, затем зашумляются для устранения регулярности эффекта и ограничиваются по высоте и углу поверхности:
[33]
Добавляется эррозия. Это самое значимое устройство в World Machine, которое предназначено для симуляции процессов разрушения и смещения грунта под воздействием воды, ветра и температуры. Без него весь ландшафт оставался бы просто далёким от реальности набором смешанных процедурных шумов.
[34]
Добавляются волнообразные смещения грунта. Под воздействием гравитации и процессов эррозии грунт стремится сползти с наклонных поверхностей к низинам, но из-за большого числа находящихся в нём корней деревьев и растений это сползание происходит целыми массивами, что визуально проявляется через складки на поверхности земли. Сформировать и отработать этот эффект более детально в World Machine помогает возможность производить вычисления результата только указанного участка ландшафта (через установку нужных Extents):
[35]
На вершины гор добавляется снег. В основном это осуществляется устройством Snow, которое позволяет симулировать эффект накопления снега с учётом таких параметров как интенсивность, количество, направление ветра и т.д.
[36]
Полученные на данном этапе результаты растеризуются средствами World Machine и сохраняются в файлы. В итоге получается карта высот, карта эррозии и карта толщины снежного покрова.
В бенчмарке Valley для детализации ландшафта было использовано 4 материала, передающих следующие типы поверхностей:
Маски, определяющие видимость материалов этих поверхностей на ландшафте, создаются также в World Machine из полученных на предыдущем этапе текстур.
Скачать terrain_masks.tmd [45]
Маска снега формируется таким образом, что интенсивность исходной карты толщины снежного покрова определяет размеры и количество кусков снега (чем темнее пиксель исходной текстуры — тем меньше количество кусков и их размер).
Карта эррозии показывает, как стекают потоки разрушенного эррозией грунта. Для получения маски камней из неё убираются места с большим наклоном поверхности ландшафта (как правило, камни на таких поверхностях не задерживаются) и убираются области с малым наклоном на низких высотах (в этих местах доминирует мелкая осадочная порода, грунт и почва).
Для этой маски исключаются высоты с которых уже начинается снежный покров.
В природе трава растёт на почве, которая в свою очередь не задерживается на скалистых и крутых поверхностях — соответственно, из карты высот исключаются места с большим наклоном.
Из карты эррозии получается информация о местах сползания осадочной породы. На определённых высотах, где эта порода более активна (скатывающиеся и сползающие валуны), трава растёт менее активно. Всё это также учитывается при формировании маски распространения травы.
Карта скал получается исключением всех остальных масок.
Маски деревьев создаются из маски травы, карты высот и нескольких процедурно сгенерированных шумов таким образом, чтобы ели располагались на больших высотах (но там, где ещё растёт трава), сосны — на средней высоте, а берёзы — во впадинах и равнинах.
Все маски деревьев являются взаимоисключающими, чтобы было чёткое разделение зон леса. Небольшие пересечения встречаются только в смежных областях.
В результате получаем маски, по которым можно расположить 4 типа деревьев: ель (spruce), мёртвая ель (spruce dead), сосна (pine), берёза (birch).
Маски ромашек (camomile) и кипрея (blooming sally) получаются простым добавлением процедурного шума в маску травы.
Маска кустарников (bush mask) создаётся также из маски травы, но с помощью маски эррозии на ней учитываются места, в которых вероятнее всего скапливается больше воды, и отсекается зона, на которой расположены камни.
Для расположения камней, булыжников и валунов будет использована уже имеющаяся маска камней.
Скачать terrain_color.tmd [55]
Текстура цвета создаётся комбинированием полученных на предыдущих этапах масок. Смешиваются различные цвета, добавляются шумы.
Так, например, добавляется два вида травы — зелёная и сухая. Зелёная трава преобладает в низинах, сухая — на вершинах холмов. Для того чтобы сделать ландшафт визуально темнее под лесом, на него накладывается маска деревьев.
Если потребуется — производятся необходимые доводки цвета в Photoshop или GIMP.
После того, как получены все необходимые текстуры и маски, сгенерирован ландшафт, настроены все необходимые материалы, остаётся только распространить по нему все подготовленные объекты (деревья, камни, траву, цветы и кустарники).
Сложно даже представить, сколько бы времени заняла расстановка такого огромного количества мелких (в сравнении с ландшафтом) объектов вручную. Поэтому, для экономии времени и оптимизации рендеринга в движке Unigine был создан специальный объект MeshClutter, который даёт возможность псевдослучайным образом распространять объекты на ландшафте по исходной маске и, например, таким параметрам как плотность, случайный разброс углов поворота объектов, их масштаба, что в результате позволяет добиться желаемого эффекта неоднородности.
Особенно стоит обратить внимание на то, что распределение объектов в этом случае псевдослучайно — то есть при одних и тех же значениях параметров (и одинаковом значении seed) для двух разных генераторов создаваемые ими объекты всегда будут расположены в одних и тех же местах. Таким образом достигается ещё и детерминированность получаемого результата.
Помимо World Machine можно так же присмотреться к Quad Software Grome Editor [58], Planetside Software Terragen [59], или же дописать под свои нужды открытый (лицензия AGPL) GPU-driven генератор ландшафтов Litosphere [60].
Главной идеей развития всех процедурных генераторов в идеале должно стать стирание грани между 2D и 3D, ведь 2D — это лишь частный случай 3D.
На данный момент не существует ни одного процедурного генератора, который позволил бы:
То есть, нет возможности использовать в процедурном генераторе какую-либо информацию с low-poly, high-poly или алгоритмически сформированной воксельной 3D модели для создания, например, генератора бесшовных текстур камня или текстур потёков ржавчины для любой исходной модели.
В таких программах, как 3DS MAX или Substance Designer, есть возможность запекать некоторые карты с моделей, но все они рендерятся зашитыми в программу алгоритмами, которые никак нельзя изменить, и нет возможности создать новые. Надежду подаёт недавно начавшееся внедрение AngelSript в 3D-Coat, но ещё непонятно, к чему хочет привести его автор.
Также давно стоит проблема, которую можно было бы решить уже на текущем уровне развития процедурных генераторов текстур: эти редакторы хорошо научились убирать швы по краям формируемого прямоугольника текстуры (например, методами offset или splat), но до сих пор ни один из них не умеет убирать эти швы на текстуре в местах разрыва UV координат модели.
Если бы все эти недостающие возможности были реализованы, их можно бы было применить для создания библиотек с автоматическими генераторами текстур (например, поверхностей металла с повлиявшими на них погодными, пылевыми и грязевыми факторами), исходными данными, для которых являлась бы только трёхмерная модель и настройки материала.
Андрей Кушнер plu1on [67], Вячеслав Седович slice3d [68] (технические художники Unigine Corp.)
Автор: Unigine
Источник [69]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/photoshop/37728
Ссылки в тексте:
[1] Image: http://habrastorage.org/storage2/3a3/636/1a9/3a36361a9f54f47f9dd77b5aee3877e8.jpg
[2] здесь: http://habrahabr.ru/company/unigine/blog/167075/
[3] здесь: http://www.unigine.com/products/valley/
[4] World Machine: http://www.world-machine.com/
[5] Filter Forge: http://www.filterforge.com
[6] текстур облаков: #clouds
[7] текстур мха: #moss
[8] эффекта грязной линзы (Lens Flares Dirt): #lens_flares_dirt
[9] Image: http://habrastorage.org/storage2/35d/ea8/610/35dea86100f37758f32acd403214846a.jpg
[10] Image: http://habrastorage.org/storage2/103/b5e/e43/103b5ee437df40c5663285afddb21ca9.jpg
[11] Image: http://habrastorage.org/storage2/f47/0b0/b48/f470b0b489ced04eaba74c0cdc8f8d70.jpg
[12] Image: http://habrastorage.org/storage2/4c5/415/324/4c5415324fc7ed807a7da0d489054684.jpg
[13] Скачать clouds_variation.ffxml: http://unigine.com/content/download/habr_article2/clouds_variation.ffxml
[14] Image: http://habrastorage.org/storage2/314/be4/4cb/314be44cb1a54d0014021195687cb8a7.jpg
[15] Image: http://habrastorage.org/storage2/cda/803/cf6/cda803cf6daea80d2b343b41f161f2e4.jpg
[16] Image: http://habrastorage.org/storage2/a67/2a3/13d/a672a313d7c9f3092de6d032d9ef3dd8.jpg
[17] Image: http://habrastorage.org/storage2/3c0/33b/92e/3c033b92e5a5f329fbaf925422308758.jpg
[18] Image: http://habrastorage.org/storage2/7de/339/531/7de3395316ea5ae31df9304bd8d37323.jpg
[19] Скачать moss.ffxml: http://unigine.com/content/download/habr_article2/moss.ffxml
[20] Image: http://habrastorage.org/storage2/911/929/1c6/9119291c651ea5a355e6062ba0b166ee.jpg
[21] Image: http://habrastorage.org/storage2/8c5/889/027/8c5889027cd846006720f979335be52b.jpg
[22] Скачать lens_dirt.ffxml: http://unigine.com/content/download/habr_article2/lens_dirt.ffxml
[23] Image: http://habrastorage.org/storage2/697/3b1/adb/6973b1adbafd9413201abb8f5008b9a9.jpg
[24] создание базовых текстур ландшафта: #terrain_base
[25] создание масок детализации ландшафта: #terrain_detail_mask
[26] масок распространения объектов: #terrain_distribution_mask
[27] создание диффузной текстуры ландшафта: #terrain_diffuse
[28] Image: http://habrastorage.org/storage2/0df/c01/cbc/0dfc01cbc3ad6d9a32f3b2885226dddd.jpg
[29] Скачать terrain_height.tmd: http://unigine.com/content/download/habr_article2/terrain_height.tmd
[30] Image: http://habrastorage.org/storage2/d10/249/eaa/d10249eaa1104d3ad44705ba7d5a10fe.jpg
[31] Image: http://habrastorage.org/storage2/4c5/ecd/a2b/4c5ecda2b1d8c1f472f7b9c4686bd2ca.jpg
[32] Image: http://habrastorage.org/storage2/5d8/7f0/796/5d87f07964a38369a2e33a75bd541da3.jpg
[33] Image: http://habrastorage.org/storage2/f55/6f2/0c2/f556f20c2092b02358997cb1ed57a17e.jpg
[34] Image: http://habrastorage.org/storage2/7ca/828/a6e/7ca828a6ef3055ca9c006173a6f6ae77.jpg
[35] Image: http://habrastorage.org/storage2/527/ec0/8ea/527ec08eabcf36a3010688db5e8548e6.jpg
[36] Image: http://habrastorage.org/storage2/dad/754/0de/dad7540dec33ec36c1b671324c8564d0.jpg
[37] Image: http://habrastorage.org/storage2/2b9/c8e/711/2b9c8e71101f1a3d52e50bab47fa09b7.jpg
[38] Image: http://habrastorage.org/storage2/27f/a78/10c/27fa7810c6389e3fbb82d60119439d2a.jpg
[39] Image: http://habrastorage.org/storage2/535/dda/6c4/535dda6c4cd01180f1c5ccb915d2dcb5.jpg
[40] снег (snow mask): #snow_mask
[41] камни (boulders mask): #boulders_mask
[42] трава (grass mask): #grass_mask
[43] скалы (rock mask): #rock_mask
[44] Image: http://habrastorage.org/storage2/891/230/7c3/8912307c3c1073d44969b29efc7d7dbc.jpg
[45] Скачать terrain_masks.tmd: http://unigine.com/content/download/habr_article2/terrain_masks.tmd
[46] Image: http://habrastorage.org/storage2/420/1bf/cf7/4201bfcf7c51a4d7127da8c449619947.jpg
[47] Image: http://habrastorage.org/storage2/18b/cc9/762/18bcc97628416dd324bbf3e905556dc1.jpg
[48] Image: http://habrastorage.org/storage2/b08/599/d25/b08599d254e2ad7aa8836c33ae070b60.jpg
[49] Image: http://habrastorage.org/storage2/930/984/c83/930984c83f849f7f0ffbbac19c3ac32f.jpg
[50] Image: http://habrastorage.org/storage2/bd9/ca6/20d/bd9ca620dab3233214a0dc8298ee830d.jpg
[51] Image: http://habrastorage.org/storage2/d59/16a/b78/d5916ab782a1159678f1b43eb6fa3819.jpg
[52] Image: http://habrastorage.org/storage2/32f/3c1/ea0/32f3c1ea02b04c84ac65b2749fb36e5a.jpg
[53] Image: http://habrastorage.org/storage2/3b0/2e1/57a/3b02e157a449391176c8f6bccbb675c4.jpg
[54] Image: http://habrastorage.org/storage2/888/cd1/c1a/888cd1c1a71b1ef669291521f572d610.jpg
[55] Скачать terrain_color.tmd: http://unigine.com/content/download/habr_article2/terrain_color.tmd
[56] Image: http://habrastorage.org/storage2/c21/799/562/c2179956206c3c21bc2e735db4b0a9b7.jpg
[57] Image: http://habrastorage.org/storage2/f9b/2af/ee1/f9b2afee19912281ea3ab068c68c7672.jpg
[58] Quad Software Grome Editor: http://www.quadsoftware.com/
[59] Planetside Software Terragen: http://planetside.co.uk/
[60] Litosphere: http://lithosphere.codeflow.org/
[61] Движок Unigine, использованный для игры Oil Rush и бенчмарка Valley: http://unigine.com/products/unigine/
[62] Valley Benchmark: http://unigine.com/products/valley/
[63] Процедурный генератор ландшафтов World Machine: http://www.world-machine.com
[64] Quad Software Grome Editor: http://www.quadsoftware.com
[65] GPU-driven генератор ландшафтов Litosphere: http://lithosphere.codeflow.org
[66] Voxelogic Acropora procedural voxel modeler: http://www.voxelogic.com
[67] plu1on: http://habrahabr.ru/users/plu1on/
[68] slice3d: http://habrahabr.ru/users/slice3d/
[69] Источник: http://habrahabr.ru/post/184614/
Нажмите здесь для печати.