Компания
38,33
рейтинг
4 февраля 2013 в 19:32

Дизайн → Применение процедурных генераторов в создании контента для real-time 3D приложений: Часть 1. Oil Rush

Игра Oil Rush


В данной статье, состоящей из двух частей, речь пойдёт об использовании возможностей процедурных генераторов при создании контента для компьютерной игры Oil Rush и бенчмарка Valley (выйдет в феврале), разработанных на нашем собственном движке Unigine. Всё нижеизложенное является исключительно мнением авторов, основанным на личном опыте, и не претендует на абсолютную истинность и полноту охвата.

Помимо теоретической части, описания процесса создания контента и возникших при этом проблем, в цикле статей приводятся некоторые разработанные нами исходные материалы (процедурные текстуры). Все эти материалы доступны для скачивания. Они приведены не только для ознакомления — их также можно свободно использовать (с изменениями или без) в своих проектах, но только не продавать в чистом виде и/или в составе каких-либо библиотек.


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



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


Photoshop layers hell
В большинстве случаев при создании текстур художники используют два метода или их комбинацию. Первый метод основан на использовании реальных фотоизображений с последующим ретушированием и небольшими корректировками. Второй — это создание текстуры полностью с нуля при помощи графического планшета. Эти методы, как и их комбинация, обладают одним большим недостатком — невозможностью быстрого итерирования вариантов текстуры. В обоих случаях такие текстуры лишены даже минимальной параметризации картинки и как следствие — возможности быстрого изменения путём редактирования этих параметров. В результате даже минимальные изменения в диффузной текстуре влекут за собой необходимость внесения соответствующих изменений во всех связанных текстурах, а для современного графического контента это ещё как минимум normal и specular карты. Максимум, что можно сделать быстро — это поменять яркость, контрастность и цвет тех или иных участков.

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

Процедурная генерация текстуры — это метод создания текстуры, при котором цвет каждого пикселя изображения формируется алгоритмически. Благодаря этому становится возможным применение различных математических функций, например, таких как шум Перлина (Perlin noise) или мозаика Вороного (Fortune’s algorithm).





Преимущества процедурных текстур

Пример дерева фильтра в программе Filter Forge


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

  • Возможность вносить изменения в любой этап формирования картинки (недеструктивное редактирование). Практически все приложения, связанные с процедурным генерированием, построены по блочной архитектуре (node-based), которая позволяет составлять логические цепочки любой сложности с помощью добавления элементарных блоков и создания связей между ними. Такая архитектура сохраняет все связи между ресурсами и последовательность формирования текстуры, даёт возможность использования одного и того же ресурса (исходной текстуры или вывода с любого блока) в качестве входных данных для параллельного использования множеством последующих блоков, позволяет переходить в разные цветовые пространства в любом месте (например, разбирать/собирать картинку на RGB или HSL компоненты). В результате даже довольно сложные графы легко читаемы, и благодаря этому художник, даже не являющийся автором такого графа, может с лёгкостью разобраться в процессе формирования финальной картинки и модифицировать его под свои нужды в кратчайшие сроки.
  • Возможность увеличения или уменьшения размера текстуры без потерь детализации. Какое бы разрешение мы в дальнейшем ни выбрали, чёткость текстур от этого не пострадает (при увеличении размеров текстура не будет размываться какими-либо методами resampling’а картинок), так как процедурная генерация строится на математических функциях, а не на растровых данных. К примеру, если мы имеем процедурную текстуру, в основе которой лежит функция фрактального шума, то при изменении размеров такой текстуры будет изменяться лишь количество решения уравнений фрактального шума для определения цвета каждого пикселя. В связи с этим можно легко подобрать размер текстуры под текущий масштаб 3D модели, для которой она создается.
  • Высокая скорость создания нового контента на основе существующих наработок путём их модифицирования и комбинирования.
  • Быстрое создание подобных текстур. После того, как реализован процедурный генератор, формирующий необходимую текстуру, для получения подобной нужно всего лишь изменить входное значение (seed) у генератора случайных чисел. Благодаря этому, например, создав один генератор текстуры для одной бронзовой статуи, можно будет создать уникальные текстуры для сколь угодно большого количества подобных статуй.
  • Возможность быстро просмотреть несколько сгенерированных алгоритмом вариантов текстуры при помощи изменения входного значения (seed) генератора случайных чисел и выбрать из них наиболее подходящий.
  • Быстрое изменение финальной картинки путём изменения параметров блоков на любом этапе работы.
  • Возможность использования процедурных генераторов для создания базовой текстуры с дальнейшей её растеризацией и обработкой уже в растровых редакторах изображений.
  • Бесплатная бесшовность. Как правило, генераторы процедурных текстур обладают алгоритмами автоматического тайлинга (seamless tiling), которые позволяют убрать швы по краям изображения установкой всего-лишь одной галочки в параметрах.
  • Возможность формирования изображений в HDR (High Dynamic Range) диапазоне с дальнейшей регулируемой конвертацией его в LDR (Low Dynamic Range). В случае с процедурными текстурами мы не ограничены битностью пикселя, и вычисления производятся в числах с плавающей точкой.
  • Удобная обработка нескольких изображений. В случае, если надо обработать группу картинок по какому-то одинаковому алгоритму, Вы не ограничены только имеющимися в приложении фильтрами и действиями. Можно реализовать требуемый алгоритм и применить его ко всем исходным изображениям.
  • Малый размер хранимых данных, который не зависит от разрешения картинки. В файл сохраняется только описание алгоритма, занимающее несколько килобайт, а не растеризованные данные по 4 байта на пиксель в каждом слое.
  • Экономия занимаемой приложением памяти, так как одну и ту же текстуру можно использовать как входную сразу в нескольких обработчиках, а не копировать её каждый раз.

В добавление ко всему перечисленному хочется также отметить, что существуют задачи, для которых создание текстур в линейных редакторах изображений типа Photoshop или GIMP становится крайне неприемлемым или даже невозможным. Одной из таких задач является создание текстур ландшафтов (terrain). Ключевой особенностью текстур ландшафтов являются их огромные размеры — например, 8192*8192 пикселей (движок Unigine позволяет использовать текстуры очень высокого разрешения для создания ландшафтов в реальном времени, вплоть до 65536*65536 пикселей). На рисование всех необходимых текстур ландшафта вручную при помощи графического планшета уйдут недели, а внесение хоть каких-то минимальных изменений будет отнимать дни. Всё это является совершенно необоснованным, если у вашего проекта есть хоть какие-то временные ограничения, не говоря уже об элементарном неудобстве работы с текстурами таких размеров.

Без применения процедурных средств процесс формирования всех необходимых текстур земной поверхности выглядит следующим образом:
  1. В специализированном приложении скульптинга создаётся высокополигональный ландшафт необходимых размеров.
  2. Запекаются все необходимые текстуры: карты высот (height), нормалей (normal), ambient occlusion, различные маски (например, маска водной поверхности).
  3. Все сформированные текстуры импортируются в один документ (Photoshop / GIMP) по слоям.
  4. По запечённым текстурам формируются маски для различных типов поверхностей — гор, камней, травы. На этом этапе мы сталкиваемся с недостатками линейных редакторов изображений:
  • Отсутстие понятия ссылки (reference) на изображение и, соответственно, отсутствие возможности применять такие ссылки в качестве экземпляров (instance) в новых слоях. Введение Smart Object’ов в Photoshop немного улучшило ситуацию но всё равно это похоже скорее на решение-заглушку, нежели на универсальное решение (например, по прежнему нет нормальной возможности использовать Smart Object в качестве маски на любом слое). Поэтому приходится многократно копировать одни и те же растеризованные изображения несколько раз, запоминать все связи и зависимости между ними и, в случае изменения исходного изображения, полностью производить весь этот процесс заново.
  • Очень часто возникает потребность использования отдельного набора слоёв не только для цвета, но также и для формирования альфа-канала изображения. Не хватает возможности использовать альфа-канал, сформированный таким образом в качестве маски для других слоёв. Приходится использовать решения-заглушки типа “вложенных друг в друга папок слоёв с масками”, которые не везде применимы.

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

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

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

На наш взгляд, основными проблемами растровых редакторов изображений на данный момент являются:
  • Невозможность переиспользования существующих изображений в нескольких местах (не реализована механика reference / instance).
  • Невозможность создания и отдельного редактирования слоёв для масок.



Процедурно сгенерированный контент в игре Oil Rush


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

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

На стадии пре-продакшна игры нами были опробованы практически все существовавшие на тот момент процедурные генераторы, и среди них был выбран наиболее приемлемый вариант — программа Filter Forge.

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

Окружение



Эффекты




Волны на воде


Вода в игре Oil Rush


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

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

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

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

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




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


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


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


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

В области процедурных генераторов для создания 3D объектов ситуация обстоит не лучшим образом. Вполне возможно, что она изменится, если в API воксельного редактора 3D-Coat, включат скриптовый язык (например, Python), с помощью которого появится возможность создавать алгоритмы формирования трёхмерных объектов. А в данный момент всем заинтересованным рекомендуем присмотреться к программам Houdini от компании Side Effects Software и Voxelogic Acropora (к сожалению, судя по отсутствию обновлений новостей на сайте, эта программа более не развивается). Но для нашего проекта было решено использовать возможности двумерного процедурного генератора Filter Forge с помощью небольшого трюка: был реализован фильтр, формирующий карту высот айсбергов, а затем в программе 3D моделирования было произведено выдавливание (displacement) высокополигонального меша по полученной карте высот.

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


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



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

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


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

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

Сформированные карты высот боковых и верхних элементов использовались для:
1. Выдавливания (displacement) плоского высокополигонального меша, с которого после оптимизации его геометрии были запечены необходимые текстуры ambient occlusion, normals и cavity.

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


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



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


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



2. Придания дополнительной рельефности низкополигональным мешам также через выдавливание (displacement).

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

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






Диффузные текстуры для объектов создавались в программе Photoshop из получившихся текстур height, ambient occlusion, cavity, так как эта программа обладаёт всё же более удобными инструментами для компоновки (composing) нескольких изображений, нежели Filter Forge — не нужно каждый раз выходить из фильтра для рендеринга и сохранения картинки, есть возможность запоминания последовательности рутинных, часто выполняемых действий (например, для сохранения файла в нужном формате) с целью их повторного выполнения по нажатию горячей клавиши. Поэтому конечную текстуру цвета для просмотра результата в движке здесь сформировать гораздо проще и быстрее.

Аналогичным способом создавались каньоны, скалы и льдины.

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


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


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



Скалы в игре Oil Rush


Карта высот скальной поверхности (сверху) и выдавленный по ней меш (снизу)


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



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

Процесс формирования скал и придания им необходимой рельефности






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


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






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

Карта нормалей поверхности льдин


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


Дно океана


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

Дно океана в игре Oil Rush


Диффузная текстура (сверху) и карта высот (снизу) океанического дна




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

Дно океана в игре Oil Rush


Диффузная текстура (сверху) и карта нормалей (снизу) океанического дна


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




Нефтяная пленка


Для симулирования плавающей на поверхности воды нефтяной плёнки нам необходимо было добавить цветной полупрозрачный рисунок на её поверхность. Движок Unigine позволяет регулировать порядок отрисовки материалов, в котором они будут выводиться на экран. Поэтому мы сделали так, чтобы плоскость с нефтяной пленкой рисовалась после volumetric object, формирующего эффект глубины, но перед поверхностью с отражениями и преломлениями. Благодаря этому на плёнке появились отражения, искажения и блики от волн, а нам оставалось сделать только диффузную (diffuse) текстуру нефтяной плёнки с альфа-каналом, для чего и был использован Filter Forge.

Нефтяная плёнка на поверхности воды в игре Oil Rush


Диффузная текстура нефтяной плёнки


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


Элементы руин


Руины в игре Oil Rush


Текстуры для руин делались комбинированным методом с использованием как фототекстур, так и процедурных возможностей Filter Forge. Компоновка (composing) также осуществлялась в Photoshop.

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

В процессе выполнения этой задачи мы столкнулись со следующими проблемами Filter Forge:
  1. Отсутствие возможности сохранения готовых фильтров в блоки и переиспользования их как узлов со своими входами (inputs) и выходами (outputs) в других фильтрах (надеемся, что с реализацией группировок в четвертой версии программы эта проблема будет решена).
  2. Отсутствие кэширования результатов рассчётов для каждого блока. При осуществлении любых изменений перерассчитывается вся связанная с результатом вывода ветка графа, а не только тот отрезок, на который эти изменения повлияли. Очень часто в начале фильтра создаётся несколько сложных генераторов шума, формирующих общий характер и рисунок поверхности, которые после создания практически не изменяются. Далее идут узлы, отвечающие за цвет, контраст и смешивание (blending) разных составляющих, параметры которых претерпевают гораздо большее количество итераций, но из-за того, что вычисления не кэшируются, работать с фильтром становится всё затруднительнее по мере его усложнения. Это вынуждает осуществлять компоновку (composing) финальной текстуры в линейных редакторах изображений.

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


Пена на воде


Эффекты на воде от передвигающихся юнитов в игре Oil Rush


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

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

Диффузные текстуры пены на воде




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

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

Для реализации такого текстурного атласа в Filter Forge отдельно велась работа над двумя основными ветками дерева фильтра — одна создаёт узор пенящейся воды, а вторая формирует маску видимости частей пены.



Роль процедурных генераторов в создании специальных эффектов


Практически всегда создание эффектов техническим художником подразумевает создание и использование специальных текстур, которые должны формироваться по строго заданным законам, что во многих случаях полностью исключает использование растровых редакторов изображений для этих целей. Например, часто используемый шейдер эффекта растворения (dissolving) требует карту высот распада, по которой будут плавно исчезать участки текстуры с регулируемым нижним и верхними цветовыми пределами. Или же эффект энергетического щита, молниями обволакивающего какой-либо объект, требует использования как минимум трёх текстур, взаимодействующих по непростому алгоритму для получения визуального непостоянства в любой момент времени.

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

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



Выводы


Выбор софта, который можно использовать для процедурного создания контента, невелик. Ниже для наиболее полноценных из них (Filter Forge и Substance Designer) приведены списки плюсов и минусов, сформировавшиеся в результате наших исследований. Эти программы, по нашему мнению, можно выбрать для использования в реальных условиях производства в зависимости от того, с недостатками какой из них вы готовы смириться.


Filter Forge


Достоинства


  • Богатый и логичный набор базовых компонент, позволяющий реализовать практически любой фильтр.
  • Возможность создания собственных компонент с помощью скриптов на языке Lua.
  • Удобный и интуитивный функционал редактора фильтров.
  • Очень удобные компоненты генераторов шума, позволяющие сформировать базовую фактуру практически любой поверхности.
  • Бесплатные библиотеки фильтров. С большой вероятностью можно найти фильтр, уже реализующий необходимое изображение, и изменить его под свои нужды.

Недостатки


  • Отсутствие какого-либо GPU ускорения — все вычисления конечного цвета пикселя осуществляются процессором.
  • Отсутствие компонент для вывода произвольного количества получившихся изображений во внешние растровые файлы (output компонент) и отсутствие возможности сохранения всех этих файлов прямо в режиме редактирования фильтра по нажатию горячей клавиши (чтобы после отстройки параметров фильтра быстро получить весь набор необходимых текстур).
  • Отсутствие автоматического отслеживания изменений в исходных растровых изображениях с последующей их перегрузкой и, соответственно, пересчётом фильтра.
  • Отсутствие возможности создания и полноценного использования дополнительных буферов в скриптах Lua (например, для реализации эффекта свечения (glow) понадобится несколько таких буферов). Решение-заглушка с использованием таблиц на Lua страдает довольно существенными недостатками.
  • Отсутствие возможности группировки созданных фильтров для дальнейшего их переиспользования в качестве компонент для формирования более сложных фильтров.
  • Ориентированность на 2D. Отсутствие 3D viewport’а для возможности быстрого предпросмотра результатов.

Пожелания


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


Помимо использования Filter Forge как основного процедурного генератора, возможно, стоит присмотреться к программе Allegorithmic Substance Designer.


Substance Designer


Достоинства


  • Довольно удобный и гибкий интерфейс, который можно подстроить под себя.
  • Готовый, гибкий и постоянно развивающийся инструмент Bitmap2Material, предназначенный для создания практически всех необходимых материалу текстур (specular, ambient occlusion, height, normal и т.д.) из исходного изображения.
  • Богатый набор библиотек готовых генераторов текстур (smart textures).
  • Наличие собственного решения (Substance Air), которое позволяет создавать текстуры по их исходным графам (sbsar) прямо в runtime.
  • Довольно быстрые алгоритмы рассчётов (формирование текстур практически в реальном времени).
  • Ориентированность на 3D. Наличие 3D viewport’а, возможность посмотреть результат сразу на своей модели.
  • Возможность снятия вспомогательных карт (ambient occlusion map, cavity map и т.д.) с модели средствами программы, перегенерация карт одним действием.
  • Все сложные фильтры (substances) построены из основных элементарных блоков, что дает возможность быстро вносить необходимые изменения.

Недостатки


  • Cкудный набор генераторов шума. Это основной недостаток, так как генераторы шума являются элементами, определяющими фактуру поверхности. Обязательно наличие в базовой библиотеке необходимого и достаточного числа процедурных генераторов. По этой причине перед серъезной работой придется каким-то образом нарабатывать свою собственную библиотеку генераторов шума.
  • Отсутствие возможности создания новых блоков каким-либо скриптовым языком программирования.
  • Скудный набор базовых блоков и местами нелогичное их применение для осуществления элементарных операций.
  • Базовый бесплатный набор фильтров, поставляемых в комплекте с приложением, — беден, а дополнительные библиотеки генераторов текстур (smart textures) платные, и их суммарная стоимость превышает стоимость самой программы в разы.



Заключение

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

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





Полезные ссылки



Андрей Кушнер plu1on, Вячеслав Седович slice3D (технические художники Unigine Corp.)
Автор: @Unigine
UNIGINE
рейтинг 38,33
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Комментарии (41)

  • +18
    Это гениально, мисье! Oil Rush опять вызвал у меня интерес к game development — спасибо.
  • +2
    Очень даже к месту пришлась статья, сейчас занимаюсь генераторами для своего проекта, что-то подкинуло идей.
  • 0
    Замечательная и довольно обширная статья, приду домой перечитаю подробно!
    А что у Вас есть по поводу Android / iOS? На сайте как-то мало про это сказано — ясно что есть что-то, но конкретного перечня возможностей не нахожу…
  • НЛО прилетело и опубликовало эту надпись здесь
    • +4
      Релиз Oil Rush на Android — в феврале, финальный билд практически готов.
      • НЛО прилетело и опубликовало эту надпись здесь
  • +2
    Довольно познавательно. Спасибо.

    Кстати,
    Voxelogic Acropora (к сожалению, судя по отсутствию обновлений новостей на сайте, эта программа более не развивается)

    как раз сегодня на сайте появилась очередная новость.
    • +6
      Впервые вижу, чтобы хабраэффект не клал, а наоборот, оживлял.
  • +17
    Спасибо за интересный пост.
    Аж гордость за отечественных программистов =)
    • +2
      С программистами у нас все ок, а вот с геймдизайнерами слабовато! :(
      • +3
        Геймдизайн можно аутсорсить нашим соседям китайцам украинцам.
  • +2
    Интересные методы у вас там используются. Спасибо за отличную статью!
    Отсутствие какого-либо GPU ускорения — все вычисления конечного цвета пикселя осуществляются процессором.

    А вы не пробовали производить часть расчетов в шейдерах и извлекать результат из фреймбуфера?
    • +2
      Спасибо всем!

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

      Для условий реального производства игрового контента это должно быть универсальное удобное node-based решение наподобие Filter Forge, но с возможностями hardware ускорения (которые с относительно недавнего времени использует Photoshop).
      • 0
        Тогда неплохо было бы добавить поддержку OpenCL.
      • 0
        Не понимаю, почему результат будет зависеть от видеокарты. Он может быть не bit-perfect (с точностью до того, как производители-драйвера оптимизируют свой fp-ливер), но должен быть в итоге визуально идентичным, если делать всё по стандартам.

        Кроме того, свое ускоренное node-based решение можно сделать на коленке за неделю, I can tell from making quite a few node-based shader-processors in my time. С учетом того, что вы лапочки, я вас обожаю, и у вас в движке есть скриптуемое всё и UI, это может быть и того быстрее.
        • 0
          Вот здесь Владимир Головин (создатель Filter Forge) на вопрос
          I would like to know if a Filter Forge GPU based render engine is in the pipeline

          отвечает
          Currently no, and I can't say anything about future releases. Look at Aperture's problems with their GPU-based photo editing (or was that Lightroom?) — simply put, you have different results on different cards and different video drivers.

          Would be nice for preview purposes though.

          Хотя да, пост довольно старый (2006 г.) и всё уже скорее всего изменилось много раз.

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

          Но к сожалению судя по этому списку feature wishlist, основная проблема всё-таки в том, что архитектура Filter Forge не очень ложится на GPU-based rendering.
  • 0
    Unigine крутой движок. Присматривался к нему, но побоялся выкладывать такую сумму на первый игровой проект. Взял пока C4 Engine Pro.
    Желаю вам удачи! Ваши бенчмарки очень впечатляют.
  • +6
    Как это здорово, что процедурное генерирование текстур используется в играх!
    Ещё со времён знакомства с Werkkzeug — ожидал увидеть подобное.
    Хорошего кода!
  • +2
    Приобрел Oil Rush с первого дня релиза и ни разу не пожалел. Хотелось бы задать вопрос разработчикам не по теме. Планируете ли ещё какие либо проекты (речи о порте на андроид не идет)?
    • +1
      Спасибо на добром слове!
      Да, планируем — есть несколько вариантов сейчас.
      • 0
        И еще один нескромный вопрос не по теме.
        Купил моментально и не задумываясь, как только узнал о выходе. Испытываю просто поросячий восторг — так на долго игрушки, в которые я в принципе не играюсь не увлекали думаю еще с 90-х (трава… деревья… ну вы в курсе) Каковы шансы увидеть его в стиме под Linux? Нет, ну просто иметь приобретенный под Win и играть в линуксовую пиратку — это как-то уж слишком.
        • +4
          Прямо сейчас доступна standalone версия под Linux.

          Steam/Linux версия почти готова — планировали в январе выпустить, но сползло на февраль из-за того, что выпуск бенчмарков пришлось приоритезировать.
  • +1
    У вас природа и окружение выглядят прямо как на фотографии :) а вот корабли заметно «компьютерные»
    • +2
      Разные художники работали, немного по арт-дирекшену разнобой случился. Учли на будущее =)
  • +5
    Photoshop, являясь де-факто стандартом приложения по созданию текстур, к сожалению, остаётся инструментом только для фотографов и ретушеров. До сих пор не было значимых улучшений, направленных на внесение недеструктивности редактирования и параметризации картинки, что очень сильно осложняет работу не только создателям контента для 3D графики, но и дизайнерам интерфейсов, 2D художникам, веб-дизайнерам.

    На заметку разработчикам ПО. Назрела вполне реальная проблема. Дайте решение и пользователи наверняка купят ваш продукт.
  • +1
    Возможность формирования изображений в HDR (High Dynamic Range) диапазоне с дальнейшей регулируемой конвертацией его в LDR
    Это реально где-то применялось?

    Глядя на граф фильтра Filter Forge, создается впечатление, что на его создание и настройку потребовалась не пара часов, а побольше. Сколько времени уходило на ресерч нового материала? Кто этим занимался, художник (любой) или специально обученный человек?
    • 0
      Фильтры с нуля созданы ведущим техническим художником.
    • +1
      Время резерча нового материала прямо зависит от скила и времени работы с подобным софтом. Если первые фильтры делались, например дня 2, то последние 3-4 часа. Все зависит от текущих наработок. Части фильтров можно копировать кусками и затем использовать в других фильтрах. Так что объемность графа связана с тем что группировка и инстанс блоков стали появляться только в 4й бетаверсии FilterForge.
  • 0
    Деморолик движка приятно впечатлил. Спасибо за пост.
  • 0
    Процедурные миры захватывают.

    У вас текстуры сгенерированы заранее, в итоге? Или вы генерируете их при старте игры, тем самым минимизируя занимаемый ресурсами объем?
    • +2
      Да конечно, процедурный метод в данном случае использовался скоее как вспомогательный и текстуры сгенерированы заранее. Однако у allegorithmic есть решение Substance Air, позволяющее генерировать текстуры в рантайме.
      • +1
        Ну этот метод обычно в демосцене применяют. Есть там номинация, мелкие игры — игра уровня третьего квейка в 90 кб, допустим, они там при старте все генерят, соответственно стартует долго и в оперативке метров в 300 разворачивается — по тем временам это было немало.
  • 0
    Спасибо за статью. Я для генерации ландшафтов использую World Machine. Удобная нодовая структура, эскпорт всех требуемых карт, 3d просмотр.
    • 0
      Про World Machine — во второй части статьи.
  • +1
    Потрясающе! Сразу .kkrieger вспомнился — почти полноценный 3D-шутер с неплохой графикой размером 97 килобайт. Там вообще весь контент генерируется процедурно, включая модели оружия и врагов, и их анимацию. Я когда понял как оно работает — долго думал: ну почему же такая прекрасная техника почти никем не используется? Оказалась — используется, и очень даже эффективно и эффектно! Еще раз: это потрясающе красиво!
  • 0
    Спасибо, очень красивые скриншоты. Даже несмотря на то, что не имею прямого отношения к геймдеву было очень интересно почитать, как же такая красота делается. У меня вопрос, скорее всего глупый, но все же. Все перечисленное в статье работает под DirectX? И насколько это все, скажем так, урежется или изменится при портировании на OpenGL ES, используемый в Android?
    • 0
      Связь с конкретным графическим API минимальна. Все ресурсы ведь предрассчитаны и поставляются вместе и игрой, а не генерируются на клиентском железе. Т.е. для API и движка эти ресурсы ничем не отличаются от тех, которые создаются художниками вручную.
  • +2
    Статья огромная и сложная, но захватывает :) Обычно такие разбивают на 3-4 части.

    P.S. Денис, Александр, рад видеть вас на Хабре! Ждем новых статей и описаний, например, про атмосферу и скеттеринг.
    • 0
      Алексей, добрый вечер! =)
  • +1
    Удивлён, что вы обошлись без фракталов. Сразу заподозрил процедурность в ваших айсбергах и скалах, но показалось, что и фрактальность разглядел там отчётливо.
  • 0
    Очень крутая статья, продолжайте в том же духе!

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

Самое читаемое Дизайн