Привет. Меня зовут Данил. Я хочу с Вами поделиться своим опытом создания модели по базовому пайплайну. Помимо всего прочего, я так же расскажу о проблемах, с которыми я столкнулся во время работы.
Модель над которой я работал:
К удивлению, подобные статьи стали пользоваться большим спросом, поэтому я и решил написать свою первую статью именно об этом. Сам я начал интересоваться 3D моделированием около года назад и с попеременным успехом в свободное от работы и учёбы время изучал особенности создания game-ready моделей. И вот последние пару месяцев я активно «набивал руку» созданием игрового окружения.
Модель вагонетки, о которой я буду рассказывать ниже, отличается от предыдущих моих работ, так как в данном случае я наконец-то смог добавить в свой пайплайн Zbrush и его чудесные инструменты скульптинга. До этого я обходился без запечки карт нормалей и использовал атласы вместе с mid-поли моделями.
Естественно, так как я не прибегал к помощи каким-либо курсам, у меня не было возможности узнать обо всех особенностях работы с high-поли моделями, поэтому на протяжении всей работы над проектом я совершил достаточно неоднозначных ошибок, о которых я так же расскажу в этой статье.
Заранее сформулирую цели данной статьи:
В первую очередь мне интересно получить опыт презентации моих работ. Данная статья отражение моего немногочисленного опыта и я ставлю перед собой задачу грамотно и понятно расписать обо всех проблемах, с которыми я столкнулся во время разработки. Из чего вытекает следующее — я открыт для критики. Если у Вас есть какие-либо замечания или предложения по поводу оформления статьи и представления информации, то я с радостью их приму. То же самое касается и моей модели.
Долгое вступление закончено — можно приступать.
В работе я использовал всеми известный пайплайн:
Референсы
Blockout
Создание High Poly
Создание Low Poly
UV-развёртка
Запечка текстур
Текстурирование
Причину по которой я выбрал вагонетку в качестве модели я уже и не вспомню. Но в результате я остановился именно на этой идеи, потому что это была хорошая возможность попробовать себя в скульптинге металла и дерева — чем я до этого не занимался.
Для композиции я заранее придумал историю: кладоискатели в старой заброшенной шахте нашли древние китайские золотые монеты и чтобы его перевести они используют так удобно рядом расположившуюся вагонетку на рельсах.
Подобную историю я использую как начальное направления для поиска референсов: вагонетка — старая, рельсы — старые, золотые монеты — грязные. Я не ставил перед собой задачу сделать поломанное корыто, но отразить старость в виде побитых краёв, плесени и грязи — хотел.
Этап сбора референсов, лично по моему мнению, не представляет ничего сложного. Модель не обладала большим количеством деталей, а соответственно необходимость в большом количестве референсов отпадает.
Я взял несколько фотографий для представления форм вагонетки и рельс
Конечные варианты блокаута
Я считаю что блокинг является одним из самых главных этапов. На этапе прототипирования можно быстро найти нужную форму и, если это необходимо, цвет.
Этапы блокаута
Как правило, блокинг не затрагивает много времени, но в результате позволяет сохранить много нервов на последующих этапах.
Помимо всего прочего, иногда проще формировать форму для скульптинга заранее. Поэтому я пришёл к тому, что мне легче сперва создавать примитивы в Blender, а уже потом импортировать их в Zbrush. Работать с отдельными полигонами в Zbrush мягко говоря неудобно.
Конечный скульпт
Этот этап занял у меня безусловно много времени, но, как это не было странно, совершенно не создал проблем. После импорта базового меша я сразу же автоматически разделил модель на полигруппы и разбил на отдельные сабтулы.
Совет для тех, кто как и я только начал использовать Zbrush — разбивайте геометрию на отдельные сабтулы. Часто приходиться работать с очень плотной сеткой и лучше иметь возможность скрыть те элементы, с которыми вы не работаете, чтобы не отнимать ограниченные мощности вашего пк. Данный подход позволит проще манипулировать геометрией и делать её более детализированной.
Начал я сразу с деревянных частей. Для скульпта я использовал DynaMesh. По необходимости использовал SubDivision.
К текстурным альфа-картам я прибегал только при работе со срезами дерева.
В остальных случаях я создавал фактуру дерева вручную.
Этапы создания древесной фактуры
Для дерева я использовал бесплатный набор кистей Orb Brush от художника Blizzard.
Во время работы над металлом я часто ссылался на один из относительно старых уроков от XYZ о том, как заскульптить металл в ZBrush. Я не уделял особого внимания мелким царапинам, так как заранее полагал, что данную особенность материала проще воссоздать на этапе текстурирования.
После того как я закончил с основными материалами, я решил, что модели не хватает крупных болтов, которые отражали бы массивность конструкции. Добавлял я их через кисть IMM Ind. Parts. В Zbrush есть довольно обширный набор инструментов для добавления заготовленных примитивов. Я не стал скульптить большое количество болтов — сделал пару вариантов и всё. Потом, на этапе сборки финальной модели, я хаотично продублировал эти несколько болтов по всей рамке вагонетки.
Этапы скульптинга болтов
При скульптинге я заранее обдумывал, какие элементы будут накладываться друг на друга при развёртке, а так же какие элементы я могу повторно использовать чтобы не делать лишнюю работу.
По поводу оптимизации Zbrush-файла:
Время от времени чистите историю своих сабтулов. Порой zpr-файл может весить несколько гигабайт только потому, что у вас в нём храниться история на пару тысяч шагов.
Лично я предпочитаю вовсе отключать сохранение истории.
Конечный вариант LP
Низкополигональную модель я делал на основе blockout-модели.
Модель, которую я использовал для запечки
Я не стал заранее производить оверлапинг, так как знал, что мне частно придётся править модель — а чем меньше деталей придётся править тем лучше. То же самое касается UV (о чём чуть позже).
Конкретно этот этап и создал у меня большую часть проблем.
ВНИМАНИЕ!
Только на этапе написания статьи, я обнаружил, что допустил ошибку на развёртке — один шел залезает на другой.
Это не критично, так как шел всё равно находиться в не зоны прямой видимости. В результате я просто слегка его поправил, но боюсь в мире не хватит ромашкового чая, чтобы успокоить ярость в моей груди.
Спасибо за внимание!
Сперва я решил разбивать модели на несколько частей, чтобы поддерживать высокую плотность пикселей. Но в результате от 3 отдельных материалов на не самых детализированных моделях мне пришлось отказаться. Чтобы поддерживать приемлемый тексель на всех объектах, я решил использовать по одному материалу с 4k текстурами.
Данный вариант оказался интересным, и я решил на нём остановиться. В результате, развернув обе модели, для вагонетки я получил в среднем 10.24 px/cm, а для рельс — 15.4 px/cm
Так же высокое разрешение текстур позволило мне без проблем использовать минимальный паддинг, что положительно повлияло на итоговую плотность пикселей.
Развёртка для вагонетки / рельс
Конечно всё не сразу запеклось как надо и мне пришлось несколько раз менять швы на модели, чтобы избавиться от артефактов. Так же я добавил на модели фаски, чтобы запечка выглядела лучше.
В некоторых ситуациях скруглённые грани на high-poly плохо запекаются на прямые углы low-poly — в данной ситуации лучшем решением будет добавить фаски.
Правда в таком случае возникает другая проблема — где делать разрез. В показанном выше примере я сделал шов на конце скоса. Подобный вариант можно считать рабочим, так как шов в таком случае не сильно бросается в глаза. Тем не менее порой необходимо сделать шов абсолютно незаметным. Для это придётся добавлять поддерживающие грани и делать шов уже на них.
Плохой / Приемлемый / Идеальный результаты
Так шов точно не будет виден игроку. Правда в таком случае количество полигонов сильно возрастает. Поэтому для объектов, чья угловатость не будет бросаться в глаза, стоит на high-поли избегать слишком скруглённых углов, чтобы не пришлось делать фаски.
Хотя, учитывая современные реалии развития компьютерной графики, экономия количества полигонов не имеет смысла — особенно, если это касается основных для игры объектов. Исключением, безусловно, выступают игры, которые необходимо запускать на мобильном железе.
Для тех, кто работает в Blender:
Встроенные инструменты развёртки в Blender оставляют желать лучшего. Поэтому я прибегаю к использованию некоторых бесплатных аддонов: Texel Density Checker 3 и TexTools.
Texel Density Checker 3 — использую для контроля за текселем
TexTools использую для выравнивания UV-шелов.
Я запекал нормал и AO карты в Marmoset Toolbag. Остальные карты в Substance Painter. И у этого были свои причины…
Для корректной запечки я разбил HP и LP на отдельные мешы и соответственным образом назвал, чтобы корректно запечь AO и Normal Map.
Разбиение в Blender и Marmoset
В Marmoset, в отличие от других программ, есть несколько встроенных инструментов для запекания карт. Данные инструменты сильно облегчают жизнь и делают процесс «бейкинга» проще.
В работе очень полезен инструмент Paint Skew, позволяющий указать где Normal Map необходимо запекать с усреднением, а где без него.
Время от времени необходимо настроить Cage, благо в Marmoset он генерируется автоматически, а инструменты Cage Offset позволяют корректировать его размеры на лету.
Главное — не забывайте сверять в каком именно пространстве касательных (Tangent Space) печётся Normal Map.
Разные движки по-разному воспринимают каналы нормала. Если вы не знакомы с этой темой, то могу порекомендовать эту статью от XYZ.
Этап текстурирования я выполняю в два захода: сперва работаю только с процедурными элементами текстуры, а потом занимаюсь ручной полировкой.
При работе с Substance Painter в слоях отключайте те каналы, которые вы не используете — так вы сможете сэкономить на размере итогового файла ssp. Отключённые каналы на слое будут наследовать значение нижележащего слоя.
Отключение неиспользуемых слоёв
Время от времени производите чистку неиспользуемых элементов файла. Это также понизить размер ssp-файла.
Чистка неиспользуемых элементов
Как правило, количество материалов в Substance Painter более чем достаточно, но иногда необходимо использовать материал или инструмент, которого нет в Substance Painter. В данном случае я стараюсь найти необходимые мне текстуры здесь. Это официальный сайт Substance, в котором можно найти различные текстуры, смарт-маски, материалы и инструменты созданные другими людьми. Всё абсолютно бесплатно.
Если же мне не удаётся найти необходимый мне материал в библиотеке Substance, я создаю его сам в Substance Designer. Это очень мощная программа, которая позволяет создавать любые процедурные текстуры. Я использовал его для создания золотых монет.
После того как я разобрался с процедурными текстурами, я вручную подкорректировал влияние пыли, грязи, царапин и приступил к добавлению деталей, рассказывающих историю.
В примере с вагонеткой я решил добавить пятна от масла и цвета побежалости (радужные цвета, образующиеся на поверхности нагретого металла).
Для добавления масленых подтёков я использовал специальный инструмент Oil Leaks. Он выбрасывает частицы в указанное место, и они стекают согласно заданным физическим параметрам. Обычно я использую дефолтные значения. По моей логике масляные подтёки должны возникать в подвижных деталях.
Масляные подтёки
После этого я приступил к цветам побежалости. В смарт-материале, который я использовал, уже был похожий слабовыраженный эффект. Структуру этих слоёв я и использовал для того, чтобы создать необходимый мне цветовой градиент на колёсах. По моей логике, когда вагонетка с полным грузом спускалась под большим углом, её необходимо было резко тормозить, что формировало искры. Именно эти искры точечно нагревали колёса и каркас вагонетки.
Слой с цветом я взял из смарт-материала Iron Old.
После того как получил необходимый мне результат я готов экспортировать текстуры. Но прежде чем это сделать всегда рекомендую проверить материал на соответствие физическим значениям. В конце концов мы работаем в PBR пайплайне. Для этого в Substance Painter есть специальный фильтр PBR Validate. Чтобы им воспользоваться необходимо создать слой, в котором режим смешивания на всех каналах будет Passthrough. Таким образом мы получаем слой, в котором записана информация со всех нижележащих слоёв. И теперь мы можем использовать фильтр PBR Validate.
В результате мы можем видеть, что наша модель окрасилась в зелёно-красный материал. Где зелёный цвет означает соответствие физически корректным значениям, а красный несоответствие. Уже на основе этих данных можно менять значения matelness и basecolor слоёв, пока материал полностью не станет зелёным.
После того как итоговый материал создан, а файл проекта оптимизирован — можно приступать к экспорту текстур.
В большинстве случае я работаю с немного изменённым базовым пресетом для UE4. Одно из главных изменений — это порядок текстурных карт. Мне удобнее и привычнее использовать сборку Metalness/Roughness/AmbienOcclusion, так как именно в таком порядке текстуры идут в редакторе шейдера UE4.
Изменённый базовый пресет для UE4
Я использую данный вид текстур даже если не собираюсь импортировать их в UE4. Переимпортировать три текстуры быстрее, чем пять.
В качестве формата для файла я использую TGA. Пожалуй это единственный формат, который не создавал проблем ни в одной программе.
После того как все этапы завершены, можно импортировать все ресурсы в движок.
Перед тем как создавать сцену в UE4 я добавил необходимые детали для моей модели: продублировал болты, отзеркалил те элементы, что забыл отзеркалить.
Последние правки у модели
Для наполнения сцены в Unreal Engine я решил использовать Quixel Megascans. Я добавил пару скал и землю.
Сцена со стороны
Последним этапом было добавить свет и постобработку. Так как я уже работал с этими элементами в Unreal Engine, сложностей у меня не возникло.
До постобработки и после
Вот пожалуй и всё. Работал я над этой моделью во время сессии в свободное время. Результат меня более чем устроил, хотя определённо есть ещё над чем работать.
Если Вам интересны другие мои работы — заглядывайте на мой ArtStation. Всем ✌