Пайплайн Blender -> Substance Painter -> Unreal Engine

Пайплайн Blender -> Substance Painter -> Unreal Engine

0. Введение

Когда ты инди, и долго возишься со своим первым (коммерческим) проектом, со временем осознаешь что есть смысл двигаться в угол "Быстро" в том самом треугольнике. Ведь пока ты в очередной раз переписываешь "тот кукожный диалог" или перекрашиваешь "ту мыльную доску в полу сарая главного злодея", какой-нибудь Майк Клубника делает БРРРР и выпускает замечательный Buckshot Roulette. В том и смысл этой статьи, показать быстрый и удобный путь пропса, от идеи до движка.

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

1. Blender

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

Во-первых, размеры.

Пайплайн Blender -> Substance Painter -> Unreal Engine

В Dimensions смотрим чтобы размер нашего пропса был адекватным, с учетом стилистических решений самой игры. В нашей игре будет фиксированная камера, со сценами а-ля диорамы, так что, потолок в аж 4.8 метра так и задуман. Теперь Scale и Rotation, ВАЖНО чтобы в первом были 1, а во втором 0, иначе это может выстрелить в х... ногу в дальнейшем. Если в этих полях другие числа, просто жмем ctrl+A -> All Transforms.
Во-вторых, нормали.

Пайплайн Blender -> Substance Painter -> Unreal Engine

Заходим в Edit mode и включаем Face orientation. Красным показаны "затылки" полигонов. То есть, красная стена слева у нас шиворот-навыворот, надо фиксить. Просто выделяем нужные полигоны, и разворачиваем в нужную сторону. Mesh -> Normals -> Flip.

Пайплайн Blender -> Substance Painter -> Unreal Engine

В-третьих, UV.
Честно, ручная развертка UV, это самая унылая вещь на свете. Где-то это необходимо, например, у сложных хайполи ассетов, или персонажей которые потом будут анимироваться. Но для себя я избрал путь ленивых. Точнее, два пути.

Первый - заходим во вкладку UV Editing, жмем U -> Smart UV Project, и ОКаем на дефолтных настройках. Эта встроенная в блендер тулза автоматически разворачивает UV вполне неплохо, и, как они пишут, хорошо подходит для hard surface ассетов. Смотрим на UV, если никаких косяков в глаза не бросается и нас все устраивает, то идем дальше.

Пайплайн Blender -> Substance Painter -> Unreal Engine

Если UV выглядит плохо, много пустого места, или цельную плоскость разметало по всей карте, пробуем второй путь, путь плагинов. Ставим прекрасный UV-packer, читаем его документацию, выставляем желаемые настройки (мои на скрине) и жмем Pack.

Пайплайн Blender -> Substance Painter -> Unreal Engine

Выбираем понравившийся результат, возвращаемся во вкладку Layout.
В-четвертых, материалы.
Мне удобно когда материалы присвоены, так сказать, логично. Условно разбиваем полигоны на несколько групп: пол, стены, стекло, металлические детали и деревянные детали.
Переходим в Edit mode, через шорткат Z -> 2 включаем Material Preview. В настройках самого ассета заходим в Material, добавляем слоты в нужном количестве, обзываем их, выделяем соответствующие полигоны и материал, жмем Assign.

Пайплайн Blender -> Substance Painter -> Unreal Engine

Экспортируем.
Жмем File -> Export -> FBX, выбираем куда и как, Export FBX.

Пайплайн Blender -> Substance Painter -> Unreal Engine

2. Substance Painter

Создаем новый проект, ставим темплейт Unreal Engine 4 и выбираем наш пропс, жмем ОК.

Пайплайн Blender -> Substance Painter -> Unreal Engine

Сам покрас мы тоже опустим, остановлюсь только на запекании. Нужно оно чтобы всякие смарт материалы, фильтры и прочие генераторы в Painter работали корректно. Да и Ambient Occlusion мы будем использовать в UE, так что, нужно его запечь. Ну и еще, конечно же, классическое запекание highpoly в lowpoly, но у нас стилизация и никакого highpoly нет.

Заходим во вкладку Baking, отмечаем нужные карты (мне достаточно тех что на скрине), у AO ставим Secondary Rays на максимум. Жмем Bake Selected Textures. Если AO выглядит убого, придется покрутить ползунки и чекбоксы, тут уж все зависит от полигонной сетки пропса.

Пайплайн Blender -> Substance Painter -> Unreal Engine

С материалом стекла я не вожусь осознанно, потому что его мы будем накидывать уже в UE. Для этого есть прекрасный пак.
Красим.

Пайплайн Blender -> Substance Painter -> Unreal Engine

Покрасили.
Пора экспортировать, и тут момент, из-за которого и пришла идея этой статьи. Substance Painter будет экспортировать сеты текстур отдельно для каждого материала, которые мы присваивали в блендере. А это значит 5 (4, не учитывая стекла) материалов * 3 текстуры (цвет, нормали и AO+Roughness+Metallic). Слишком жирно. Надо их всех сшить.
Нам нужен замечательный Texture Set Combiner.
Качаем, устанавливаем, открываем.

Пайплайн Blender -> Substance Painter -> Unreal Engine

Выбираем пути до директории с лежащими там текстурами из Painter, и до папки с результатом. Ставим чекбокс на Channel Pack For UE4. Читаем описание настроек и возвращаемся в Painter.

Пайплайн Blender -> Substance Painter -> Unreal Engine

Заходим в File -> Export textures и выставляем настройки, рекомендованные автором тулзы. В значении Padding нужно установить количество пикселей, на которые границы текстур будут, как-бы, "вытянуты". Если поставить ноль, могут появиться швы и артефакты в разных местах, а если поставить слишком много, текстуры просто наедут друг на друга. Учитывая нашу ленивую UV развертку и не самое высокое разрешение, я рекомендую ставить значение от 1 до 3. Если конечный пропс в анриле будет выглядеть плохо, просто вернитесь к этому шагу и покрутите паддинг.
Далее, сами карты. Оставляем 5 из них (цвет, нормали и AO+Roughness+Metallic). Жмем экспорт.

Пайплайн Blender -> Substance Painter -> Unreal Engine

ВАЖНО чтобы тулза работала, нужно проверить два момента. Первый это нейминг. По дефолту Painter добавит к каждой текстуре постфикс, нужно их удалить. Например, альбедо текстура пола будет обзываться floor_Base_color_sRGB, переименовываем в floor_Base_color и так далее. Все текстуры должны в конце имени иметь то, что описано в File detection двумя скринами выше.
Второй момент, это разрешение. Оно просто должно быть одинаковым для каждого материала, иначе тулза выплюнет ошибку. Жмем Combine Files, проверяем.

Пайплайн Blender -> Substance Painter -> Unreal Engine

Успех! Мы превратили 20 текстур в 3. Остался последний шаг.

3. Unreal Engine

Для начала, нужно закинуть в анрил сам ассет. Тут многое может пойти не так, особенно с масштабом, особенно с анимированными Skeletal Mesh. Поэтому я выбираю плагин Send to Unreal, и вам советую. Изначальный плагин сделан эпиками, но, кажется, он скорее мертв чем жив. Так что берем его форк и ставим в блендер. После установки в блендере появится вкладка Pipeline, а в меню сцены папка Export. Открываем анрил параллельно блендеру, в блендере закидываем пропс в папку Export, жмем Pipeline -> Export -> Push Assets. В анриле он появится в /Game/untitled_category/untitled_asset, вместе с материалами.

Пайплайн Blender -> Substance Painter -> Unreal Engine

Материалы эти можно удалить, ведь их много, а у нас теперь будет один!
Теперь, создаем новый материал, закидываем туда наши 3 текстуры, подключаем (ORM текстура подключается по порядку названия, R - AO, G - Roughness, B - Metallic). Если roughness будет сильно блестеть, включаем множитель и крутим значение, пока результат не понравится.

Пайплайн Blender -> Substance Painter -> Unreal Engine

Ну вот и все, дело сделано.

Пайплайн Blender -> Substance Painter -> Unreal Engine

4. Послесловие

Подводных камней может быть сильно больше, чем описано в статье. Например, у меня не ставилась последняя версия send2ue из-за ошибки импортов в python, пришлось ставить предыдущую версию. Или, ассет в Substance Painter может выглядеть не так как в блендере, из-за страшных N-гонов. Но, как пел великий поэт "Мы все преодолеем - если нет, то я не водолей" (извините).
Оставил бы ссылку на стим страницу нашей игры, для фарма вишлистов, но ее пока нет. Так что, пойду дальше ее пилить.
А вам спасибо что дочитали <3

77
35 комментариев

Я тебя сейчас за смарт юв прожект палкой стукну🤭

3
1
Ответить

Прочитал не по диагонали и понял немного лучше. Ты используешь отдельные материалы в 3д программе для разделения материал, что в корне неправильно, учитывая что все текстуры занимают одно текстурное пространство (как уже упоминал Хухлё).
Подобное разделение можно сделать и используя один материал, для этого надо забейкать MapID, эта штука берется с хайполи, и там бейкается либо цвет материала, либо цвет вертексов, как тебе удобно (я бы порекомендовал в качестве лоуполи экспортировать меш с одним материалом, а в качестве хайполи текущий меш, на котором много материалов и забейкать MapID), после чего ты сможешь создать папку и сделать ей автомаску с помощью команды Add mask with color selection, после чего надо просто пипеткой выбрать нужный цвет. В итоге у тебя будет легкое разделение по материалам внутри пейнтера, но не нужно будет пользоваться сторонними программами типа Texture Set Combiner.

2
Ответить

Кстати да, я про Map Id забыл совсем

Ответить

И ты раскидываешь материалы на 1 меш комнаты, следовательно у тебя эта комната в движке будет использовать кучу материалов, которые будут юзать 1 uv мапу, не проще всё сделать через 1 материал на целую комнату раз у тебя одна uv на все? Или я тебя не так понял?

1
Ответить

Вся поверхность комнаты умещается в один материал

Ответить

Да и Ambient Occlusion мы будем использовать в UE, так что, нужно его запечь

Вот только АО в УЕ5 не работает с Люменом и РТХ

1
Ответить

А у нас запеченный свет будет

Ответить