Использование Процедурных Генераторов При Создании Контента Для 3D-Приложений Реального Времени: Часть 1. Нефтяная Лихорадка

Игра Нефтяная лихорадка

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

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

Нефтяная лихорадка и эталонный тест Valley (который будет выпущен в феврале), разработанный нами самостоятельно.

Двигатель Unigine .

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

Помимо теоретической части, описания процесса создания контента и возникших проблем, в цикле статей приводятся некоторые разработанные нами исходные материалы (процедурные текстуры).

Все эти материалы доступны для скачивания.

Они предоставляются не только в ознакомительных целях — их также можно свободно использовать (с модификациями или без) в своих проектах, но только не продавать в чистом виде и/или в составе каких-либо библиотек.




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

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

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




Проблемы традиционных методов создания текстур Адские слои фотошопа

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

В большинстве случаев при создании текстур художники используют два метода или их комбинацию.

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

Второй — создание текстуры полностью с нуля с помощью графического планшета.

У этих методов, как и их комбинации, есть один большой недостаток — невозможность быстрого перебора вариантов текстур.

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

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

Максимум, что можно сделать быстро – это изменить яркость, контрастность и цвет отдельных областей.

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

Процедурная генерация текстур — это метод создания текстур, при котором цвет каждого пикселя изображения генерируется алгоритмически.

Благодаря этому становится возможным использовать различные математические функции, например, шум Перлина или мозаику Вороного (алгоритм Фортуны).

Преимущества процедурных текстурПример дерева фильтров в Filter Forge

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

По сравнению с традиционными методами процедурная генерация текстур имеет следующие существенные преимущества:

  • Возможность внесения изменений на любом этапе формирования изображения (неразрушающее редактирование).

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

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

    где угодно (например, разобрать/собрать картинку на компоненты RGB или HSL).

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

    в кратчайшие сроки.

  • Возможность увеличивать или уменьшать размер текстуры без потери детализации.

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

    Например, если у нас есть процедурная текстура, основанная на функции фрактального шума, то при изменении размера такой текстуры изменится только объем решения уравнений фрактального шума для определения цвета каждого пикселя.

    В связи с этим вы легко сможете подобрать размер текстуры, соответствующий текущему масштабу 3D-модели, для которой она создается.

  • Высокая скорость создания нового контента на основе существующих разработок путем их модификации и комбинирования.

  • Быстро создавайте похожие текстуры.

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

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

  • Возможность быстрого просмотра нескольких вариантов текстур, сгенерированных алгоритмом, путем изменения входного значения (seed) генератора случайных чисел и выбора наиболее подходящего.

  • Быстро меняйте итоговое изображение, меняя параметры блока на любом этапе работы.

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

  • Бесплатная бесшовность.

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

  • Возможность генерировать изображения в диапазоне HDR (High Dynamic Range) с дальнейшей настраиваемой конвертацией в LDR (Low Dynamic Range).

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

  • Удобная обработка нескольких изображений.

    Если вам необходимо обработать группу фотографий по какому-то одинаковому алгоритму, вы не ограничены только фильтрами и действиями, доступными в приложении.

    Вы можете реализовать необходимый алгоритм и применить его ко всем исходным изображениям.

  • Небольшой размер сохраняемых данных, не зависящий от разрешения изображения.

    В файле сохраняется только описание алгоритма, занимающее несколько килобайт, а не растеризованные данные по 4 байта на пиксель в каждом слое.

  • Экономия на памяти, занимаемой приложением, поскольку одну и ту же текстуру можно использовать в качестве входных данных сразу в нескольких процессорах, а не копировать ее каждый раз.

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

Одной из таких задач является создание текстур ландшафта (рельефа).

Ключевой особенностью ландшафтных текстур является их огромный размер — например, 8192*8192 пикселей (движок Unigine позволяет использовать текстуры очень высокого разрешения для создания ландшафтов в реальном времени, вплоть до 65536*65536 пикселей).

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

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

Без использования процедурных инструментов процесс генерации всех необходимых текстур земной поверхности выглядит следующим образом:

  1. Специализированное приложение для лепки создает высокополигональный ландшафт необходимых размеров.

  2. Запекаются все необходимые текстуры: карты высот, карты нормалей, Ambient occlusion, различные маски (например, маска водной поверхности).

  3. Все сгенерированные текстуры импортируются в один документ (Photoshop/GIMP) слой за слоем.

  4. На основе запеченных текстур формируются маски для различных типов поверхностей – гор, камней, травы.

    На этом этапе мы столкнулись с недостатками линейных редакторов изображений:

  • Отсутствие понятия ссылки на изображение и соответственно невозможность использовать такие ссылки как экземпляры в новых слоях.

    Внедрение смарт-объектов в Photoshop немного улучшило ситуацию, но это всё равно больше похоже на решение-заполнитель, чем на универсальное решение (например, до сих пор нет нормальной возможности использовать смарт-объект в качестве маски на каком-либо слое).

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

  • Очень часто возникает необходимость использовать отдельный набор слоев не только для цвета, но и для формирования альфа-канала изображения.

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

    Приходится использовать заполнители типа «папки слоев с вложенными друг в друга масками», которые не везде применимы.

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

Это заставляет закрывать другие используемые программы, уменьшать количество кэшированных шагов Undo в приложениях, разбивать созданную текстуру на несколько файлов по типу поверхности (вода, песок, трава), работать с каждым из них отдельно, растрировать и только потом окончательно собрать их в один файл.

В таких условиях работать становится некомфортно, что не может не сказаться на качестве результата.

Photoshop, являясь де-факто стандартным приложением для создания текстур, к сожалению, остается инструментом только для фотографов и ретушеров.

До сих пор не произошло существенных улучшений, направленных на внедрение неразрушающего редактирования и параметризации изображений, что значительно усложняет работу не только создателям контента для 3D-графики, но и дизайнерам интерфейсов, 2D-художникам и веб-дизайнерам.

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

-деструктивный подход к редактированию изображений.

На наш взгляд, основными проблемами редакторов растровых изображений на данный момент являются:

  • Невозможность повторного использования существующих изображений в нескольких местах (не реализована механика ссылок/экземпляров).

  • Невозможность создавать и отдельно редактировать слои для масок.

Процедурно генерируемый контент в Oil Rush С проблемой процедурной генерации контента мы столкнулись, в частности, при работе над морской стратегией Oil Rush, действие которой происходит в затопленном постапокалиптическом мире.

В процессе создания контента для уровней игры Oil Rush перед нами стояла задача создать реалистичную природную среду в 6 различных декорациях: Северный Ледовитый океан, рыбацкие деревни в тропиках, поселения в каньонах, промышленная зона, разрушенные города и рифы, различающиеся характером местности, климатом и типом построек.

Чтобы контент выглядел естественно и разнообразно, при его создании мы воспользовались возможностями процедурных генераторов.

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

На этапе подготовки к производству игры мы протестировали практически все существовавшие на тот момент процедурные генераторы и среди них выбрали наиболее приемлемый вариант — программу Filter Forge. Фильтр Кузница использовался при разработке игры Oil Rush в качестве генератора процедурных текстур для создания окружения и некоторых спецэффектов.

Ниже приведен список контента, который был создан с использованием возможностей этой программы.



Среда



Эпоследствия



Волны на воде

Вода в игре Oil Rush

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Создание волн на воде любым линейным способом – достаточно сложная задача.

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

Генерировать текстуры нормалей и высот поверхности воды в программах типа CrazyBump или nDo2 по ее фотографиям довольно проблематично и неэффективно из-за отражающих и преломляющих свойств воды, а лепка реалистичных бесшовных волновых форм в приложениях ZBrush, Mudbox или 3D-Coat с целью последующего запекания полученных моделей в карту нормалей займет неоправданно много времени.

Учитывая все эти факторы, было принято решение применить процессуальные средства.

Волны на воде образуются под воздействием ветра на ее поверхность.

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

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

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

При больших упрощениях модели явления были построены два типа волн – для сильного и для слабого ветра.

Для каждого из них требовалось по две вариации нормальных текстур с разными основными направлениями движения волн.

Шейдер воды в движке Unigine реализует волновую симуляцию путем наложения двух карт нормалей с анимированными параметрами трансформации текстур (смещение координат текстур меняется со временем по своему закону отдельно для каждой текстуры) – формируя таким образом уникальный рисунок водной поверхности при почти в любое время.

Карты нормалей, используемые в водном материале для имитации сильного ветра в игре Oil Rush.

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка



Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Скачать фильтр (ocean_waves.ffxml)

Создание айсбергов, каньонов, скал и льдин

Айсберги в игре Oil Rush

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

В данном случае традиционные линейные способы производства контента нам не подошли по двум причинам:
  1. Была поставлена задача реализовать в короткие сроки достаточно большое количество различных вариантов объектов окружающей среды.

  2. Нужно было уже на ранних этапах видеть формы предметов, выбирать только те, которые нас полностью устраивают, и без особых раздумий выбрасывать ненужные.

В сфере процедурных генераторов для создания 3D-объектов ситуация не самая лучшая.

Вполне возможно, что оно изменится, если API редактора вокселей 3D пальто , будет включать скриптовый язык (например, Python), с помощью которого можно будет создавать алгоритмы формирования трехмерных объектов.

На данный момент рекомендуем всем заинтересованным присмотреться к программам Гудини из программного обеспечения для побочных эффектов и Вокселогик Акропора (к сожалению, судя по отсутствию обновлений новостей на сайте, данная программа больше не разрабатывается).

Но для нашего проекта было решено использовать возможности двухмерного процедурного генератора Filter Forge с помощью небольшой хитрости: был реализован фильтр, генерирующий карту высот айсбергов, а затем в программе 3D-моделирования высокополигональную сетку.

был смещен с использованием полученной карты высот. Карта высот айсбергов (вверху) и вытянутая над ней сетка (внизу)

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Скачать фильтр (icebergs_forms.ffxml)

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Из всего этого многообразия были выбраны наиболее подходящие нам объекты и сделана их ретопология.

Ретопология айсберга

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

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

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

К сожалению, в Filter Forge нет средств визуализации результатов использования карты высот для смещения меша, поэтому каждый раз приходится выходить из режима создания фильтра, рендерить полученную текстуру в файл и обновлять ее в стороннем 3D-приложение.

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

Карта высот для формирования боковой поверхности айсберга (вверху) и выдавленная поверх нее сетка, готовая к запеканию текстур (внизу).

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



Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Скачать фильтр (iceberg_side.ffxml)

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Карта высот для формирования верхней поверхности айсберга (вверху) и выдавленная поверх нее сетка, готовая к запеканию текстур (внизу)

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Скачать фильтр (iceberg_top.ffxml)

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

2. Придание дополнительного рельефа низкополигональным сеткам также за счет экструзии (смещения).

После этого стыки боковых и верхних элементов сшивались.

Выдавливание боковых поверхностей айсбергов с картой высот (вверху), сетки после оптимизации (посередине) и приклеивание вершин к верху (внизу)

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка



Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка



Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Диффузные текстуры для объектов создавались в Фотошопе из полученной высоты, эмбиент окклюзии, текстур впадин, так как в этой программе все же есть более удобные инструменты для компоновки нескольких изображений, чем в Filter Forge - не нужно каждый раз выходить из фильтра для рендеринга и сохранения изображения, можно запомнить последовательность рутинных, часто выполняемых действий (например, сохранить файл в нужном формате), чтобы выполнить их снова, нажав горячую клавишу.

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

Подобным образом были созданы каньоны, скалы и льдины.

Каньоны в игре Oil Rush

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Карта высот боковых поверхностей каньонов (вверху) и вытянутая по ней сетка (внизу)

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Скачать фильтр (canyon_side.ffxml) Скачать фильтр (canyon_top.ffxml)

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Камни в игре Oil Rush

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Карта высот поверхности камня (вверху) и вытянутая поверх нее сетка (внизу)

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Скачать фильтр (rock.ffxml)

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Эта карта высот придала рельефность сразу нескольким элементам горных пород, которые позже были сгруппированы вместе, образовав рифы.

Процесс формирования горных пород и придания им необходимого рельефа

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка



Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка



Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Льдины в игре Oil Rush

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Карта высоты льда (вверху), вытянутая поверх нее сетка (в центре) и ретопология вытянутой сетки (внизу)

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка



Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка



Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Скачать фильтр (ice_forms.ffxml) Карта нормалей ледяной поверхности

Использование процедурных генераторов при создании контента для 3D-приложений реального времени: Часть 1. Нефтяная лихорадка

Скачать фильтр (ice_top.ffxml)

дно океана

Filter Forge хорошо подходит для генерации небольших ландшафтных объектов с низким рельефом и слабым эрозионным эффектом (на всю территорию).

Теги: #3d #Работа с 3D-графикой #photoshop #разработка игр #процедурная генерация #текстуры #unigine #oil Rush #процедурные текстуры #filter forge #конструктор веществ

Вместе с данным постом часто просматривают: