Gamedev
Олег Мощенко
2853

Создание оружия для ААА игр. Оптимизация модели и текстуринг

Что такое Texel Density, Mip mapping и Padding, зачем нужна триангуляция и как сделать правильный шейдинг, какие основные принципы создания реалистичных текстур оружия для игр. Обо всем этом расскажет Евгений Петров — Lead Weapon Artist в компании Ulysses Graphics, где он длительное время работал над оружием для серии Call of Duty (WW2 и Black Ops4).

В закладки
Аудио

Shading

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

То есть слева low poly модель, максимально похожая на high poly: выглядит красиво, нет никаких артефактов и искажений. Справа видны ошибки в шейдинге, искажения.

Основные инструменты воздействия на шейдинг — это добавление большего количества геометрии. Если этот вариант не подходит, — проставление хардов. Изначально шейдинг модели на гифке ниже недостаточно корректно отображает ее форму. С добавлением edge loops модель шейдится лучше. Ее форма становится понятней.

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

Поэтому хороший шейдинг — это баланс между софтами и хардами.

Совет всем начинающим: настраивайте шейдинг во время low poly стадии. Таким образом вы прямо по ходу ретопологии можете знать, где добавить дополнительную геометрию, а где поставить hard edge.

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

Texel Density

Это количество пикселей на текстуре, которое соответствует физическому размеру объекта. Слева на скриншоте — UV развертка ствола пистолета. Допустим, на текстуре 2К он длинной в 10 пикселей. Справа мы видим сам ствол. Предположим, что его длина 10 сантиметров. Таким образом Texel Density будет 1 пиксель на сантиметр.

Это нужно для того, чтобы абсолютно все объекты на уровне имели одинаковое разрешение текстур. Предположим, на уровне есть две бочки — одна маленькая, другая большая. Если мы применим к ним одинаковую текстуру в 2К, плотность их текстур будет отличаться. Маленькая бочка будет крайне плотная и детализированная, большая будет замыленная. Чтобы избежать этих проблем появился термин Texel Density.

Очень часто бывает, что клиент задает необходимое значение Texel Density, но не задает разрешение текстур. Раньше это создавало трудности. Приходилось колхозить. Сейчас в UV Editor Maya 2018 есть специальный инструмент. Выбираете необходимый UV Shell, нажимаете Get и вам выдает числовое значение, в зависимости от разрешения текстур. Точно так же можно выбрать любой Shell, задать цифру, нажать Set и Texel Density будет такой, как вы задали.

Распределение Texel Density.

Предположим, что желтый цвет — это Texel Density, которого мы должны придерживаться. Чем краснее цвет, тем его значение больше, текстура плотнее, детализация выше. И наоборот, — чем синее, тем значение меньше.

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

С другой стороны, уменьшить детализацию там, куда никто не смотрит — это прием из разряда «must have». Абсолютно независимо от того, какой объект вы делаете.

Для одного из тестовых я делал квадратный генератор. Его днище, которое в принципе никогда никто не увидит, я разъювишил точно так же, как и все остальное. То есть оно занимало ¼ моего UV пространства. Это было абсолютно не оптимальное использование текстуры. Для экономии пространства, в невидимых местах, заполненных геометрией, необходимо использовать крайне маленькие шеллы текстур.

Reuse

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

Возьмем, например, пистолет. Его рукоять симметричная. Почему бы не использовать одну и ту же текстуру для обеих сторон? Все, что на гифке отмечено красным, используется повторно. То есть на UV пространстве оно занимает одно место, а на модели используется дважды.

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

Ровные UV Shells

Для примера, я запек два кубика с одинаковым Texel Density и текстурой. Но в кубе слева все UV Shells выровнены по горизонтали и вертикали, а справа повернуты под углом.

Ровные шеллы создают хорошую, красивую фаску. Если же шеллы повернуты, мы видим эффект лесенки. Это крайне некрасиво. Особенно на игровых разрешениях текстур. Потому что в играх используется маленькое разрешение, на котором это очень заметно. Поэтому любой прямоугольный шелл нужно выравнивать. Даже если это не идеальная прямоугольная форма на самом объекте, я его специально выравниваю, чтобы на UV он был ровный.

Mip Mapping и Padding

Если игрок отдаляется от какого-то игрового объекта, то модель этого объекта меняется на менее полигональную. Точно так же с текстурами — чем дальше мы отходим, тем меньшая текстура к нему применяется. 4К подменяется на 2К, когда мы отходим еще дальше — на 1К. Этот прием экономит ресурсы вашего компьютера.

Padding — это расстояние между UV Shells. Чем меньше это расстояние, тем сложнее отображать текстуры при Mip Mapping. Потому что при уменьшении текстур, уменьшается и расстояние между шеллами. Padding нужно всегда делать побольше, или хотя бы следить за тем, чтобы он везде был равномерным. Для персональных работ, в принципе, все равно, но если вы делаете проекты для клиентов, на это следует обращать внимание.

Триангуляция

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

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

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

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

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

Градиенты на нормалях

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

Почему градиенты — это плохо?

Текстуры — это самая затратная часть любой игры. Когда вы качаете игру на 150 гигов, 100 из них — текстуры. Но все они компрессируются, что ухудшает их качество. Лучше всего компрессия видна в тех местах, где есть градиенты. Поэтому при максимально ровной нормалке ошибок быть не должно. Они, конечно, будут, но значительно меньше, чем с градиентом.

Текстуринг

Начнем с того, как удобнее отправлять модель в Substance Painter. В моделях оружия есть труднодоступные места. Например, внутренность магазина или рукоятки. Поэтому перед тем как отправлять модель в Substance Painter, я дублирую собранный пистолет, отвожу его вверх и раскидываю на мелкие детали. Таким образом я могу видеть текстуры на собранной модели и на каждом объекте отдельно.

Источник света в Substance Painter нельзя регулировать по вертикали — только по горизонтали. Поэтому полезно будет повернуть модель на 90 градусов. Так текстуры будут лучше видны сверху и снизу пистолета.

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

Edge Wear

Износ по краям. Это главный инструмент процедурного текстурирования в Substance Painter и самое мощное устройство, которым нельзя не пользоваться. Если мы посмотрим на любой объект в реальном мире, который был в употреблении, на любом материале будет износ по краям. Не надо делать прям настолько сильно, но высветленные края — это крайне важно.

Cavity Dirt

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

Вариации

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

Точно так же на глосе. У нас не может быть одинаково глянцевых объектов. Его залапали, он потерся — всегда бывает вариация. Это крайне важно.

Градиент

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

Уникальные маркировки

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

Вот пример того, как базовые материалы превращаются в финальную текстуру примерно через 50 слоев в Substance Painter.

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

История

Каждый объект должен рассказывать свою историю. Это банальный тезис, но, тем не менее, он работает. У каждого объекта должна быть своя индивидуальность. На рукояти автомата облуплена краска в том месте, где за нее держались. Цифра 5 — яркое пятно. Абсолютно не важно, что это значит, оно создает ощущение, что этим предметом пользуются. Резинка для волос на рукояти — это уже не элемент текстурирования, но это инструмент рассказывания истории. В оружии это хорошо работает.

Места интереса

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

Места интереса — это крайне важная штука.

Референсы

Референсов много не бывает. Для текстурирования и для моделинга я собираю разные референс борды. Это пример моего борда для текстурирования.

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

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

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

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

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

Надеюсь, что статья была полезной для вас. Подписывайтесь на нас в Facebook, Telegram, Vkontakte, Pinterest, чтобы ничего не пропустить.

Материал опубликован пользователем.
Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Олег Мощенко", "author_type": "self", "tags": [], "comments": 15, "likes": 89, "favorites": 314, "is_advertisement": false, "subsite_label": "gamedev", "id": 96346, "is_wide": false, "is_ugc": true, "date": "Fri, 24 Jan 2020 15:26:18 +0300", "is_special": false }
0
{ "id": 96346, "author_id": 196963, "diff_limit": 1000, "urls": {"diff":"\/comments\/96346\/get","add":"\/comments\/96346\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/96346"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954, "last_count_and_date": null }
15 комментариев
Популярные
По порядку
Написать комментарий...
7

Лайк за то что на опять реклама xyz 

Ответить
0

аж трясет!

Ответить
0

Тебя трясёт ? Я в ваши треды даже не лезу уже 

Ответить
0

тут скорее сарказм с твоего сарказма

Ответить
2

Ну и "разювишил" в том же абзаце лучше, наверное, написать с твёрдым знаком, "разъювишил".

Ответить
0

По факту как считать реф, если брать его как реф для текстуры.

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

Ответить
1

Ого, иксперд-зануда.

Ответить
0

А такого красивава, как на картинке, градиентного визуализатора плотности пикселей в майку еще не подвезли? Пока я знаю лишь про напряжение в пределах шелла (дисторшн)

Ответить
0

Боюсь ещё не скоро, автор либо делал его другим софтом, либо что по факту для большинства "про" проще и быстрее чем скакать с софтины на софтину, заморочился ручками всё это делать. Как то так.

Ответить
1

Я, вот, подумал про написать скрипт или реализацию в сети, но как удобно руками визуализировать плотность - не пойму. Слишком много возни по-моему.Чекер, конечно - наше все, но градиентная окраска - это супер.

Ответить

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovz", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "chvjx", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } }, { "id": 20, "label": "Кнопка в сайдбаре", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "chfbl", "p2": "gnwc" } } } ]
{ "jsPath": "/static/build/dtf.ru/specials/DeliveryCheats/js/all.min.js?v=05.02.2020", "cssPath": "/static/build/dtf.ru/specials/DeliveryCheats/styles/all.min.css?v=05.02.2020", "fontsPath": "https://fonts.googleapis.com/css?family=Roboto+Mono:400,700,700i&subset=cyrillic" }