Что такое повторяемость tiling текстуры

Как улучшить качество текстур: разбор методов оптимизации UV

Привет, DTF, у вас тут вроде говорят о геймдеве, иногда. Я хочу рассказать о UV Unwrapping, о том, как качество UV влияет на качество текстур. У новичков частенько всплывают вопросы, в стиле «а почему такое низкое качество, 4К же поставил» — естественно, без упоминания того, что развернули автоматически или объект размерами как дом, а текстурируется одним уникальным материалом.

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

Методы текстурирования

Тайловое текстурирование

Видеокарта просчитывает текстуру один раз, когда UV Shells (острова) выходят за пределы квадрата, текстура копируется и никаких новых просчетов не происходит. Паттерны текстуры с обеих сторон продолжают друг друга, чтобы не было швов.

Модель из Overwatch (локация «Темный лес») Слева UV Развертка

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

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

Пример смешивания двух тайлов на стене. Модель из Overwatch (локация «Темный лес»)

Почему на больших объектах используются тайлы? Чем больше плоскость, тем ниже плотность пикселей, а отсюда и низкое качество, так называемое «мыло». Этого можно избежать, повышая разрешение текстур или часто применять overlapping.

Космический корабль, текстурирован тайлами Sketchfab

Атлас тайлов или тримы

Trim sheet или «тримы» — это текстуры для вытянутых элементов: доски, стены, плинтусы. Тримы бесшовные в одном направлении, иногда в них ещё добавляют декали. Примеры таких текстур.

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

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

Пример атласа тайлов Victor Karp

Классический метод текстурирования или уникальный

Под «уникальным» подразумевается то, что материал будет только на одном или на нескольких похожих объектах, необязательно для каждой детали делать отдельный материал — всё зависит от модели, размеров и требования к качеству.

Для уникального материала делается грамотно упакованная развёртка — что значит «грамотно», буду разбирать ниже, а пока пример плохой и хорошей развёртки.

Процедурное текстурирование

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

Говоря о процедурном текстурировании, я имею в виду материалы, что учитывают форму геометрии и добавляют детали. В этом методе текстуры накладываются трипланарным проецированием, без использования UV-развёртки. Хороший пример из движка Unigine.

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

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

Так как текстурить-то

Определяйтесь исходя из размеров объекта, требований к оптимизации.

Как понять, насколько объект большой, когда разделять модель на уникальные материалы или на тайловые? Тут вам поможет texel density.

Texel Density

Аббревиатура из двух слов «Texture» и «Element» — текстура и элемент. Величина, которая является отношением размера текстуры (в пикселях) к габаритам 3D-модели в сцене. Если интересно подробнее, то вот несколько ссылок по этой теме: Habr: Texel density, artstation: Texel Density, blender3d: Texel Density, artstation: Texel Density Theory, artstation: What a Texel Density.

Я сделал модель, что это — не знаю, просто для примера. На ней буду демонстрировать все этапы оптимизации UV-развёртки.

Чтобы следить за результатом, буду постоянно проверять TD (Texel Density) Разворачивать буду в Blender 3D + Аддоны. Если у вас другой софт, просто найдите аналогичный инструментарий у себя или обратите внимание на программы RIZOM UV и UVlayout

Сделал авторазвёртку стандартным инструментарием, если верить расширению Texel Density Checker то мой общий тексель сейчас при разрешении 2048px составляет 1,560 пикселя на сантиметр — это усредненное значение на всю модель, в некоторых местах есть незначительная разница. А ещё аддон говорит мне, что я использую только 44% UV-пространства, больше половины пикселей текстуры уйдут в никуда. Это очень плохо.

На задней стороне корпуса есть окошко, туда я собираюсь вводить текст при текстурировании, далее буду следить за TD именно на нём, сейчас в этом участке 1.338 px/cm — маловато.

Для начала подниму процент используемого UV-пространства, расставив все острова плотнее. Сделаю это автоматически с помощью аддона UVPackMaster (PRO).

Напомню, что существуют программы RIZOM UV и UVlayout — в них также есть плотная авторазвертка. Если ваша модель не слишком детализированная, то проще и даже лучше сделать это вручную.

Расставив UV-острова плотнее, их размеры удалось увеличить, ну и TD соответственно, в ранее упомянутом окне сейчас 1.531 px/cm. Однако это ещё не достаточно плотная UV, можно уменьшить Padding — расстояние между островами

Плотная упаковка UV

Насколько плотно друг к другу упаковывать UV острова, почему между ними должно быть расстояние — вполне достаточно знать рекомендуемое расстояние паддинга:

Это только рекомендации, значения могут быть другими, в зависимости от того, как настроен Mip Mapping, в игровом движке.

Padding и Mip Mapping

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

Генерация паддинга в Substance Painter Substance docs

Mip Mapping. Вкратце — при отдалении камеры, у текстур снижается разрешение, для оптимизации. Это почти то же что и лоды, но для текстур. Разрешение текстур снижается, а значит растёт размер пикселей и те выходят за пределы UV-острова, попадая на другие, если между ними не будет расстояния, на модели появляются швы.

Справа пример без паддинга Substance docs

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

Если хотите больше подробностей о том что такое Padding и MipMap, то вот несколько ссылок: Polycount: Edge padding, Polycount: Mip Mapping, Substance docs: Padding, Wiki: MipMap, GameDev.ru: MipMap, Habr: Пиксельные отступы.

Вернемся к моей модели, я буду текстурить в разрешении 2048px, поэтому запакую с паддингом в 16px, теперь TD 1.616 px/cm, незначительный прирост, в моём случаё изначально расстояние было не слишком большое.

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

Overlapping

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

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

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

Текстура царапин повторяется по двум осям из за чего становится похожа на ручной узор а не царапины

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

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

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

Теперь запакуем с overlapping, проверим результат. TD 2,354 px/cm — гораздо лучше. Напомню, что было 1,616 px/cm. Результат уже виден наглядно, по размеру шахматной текстуры.

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

Проблема overlapping: зеркальность

Тексты очень плохо дружат с overlapping — их буквально отзеркаливает. Очевидное решение: не используйте overlapping именно там, где будете что-то писать. В случае с этой машинкой можно просто развернуть дверь отдельно, но это не единственный выход. Для текста можно использовать декали (сделать ещё один полигон сверху и наложить на него надпись с прозрачным фоном).

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

You spin me right round

Запекание ambient occlusion с overlapping, неуместные тени

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

Несколько вариантов решения:

Первый вариант — отодвинуть геометрию друг от друга, если конечно это отделяемая геометрия. В Painter или в Marmoset Toolbag двигать не обязательно — есть функция Only Same Mesh Name. Для АО включается отдельно.

Если не понимаете, о чём речь, то вам лучше посмотреть уроки по запеканию карт, я сейчас не буду заострять внимание на этом.

Второй способ — исключить повторяющиеся элемент из запекания. Для этого выделяем оверлап острова и отводим в любую сторону, ровно на один квадрат. В Blender 3D это делается двумя нажатиями: «G» и «1».

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

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

Запекание Normal map с overlapping, искажения

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

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

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

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

Запекание Normal map с overlapping, артефакты, рёбра треугольников

Этот артефакт воспроизводится, когда есть overlapping, модель триангулирована и включен antialiasing в настройках запекания. Основная причина, как я понял, в antialiasing. Исправляю я её исключением симметричной стороны из запекания — как это делается, я уже писал выше.

Вроде перечислил все проблемы. По крайней мере те, с которыми я сам сталкивался, вернемся к оптимизации UV.

Выпрямляем UV

Когда мы делаем линии с наклоном, то получаем вот такие лестницы:

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

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

— насколько это возможно, наглядно.

Помимо устранения лестниц такие ровные UV-острова проще упаковать. На моей модели есть несколько деталей, которым стоило бы упростить форму.

В каждом 3D-пакете есть возможность посмотреть растяжение UV, в Blender3D например в 2D окне/view/overlays/stretching, синий цвет UV — это хорошо, красный — плохо. Просто следите за этим, правьте только те детали, что не станут краснеть.

Как быть в тех случаях, когда сама геометрия не ровная? Оставить как есть, но если рёбра наклонены не слишком сильно, то можно попробовать выпрямить. В Painter есть функция трипланарного проецирования — она растянет текстуру по неправильной UV так, что на геометрии она будет выглядеть корректно, но с этим лучше не перебарщивать.

Что вообще из себя представляет трипланарное проецирование? Это не сложно понять как минимум по названию, но если у вас есть интерес, то напишу отдельную статью.

Программе стало проще упаковывать UV с прямыми линиями, отчего я поднял TD, с 2,354 до 2,366 px/cm — мелочь конечно, но я не ради этого выпрямлял их, да и не тот пример. Была бы модель изначально с кучей неровностей то можно было бы показать разницу.

Распределение текселя

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

На мою модель можно посмотреть со всех сторон, но внутренняя сторона корпуса, как мне кажется, занимает много места, а взгляд туда не падает.

Совсем немного уменьшу размеры UV-островов внутренних стенок и снова запакую, программа сама отмасштабирует все остальное, чтобы закрыть свободные участки. Это позволило немного поднять TD, было 2,366 стало 2,590 px/cm

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

Завершение

Теперь можно закрасить это и сравнить качество первоначальной развертки c текущей. Сравнение текста.

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

Фаски стали лучше скрывать острые углы а швы менее заметны. Общий вид:

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

Источник

Тримы, тайлы и террейн: как происходит ремастеринг игровых карт

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

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

Для начала мы решили взять четыре наиболее отличающиеся атмосферой карты с относительно небольшим количеством внутриигровых ассетов: Canyon, Powerplant, Valley и Moon. Это было необходимо для обкатки новых технологий — после чего, с уже устоявшимся пайпланом, мы могли бы обновить и остальные более сложные уровни.

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

Иными словами, нам было нужно:

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

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

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

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

Для примера возьмем центральное здание карты Valley. Ниже показан оригинальный концепт и его реализация в «ванильной» версии War Robots:

А теперь посмотрим на концепт и 3D-модель той же самой постройки в War Robots Remastered:

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

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

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

По части кода мы переписали практически весь пайплайн рендеринга (Scriptable Render Pipeline, SRP), и теперь вместо классического рендера материалов (diffuse/normal/specular) у нас используется современный физически корректный рендеринг — PBR (albedo/metallic/normal/smoothness) для более точной передачи физических свойств материалов. Но об этом мы еще расскажем подробнее в будущих статьях.

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

Что такое тайлы и тримы?

Основные ограничения по текстурам, накладываемые памятью лоу-энд девайсов, — это один, максимум два массива из 16 текстур с одинаковым разрешением 512×512px на основную геометрию уровня, которую можно и нужно текстурировать тайлами и тримами. Для HD-пресета мы можем использовать разрешение и 1024×1024px с более прогрессивными алгоритмами компрессии — и это почти не увеличивает потребление памяти, но по факту визуально разница на экранах мобильных устройств невелика. Обычно мы используем по одному массиву текстур на геометрию уровня и для террейна, использующему каждый свои шейдеры для специфических задач. Например, на индустриальных объектах не нужен такой плавный переход между текстурами, как на террейне. Вообще любые плавные бленды сложнее по просчету для GPU, поэтому шейдер террейна мы используем только на природных объектах.

Атлас для карты Canyon Legacy (2048×2048px) и набор из 16 текстур для карты Canyon Remastered (512×512px)

Что касается полигонажа, здесь мы тоже шагнули далеко вперед: теперь для HD-пресета качества в нашем распоряжении до 500 тысяч треугольников, тогда как раньше было максимум 200-300 тысяч.

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

Итак, типичная игровая карта в War Robots состоит из:

А теперь, наконец, перейдем к основной артовой части.

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

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

Ниже представлен один из концептов для карты Canyon:

Что мы здесь видим?

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

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

Общую плотность текселей — плотность пикселей текстуры на единицу масштаба объекта — мы решили использовать в районе 128 px/m2. Этого вполне достаточно, чтобы прорисовать даже мелкие детали на дверях, окнах, решетках и подобных элементах, которые не поплывут после сжатия до 512×512px ETC2.

Обычно мы создаем текстуры в связке 3ds Max/Maya + Substance Painter или Substance Designer + Substance Painter, но некоторые заимствуем из библиотеки Megascan от Quixel и редактируем под наши нужды. Пайплайн здесь несложный: моделируем геометрию в 3ds Max или Maya, разбиваем ее на ID Color, а потом запекаем все карты в Marmoset или в Substance Painter. После этого вся работа ведется уже в Substance Painter.

Другой вариант: в Substance Designer получаем все необходимые карты (height, normal, AO, curvature) и выгружаем в Substance Painter для текстурирования. А иногда текстурируем и сразу в Substance Designer — кому как удобнее.

Как только готов набор текстур, можно приступать к моделированию основной геометрии уровня. Для этого мы берем *.obj-файл концепт-болванки (если есть), делаем из него оптимизированное лоу-поли, стараясь сохранить интересный силуэт. При этом следим за объемом, чтобы здание не выглядело слишком плоским и скучным. Где нужно, добавляем дополнительную геометрию с небольшими скосами. Там, где можно обойтись просто тримом — нарезаем геометрию на полоски и мапим уже на них текстуры. Хотя зачастую при использовании технологии тайл- и трим-текстур это и не нужно: модель создается одновременно с текстурированием.

Главное на этом этапе — не переусердствовать и не превысить общий полигонаж сцены. Для HD-пресета качества этот предел достигает 500 тысяч треугольников. При этом наши игровые карты по своему наполнению сильно разнятся: где-то хватит и 300-400 тысяч, а где-то может не хватить и этих самых 500. Но мы помним, что ограничения и оптимизация — превыше всего, поэтому ради них порой приходится жертвовать красотой картинки.

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

В целом полигонаж на уровни детализации определяется следующим образом:

В HD-пресете у нас используются только LOD0 и LOD1, в LD — LOD3 и LOD2 как базовый меш, в ULD — только LOD3 в качестве базового меша.

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

Наряду с постройками ведутся работы и по террейну. Базовый меш создается в World Machine или World Creator. Там же генерируются маски для SplatMap RGBA — текстуры, показывающей, где какой тайл прорисовывать на геометрии террейна.

Меш, как правило, впоследствии дорабатывается и оптимизируется руками, а SplatMap дорисовывается в Substance Painter или уже непосредственно в Unity с помощью плагина Splat Painter.

Перед выгрузкой *.fbx в Unity мы назначаем цвета вершин на полигоны по ID в соответствии с нашей рабочей таблицей:

В Unity шейдер по цвету определяет, какую из 16 текстур массива использовать. Таким образом, в проекте получается по одному ID материалу на каждый меш. А если нужно использовать разные шейдеры, то просто разделяем этот меш на подобъекты.

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

Так выглядит карта до запекания света и заполнения объектами детализации:

А так — после финальной полировки:

И снова здесь главное не перенасытить сцену мелкими объектами, которые впоследствии придется убирать при генерации разных качеств (HD, LD, ULD). Следим также за композицией объектов в кадре, чтобы она смотрелась красиво и гармонично с любого ракурса игровой камеры. Если нужно, сводим текстуры по тону и цвету, чтобы они не выбивались из общей картины.

Далее происходит оптимизация — один из первых технических этапов, после которых карта попадает в билд. Здесь идет настройка лодов, материалов, дистанции отрисовки, в случае обнаружения критических багов правится геометрия. После добавления всех объектов на source-сцену она передается левел-дизайнеру на ревью геометрии и читаемости окружения с точки зрения геймплея. После этого считается, что уровень целиком готов, и наступает следующий этап генерации разных качеств (HD, LD, ULD) от исходной source-сцены. В арсенале технических художников есть отличные инструменты для автоматизации этого процесса, но ручной доработки все же не избежать.

Так выглядят HD, LD и ULD пресеты карты Canyon

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

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

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

До/после: карта Canyon из «ванильной» War Robots и War Robots Remastered

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

Источник

Добавить комментарий

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