- PVSM.RU - https://www.pvsm.ru -
В данной статье, состоящей из двух частей, речь пойдёт об использовании возможностей процедурных генераторов при создании контента для компьютерной игры Oil Rush [2] и бенчмарка Valley (выйдет в феврале), разработанных на нашем собственном движке Unigine [3]. Всё нижеизложенное является исключительно мнением авторов, основанным на личном опыте, и не претендует на абсолютную истинность и полноту охвата.
Помимо теоретической части, описания процесса создания контента и возникших при этом проблем, в цикле статей приводятся некоторые разработанные нами исходные материалы (процедурные текстуры). Все эти материалы доступны для скачивания. Они приведены не только для ознакомления — их также можно свободно использовать (с изменениями или без) в своих проектах, но только не продавать в чистом виде и/или в составе каких-либо библиотек.
В большинстве случаев при создании текстур художники используют два метода или их комбинацию. Первый метод основан на использовании реальных фотоизображений с последующим ретушированием и небольшими корректировками. Второй — это создание текстуры полностью с нуля при помощи графического планшета. Эти методы, как и их комбинация, обладают одним большим недостатком — невозможностью быстрого итерирования вариантов текстуры. В обоих случаях такие текстуры лишены даже минимальной параметризации картинки и как следствие — возможности быстрого изменения путём редактирования этих параметров. В результате даже минимальные изменения в диффузной текстуре влекут за собой необходимость внесения соответствующих изменений во всех связанных текстурах, а для современного графического контента это ещё как минимум normal и specular карты. Максимум, что можно сделать быстро — это поменять яркость, контрастность и цвет тех или иных участков.
Кроме того, создание текстур этими методами сводится к рутиннной работе: множество взмахов кисточкой, бесконечное перебирание фототекстур в поисках подходящей, ретуширование с целью правки нежелательных элементов, придание бесшовности границам изображений и т.д. Однако, всю эту рутинную работу можно избежать, грамотно применяя там, где это возможно, процедурную генерацию текстур.
Процедурная генерация текстуры — это метод создания текстуры, при котором цвет каждого пикселя изображения формируется алгоритмически. Благодаря этому становится возможным применение различных математических функций, например, таких как шум Перлина (Perlin noise) или мозаика Вороного (Fortune’s algorithm).
По сравнению с традиционными методами процедурная генерация текстур обладает следующими значительными преимуществами:
В добавление ко всему перечисленному хочется также отметить, что существуют задачи, для которых создание текстур в линейных редакторах изображений типа Photoshop или GIMP становится крайне неприемлемым или даже невозможным. Одной из таких задач является создание текстур ландшафтов (terrain). Ключевой особенностью текстур ландшафтов являются их огромные размеры — например, 8192*8192 пикселей (движок Unigine позволяет использовать текстуры очень высокого разрешения для создания ландшафтов в реальном времени, вплоть до 65536*65536 пикселей). На рисование всех необходимых текстур ландшафта вручную при помощи графического планшета уйдут недели, а внесение хоть каких-то минимальных изменений будет отнимать дни. Всё это является совершенно необоснованным, если у вашего проекта есть хоть какие-то временные ограничения, не говоря уже об элементарном неудобстве работы с текстурами таких размеров.
Без применения процедурных средств процесс формирования всех необходимых текстур земной поверхности выглядит следующим образом:
Работа с таким громоздким файлом даже на мощных компьютерах вызывает проблемы с нехваткой памяти, постоянно используемым жестким диском, очень медленной работой ввиду огромного объёма осуществляемых вычислений. Это вынуждает закрывать другие используемые программы, уменьшать число кэшируемых шагов Undo в приложениях, разбивать создаваемую текстуру на несколько файлов по типам поверхностей (вода, песок, трава), работать с каждым из них по отдельности, растеризовать и только после этого окончательно собирать в одном файле. В таких условиях работа становится некомфортной, что не может не сказаться на качестве результата.
Photoshop, являясь де-факто стандартом приложения по созданию текстур, к сожалению, остаётся инструментом только для фотографов и ретушеров. До сих пор не было значимых улучшений, направленных на внесение недеструктивности редактирования и параметризации картинки, что очень сильно осложняет работу не только создателям контента для 3D графики, но и дизайнерам интерфейсов, 2D художникам, веб-дизайнерам.
С момента своего появления GIMP (хоть это ему и простительно как абсолютно бесплатному приложению) пытается копировать функционал Photoshop’а, при этом реализуя его на ещё более неудобном интерфейсе вместо того, чтобы попробовать пойти своим путём и реализовать более жизнеспособный недеструктивный подход к редактированию изображений.
На наш взгляд, основными проблемами растровых редакторов изображений на данный момент являются:
С проблемой процедурной генерации контента мы столкнулись, в частности, при работе над морской стратегией Oil Rush, действие которой происходит в затопленном постапоклиптическом мире. В процессе создания контента для уровней игры Oil Rush перед нами встала задача создания реалистичного природного окружения в 6 различных сеттингах: арктический океан, рыбацкие деревни в тропиках, поселения в каньонах, индустриальная зона, разрушенные города и рифы, которые отличаются характером рельефа, климатом и типом построек. Для того чтобы контент выглядел естественно и разнообразно, при его создании мы воспользовались возможностями процедурных генераторов.
Перед решением любой задачи процедурного создания контента стоит подумать о физических процессах моделируемого объекта или явления, максимально упростить его и отобрать только ключевые параметры, определяющие его визуальную составляющую.
На стадии пре-продакшна игры нами были опробованы практически все существовавшие на тот момент процедурные генераторы, и среди них был выбран наиболее приемлемый вариант — программа Filter Forge.
Filter Forge [4] использовалась в разработке игры Oil Rush как генератор процедурных текстур для создания окружения и некоторых спецэффектов. Ниже приведён список контента, в создании которого были использованы возможности этой программы.
Создание волн на воде любыми линейными способами представляет собой довольно сложную задачу. При создании многократно повторяющихся текстур больших поверхностей огромную роль играет бесшовность таких текстур: чем менее заметен будет повторяющийся характер получаемой картинки — тем лучше. Довольно проблематично и не результативно генерировать текстуры нормалей и высот водной поверхности в программах типа CrazyBump или nDo2 по её фотографиям из-за отражающих и преломляющих свойств воды, а скульптинг реалистичных бесшовных форм волн в приложениях ZBrush, Mudbox или 3D-Coat с целью последующего запекания получившейся модели в карту нормалей будет отнимать неоправданно много времени. С учётом всех этих факторов было решено воспользоваться процедурными средствами.
Волны на воде образуются под воздействием ветра на её поверхность. Так как в сравнении с воздухом вода является более инертным веществом, формирование волн происходит только в случае постоянного воздействия ветра на какую-то площадь её поверхности. Таким образом, для нашего случая ключевыми параметрами являются направление, площадь воздействия и интенсивность ветра, в совокупности определяющие направление, высоту и ширину каждой формируемой волны. Также стоит учесть, что водная поверхность подвержена колебаниям и наложению нескольких волн друг на друга.
С большими упрощениями модели явления были сделаны два типа волн — для сильного и для слабого ветра. Каждому из них потребовалось по две вариации текстур нормалей с разными основными направлениями движения волн.
Шейдер воды в движке Unigine реализует симуляцию волн путём наложения двух карт нормалей с анимированными параметрами трансформации текстуры (смещение текстурных координат изменяется во времени по своему закону отдельно для каждой текстуры) — таким образом формируется уникальный рисунок водной поверхности практически в любой момент времени.
Скачать фильтр (ocean_waves.ffxml) [18]
В этом случае традиционные линейные средства производства контента нам не подходили по двум причинам:
В области процедурных генераторов для создания 3D объектов ситуация обстоит не лучшим образом. Вполне возможно, что она изменится, если в API воксельного редактора 3D-Coat [20], включат скриптовый язык (например, Python), с помощью которого появится возможность создавать алгоритмы формирования трёхмерных объектов. А в данный момент всем заинтересованным рекомендуем присмотреться к программам Houdini [21] от компании Side Effects Software и Voxelogic Acropora [22] (к сожалению, судя по отсутствию обновлений новостей на сайте, эта программа более не развивается). Но для нашего проекта было решено использовать возможности двумерного процедурного генератора Filter Forge с помощью небольшого трюка: был реализован фильтр, формирующий карту высот айсбергов, а затем в программе 3D моделирования было произведено выдавливание (displacement) высокополигонального меша по полученной карте высот.
Скачать фильтр (icebergs_forms.ffxml) [24]
Из всего этого многообразия были выбраны наиболее устраивающие нас объекты и сделана их ретопология.
Анализ фотографий реально существующих объектов (референсов) дал понять, что фактура поверхности для наших объектов сильно отличается по своему характеру на видах сверху и сбоку. Поэтому, после разбиения объектов на боковые и верхние элементы и создания для них развёрток были созданы ещё два фильтра, генерирующие карты высот отдельно для верха и отдельно для боковых поверхностей объектов.
К сожалению, в Filter Forge отстутствуют средства визуализации результатов применения карты высот для displacement’а меша, поэтому приходится каждый раз выходить из режима создания фильтра, рендерить получаемую текстуру в файл и обновлять её в стороннем 3D приложении.
Сформированные карты высот боковых и верхних элементов использовались для:
1. Выдавливания (displacement) плоского высокополигонального меша, с которого после оптимизации его геометрии были запечены необходимые текстуры ambient occlusion, normals и cavity.
Скачать фильтр (iceberg_side.ffxml) [28]
Скачать фильтр (iceberg_top.ffxml) [31]
2. Придания дополнительной рельефности низкополигональным мешам также через выдавливание (displacement).
После этого сшивались стыки боковых и верхних элементов.
Диффузные текстуры для объектов создавались в программе Photoshop из получившихся текстур height, ambient occlusion, cavity, так как эта программа обладаёт всё же более удобными инструментами для компоновки (composing) нескольких изображений, нежели Filter Forge — не нужно каждый раз выходить из фильтра для рендеринга и сохранения картинки, есть возможность запоминания последовательности рутинных, часто выполняемых действий (например, для сохранения файла в нужном формате) с целью их повторного выполнения по нажатию горячей клавиши. Поэтому конечную текстуру цвета для просмотра результата в движке здесь сформировать гораздо проще и быстрее.
Аналогичным способом создавались каньоны, скалы и льдины.
Скачать фильтр (canyon_side.ffxml) [38]
Скачать фильтр (canyon_top.ffxml) [39]
Скачать фильтр (rock.ffxml) [43]
Этой картой высот придавалась рельефность сразу нескольким элементам скал, которые позже группировались, формируя рифы.
Скачать фильтр (ice_forms.ffxml) [52]
Скачать фильтр (ice_top.ffxml) [54]
Filter Forge неплохо подходит для генерирования небольших ландшафтных объектов с невысокой рельефностью и слабо выраженным эффектом эрозии (для всего остального лучше использовать специализированные генераторы ландшафтов). В случае с Oil Rush эта программа хорошо подошла для создания текстур океанического дна.
Скачать фильтр (ocean_bottom_1_height.ffxml) [58]
Скачать фильтр (ocean_bottom_2_color.ffxml) [61]
Для симулирования плавающей на поверхности воды нефтяной плёнки нам необходимо было добавить цветной полупрозрачный рисунок на её поверхность. Движок Unigine позволяет регулировать порядок отрисовки материалов, в котором они будут выводиться на экран. Поэтому мы сделали так, чтобы плоскость с нефтяной пленкой рисовалась после volumetric object, формирующего эффект глубины, но перед поверхностью с отражениями и преломлениями. Благодаря этому на плёнке появились отражения, искажения и блики от волн, а нам оставалось сделать только диффузную (diffuse) текстуру нефтяной плёнки с альфа-каналом, для чего и был использован Filter Forge.
Скачать фильтр (oil_slick.ffxml) [65]
Текстуры для руин делались комбинированным методом с использованием как фототекстур, так и процедурных возможностей Filter Forge. Компоновка (composing) также осуществлялась в Photoshop.
При решении этой задачи хотелось сделать такие универсальные фильтры для симуляции сколов на краях и потеков ржавчины, которые можно бы было использовать при работе с архитектурой и в дальнейшем.
В процессе выполнения этой задачи мы столкнулись со следующими проблемами Filter Forge:
Введение кэширования увеличило бы объём затрачиваемой на вычисления памяти, но значительно ускорило бы сам процесс вычислений, избавило бы от необходимости использования растровых редакторов изображений, и, соответственно, повысило бы удобство работы и полезность программы в разы.
Каждый эффект шлейфа от передвигающихся по воде юнитов в игре Oil Rush представляет собой набор из нескольких систем частиц:
В Filter Forge создавались текстуры для систем частиц расходящейся пены и пены от винтов.
Скачать фильтр (ocean_foam_sfx.ffxml) [70]
В движке Unigine есть возможность использования текстурных атласов с несколькими вариациями изображений, которые будут случайным образом назначаться на те или иные генерируемые эмиттером частицы. Благодаря этому достигается разнообразие форм и визуальная иррегулярность формируемых эффектов.
Для реализации такого текстурного атласа в Filter Forge отдельно велась работа над двумя основными ветками дерева фильтра — одна создаёт узор пенящейся воды, а вторая формирует маску видимости частей пены.
Практически всегда создание эффектов техническим художником подразумевает создание и использование специальных текстур, которые должны формироваться по строго заданным законам, что во многих случаях полностью исключает использование растровых редакторов изображений для этих целей. Например, часто используемый шейдер эффекта растворения (dissolving) требует карту высот распада, по которой будут плавно исчезать участки текстуры с регулируемым нижним и верхними цветовыми пределами. Или же эффект энергетического щита, молниями обволакивающего какой-либо объект, требует использования как минимум трёх текстур, взаимодействующих по непростому алгоритму для получения визуального непостоянства в любой момент времени.
Нередко техническому художнику ставится задача реализовать какой-либо новый эффект, описанный на словах или запечатлённый в концептах. Перед тем, как просить программиста реализовать все необходимые шейдеры, следует задуматься о параметризации создаваемого эффекта — о том, какими текстурами и какими параметрами удобно будет формировать и отстраивать его визуал. Технический художник, даже не обладая навыками программирования шейдеров, используя процедурные генераторы для прототипирования, сможет объяснить программисту, что именно он хочет получить, продемонстрировать, как этот эффект должен работать по его мнению и предоставить необходимые исходные текстуры.
Это практически полностью исключает непредсказуемость результата и недостаточную параметризацию создаваемого эффекта, экономит время разработки эффектов.
Выбор софта, который можно использовать для процедурного создания контента, невелик. Ниже для наиболее полноценных из них (Filter Forge и Substance Designer) приведены списки плюсов и минусов, сформировавшиеся в результате наших исследований. Эти программы, по нашему мнению, можно выбрать для использования в реальных условиях производства в зависимости от того, с недостатками какой из них вы готовы смириться.
Помимо использования Filter Forge как основного процедурного генератора, возможно, стоит присмотреться к программе Allegorithmic Substance Designer [71].
В этой части статьи мы постарались раскрыть проблемы создания больших объёмов качественного контента для real-time 3D приложений в сжатые сроки, привести возможные решения, использованные нами, и описать потенциальные пути развития процедурных генераторов контента, которые позволят многократно улучшить ситуацию.
Во второй части статьи речь пойдёт о процедурных способах создания контента, использованных в производстве бенчмарка Valley, где большую часть займёт описание того, каким образом создавались ландшафты.
Автор: Unigine
Источник [73]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/photoshop/26355
Ссылки в тексте:
[1] Image: http://unigine.com/download/habr_article1/pics/01_oilrush_1.jpg
[2] Oil Rush: http://oilrush-game.com/
[3] движке Unigine: http://unigine.com/products/unigine/
[4] Filter Forge: http://www.filterforge.com/
[5] Волны на воде: #waves
[6] Айсберги: #icebergs
[7] Каньоны: #canyons
[8] Скалы: #rocks
[9] Льдины: #floes
[10] Дно океана: #ocean_floor
[11] Нефтяная плёнка: #oil
[12] Элементы руин: #ruins
[13] Вспенивание воды (например, от попадания в неё предмета): #foam
[14] Шлейфы на воде от движущихся по ней юнитов: #tails_on_the_water
[15] Image: http://unigine.com/download/habr_article1/pics/04_oilrush_ocean_waves.jpg
[16] Image: http://unigine.com/download/habr_article1/pics/05_oilrush_ocean_waves_normal1.jpg
[17] Image: http://unigine.com/download/habr_article1/pics/06_oilrush_ocean_waves_normal2.jpg
[18] Скачать фильтр (ocean_waves.ffxml): http://unigine.com/content/download/habr_article1/filters/1_ocean_waves.ffxml
[19] Image: http://unigine.com/download/habr_article1/pics/07_oilrush_icebergs.jpg
[20] 3D-Coat: http://3d-coat.com
[21] Houdini: http://www.sidefx.com
[22] Voxelogic Acropora: http://www.voxelogic.com
[23] Image: http://unigine.com/download/habr_article1/pics/08_oilrush_icebergs_forms_texture.jpg
[24] Скачать фильтр (icebergs_forms.ffxml): http://unigine.com/content/download/habr_article1/filters/2_icebergs_forms.ffxml
[25] Image: http://unigine.com/download/habr_article1/pics/09_oilrush_icebergs_forms_displace.jpg
[26] Image: http://unigine.com/download/habr_article1/pics/10_oilrush_icebergs_forms_retopology.jpg
[27] Image: http://unigine.com/download/habr_article1/pics/11_oilrush_icebergs_side_heightmap.jpg
[28] Скачать фильтр (iceberg_side.ffxml): http://unigine.com/content/download/habr_article1/filters/3_iceberg_side.ffxml
[29] Image: http://unigine.com/download/habr_article1/pics/12_oilrush_icebergs_side_displace.jpg
[30] Image: http://unigine.com/download/habr_article1/pics/13_oilrush_icebergs_top_heightmap.jpg
[31] Скачать фильтр (iceberg_top.ffxml): http://unigine.com/content/download/habr_article1/filters/4_iceberg_top.ffxml
[32] Image: http://unigine.com/download/habr_article1/pics/14_oilrush_icebergs_top_displace.jpg
[33] Image: http://unigine.com/download/habr_article1/pics/15_oilrush_icebergs2_displace.jpg
[34] Image: http://unigine.com/download/habr_article1/pics/16_oilrush_icebergs2_optimized.jpg
[35] Image: http://unigine.com/download/habr_article1/pics/17_oilrush_icebergs2_welded.jpg
[36] Image: http://unigine.com/download/habr_article1/pics/18_oilrush_canyons.jpg
[37] Image: http://unigine.com/download/habr_article1/pics/19_oilrush_canyons_side_heightmap.jpg
[38] Скачать фильтр (canyon_side.ffxml): http://unigine.com/content/download/habr_article1/filters/5_canyon_side.ffxml
[39] Скачать фильтр (canyon_top.ffxml): http://unigine.com/content/download/habr_article1/filters/6_canyon_top.ffxml
[40] Image: http://unigine.com/download/habr_article1/pics/20_oilrush_canyons_side_displace.jpg
[41] Image: http://unigine.com/download/habr_article1/pics/21_oilrush_rocks.jpg
[42] Image: http://unigine.com/download/habr_article1/pics/22_oilrush_rocks_heightmap.jpg
[43] Скачать фильтр (rock.ffxml): http://unigine.com/content/download/habr_article1/filters/7_rock.ffxml
[44] Image: http://unigine.com/download/habr_article1/pics/23_oilrush_rocks_displace.jpg
[45] Image: http://unigine.com/download/habr_article1/pics/24_oilrush_rock1_low.jpg
[46] Image: http://unigine.com/download/habr_article1/pics/25_oilrush_rock1_displace.jpg
[47] Image: http://unigine.com/download/habr_article1/pics/26_oilrush_rock1_optimized.jpg
[48] Image: http://unigine.com/download/habr_article1/pics/27_oilrush_2.jpg
[49] Image: http://unigine.com/download/habr_article1/pics/28_oilrush_ices_forms_texture.jpg
[50] Image: http://unigine.com/download/habr_article1/pics/29_oilrush_ices_forms_displace.jpg
[51] Image: http://unigine.com/download/habr_article1/pics/30_oilrush_ices_forms_meshes.jpg
[52] Скачать фильтр (ice_forms.ffxml): http://unigine.com/content/download/habr_article1/filters/8_ice_forms.ffxml
[53] Image: http://unigine.com/download/habr_article1/pics/31_oilrush_ices_horizontal_n.jpg
[54] Скачать фильтр (ice_top.ffxml): http://unigine.com/content/download/habr_article1/filters/9_ice_top.ffxml
[55] Image: http://unigine.com/download/habr_article1/pics/32_oilrush_ocean_bottom1.jpg
[56] Image: http://unigine.com/download/habr_article1/pics/33_oilrush_ocean_bottom1_diffusemap.jpg
[57] Image: http://unigine.com/download/habr_article1/pics/34_oilrush_ocean_bottom1_heightmap.jpg
[58] Скачать фильтр (ocean_bottom_1_height.ffxml): http://unigine.com/content/download/habr_article1/filters/10_ocean_bottom_1_height.ffxml
[59] Image: http://unigine.com/download/habr_article1/pics/35_oilrush_ocean_bottom2.jpg
[60] Image: http://unigine.com/download/habr_article1/pics/36_oilrush_ocean_bottom2_diffusemap.jpg
[61] Скачать фильтр (ocean_bottom_2_color.ffxml): http://unigine.com/content/download/habr_article1/filters/11_ocean_bottom_2_color.ffxml
[62] Image: http://unigine.com/download/habr_article1/pics/37_oilrush_ocean_bottom2_normalmap.jpg
[63] Image: http://unigine.com/download/habr_article1/pics/38_oilrush_oil_film.jpg
[64] Image: http://unigine.com/download/habr_article1/pics/39_oilrush_oil_film_texture.jpg
[65] Скачать фильтр (oil_slick.ffxml): http://unigine.com/content/download/habr_article1/filters/12_oil_slick.ffxml
[66] Image: http://unigine.com/download/habr_article1/pics/40_oilrush_ruins.jpg
[67] Image: http://unigine.com/download/habr_article1/pics/41_oilrush_water_trail.jpg
[68] Image: http://unigine.com/download/habr_article1/pics/42_oilrush_water_trail_foam1.jpg
[69] Image: http://unigine.com/download/habr_article1/pics/43_oilrush_water_trail_foam2.jpg
[70] Скачать фильтр (ocean_foam_sfx.ffxml): http://unigine.com/content/download/habr_article1/filters/13_ocean_foam_sfx.ffxml
[71] Allegorithmic Substance Designer: http://www.allegorithmic.com/products/substance-designer
[72] Bitmap2Material: http://www.allegorithmic.com/products/b2m/overview
[73] Источник: http://habrahabr.ru/post/167075/
Нажмите здесь для печати.