Текстурирование, или что нужно знать, чтобы стать Художником по поверхностям. Часть 6. Погружение в Систему Материалов

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

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

Но даже это оказалось большим в объемах, и теперь у нас в списке не 5, а 6 статей. Я даже подумал, что это можно перевести в какой-то формат книги, а статьи назвать главами =)

И да, под картинками так же часто комментарии прописаны, поэтому разворачивайте все картинки, которые в группе =)

  • Часть 1. Пиксель. Здесь.
  • Часть 2. Маски и текстуры. Здесь.
  • Часть 3. PBR и материалы. Здесь.
  • Часть 4. Модели, нормали и развертка. Здесь.
  • Часть 5. Система материалов. Здесь.
  • Часть 6. Погружение в систему материалов. Вы ее читаете.

Итак, котятки, шевелим лапками =)

Текстурирование, или что нужно знать, чтобы стать Художником по поверхностям. Часть 6. Погружение в Систему Материалов

Модели.

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

Итак 3D модель (Mesh) состоит из:

Vertex - это точка в трехмерном пространстве. Сама по себе она ничего не значит кроме координат в пространстве, но именно из точек состоит 3D модель.

Vertex Texture Coordinate - координата точки на двумерном UV-пространстве. Она (координата) нужна, чтобы понимать, как располагается остров (развертка) в двумерной плоскости. Когда мы текстурируем модель по развертке, именно по этим координатам определяется то, какой кусок текстур будет отображаться в треугольнике из точек. Текстурные координаты никак не зависят от координат положения точки в мировом пространстве. Они просто записываются, как данные, в саму точку.

Vertex Color - это параметр, который хранит в себе 4 значения. Принято называть это цветом вертекса. VC - это просто значения, которым придается цветовое обозначение, чтобы быстрее визуально ориентироваться. То есть, у нас есть 4 цифры, которые принято обозначать, как RGBA. И так же при редактировании в редакторе окрашивается в эти же цвета. Но на самом деле мы можем хранить там и положительные и отрицательные значения и выходить за рамки (-1, 1). Причем, если это отрицательные значения, то все редакторы будут показывать это черным цветом. Как вы понимаете, этот параметр хранится в точке. Ну, будем думать, что в ней. Если сейчас вы ничего не поняли - не переживайте. Ниже мы разбираем Vertex Color очень подробно.

Vertex Normal - это вектор, который хранится в точке. Этот вектор - самое сложное, что предстоит мне вам объяснить. Вектор нормали вертекса - это направление поверхности в трехмерном пространстве. Но в точке. Представьте, что точка - это точка на плоскости в пространстве. И вот нормаль точки - это перпендикулярный вектор от этой плоскости. Или чуть проще - представьте, что Vertex Normal - это направление, куда эта точка смотрит.

Faсe - это поверхность, которая состоит из вертексов. Чтобы создать поверхность, нам требуется сначала создать минимум три точки в пространстве, чтобы можно было создать поверхность. Сама поверхность может иметь сколько угодно вертексов, но видеокарты при работе с моделью всегда режут ее на треугольники, так как треугольники - это самая простая форма поверхности, которая не может быть изогнута в отличие от любого другого N-гона.

Заметьте, что 4 из 5 параметров - это информация, которая хранится в точке. А фейсы, похоже, самостоятельные элементы. Но на самом деле, это не так - фейсы хоть и описываются отдельно, состоят они из групп вертексов. То есть, грубо говоря и игнорируя все законы физики, все сводится к точке.

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

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

Vertex Normals.

Взрослые дядьки знают, как напугать детишек =)

Итак, нормаль вертекса - это направление плоскости в точке, которое по умолчанию всегда перпендикулярно фейсу.

Представьте треугольник и выберите на нем точку. Например эту.

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

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

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

Если совсем сложно-простым языком для начинающих в математике, то вектор направления можно представить так:
Вот иголка. В ушко иголки вставлена короткая нитка. Когда мы натягиваем нитку и крутим в разные стороны, мы создаем из нитки вектор от ушка до наших пальцев, который задает направление от ушка до пальцев. О_о.
Не сложно догадаться, что ушко иголки - это позиция вертекса в мире. Она имеет свои координаты. Точка, в которой мы удерживаем нитку в пальцах, имеет свои координаты.
Серьезно, прочитайте статью. Если не поймете - вернитесь к ней еще раз на следующий день. Или через день. Но обязательно вникните в суть векторов. Без них в двумерном и трехмерном мире невозможно работать. Статья здесь.
Мяу-Мяу.

Котик, Мастер шитья высшего уровня.

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

Для чего нужны вертексные нормали?

Для начала начнем с простой модели - крыши моего дома:

Как видим, каждая поверхность полигона идеальная - то есть, она ровная, и все вертексы одного полигона смотрят в одном направлении, а второго - во втором. В майке можно отобразить это:

Этот тип соединения полигонов называется "жесткие грани" (Hard Edges). То есть, у нас есть 2 полигона, которые изогнуты и создают форму крыши домика, и грань между ними четкая, жесткая.

И тут у вас возникает резонное замечание - как так, точка одна, а ее направлений два. Все просто - здесь 2 точки. Точнее, точка, как координата, одна, но используется 2 вектора направления для одной точки, которые имеют свои значения, а значит, считается, что здесь 2 точки.

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

И все-таки, зачем нам нужны эти вертекс нормали? Почему нельзя просто взять одно значение для всего полигона и использовать его? Ах да, и назвать Face Normal?

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

Как видно по картинке выше, у нас есть плоскость, которая состоит сетки 10*10 полигонов. Все грани между полигонами жесткие, поэтому мы видим каждый полигон отдельно, а в каждом вертексе у нас по 4 направления (для каждого полигона). То есть, не смотря на то, что у нас на модели визуально 121 вертекс, на самом деле там их 316.

Теперь я сделаю все грани "мягкими" (Soft Edges):

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

Она, как говорят некоторые, сгладилась. Это сглаживание называется шейдингом. Или как-то так. Не суть.

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

Попробую объяснить на примере одного полигона. У нас есть вот такой полигон, все нормали вертексов которого направлены идеально вверх:

Нижний тоже вверх направлен, он просто молока напился =)
Нижний тоже вверх направлен, он просто молока напился =)

Теперь мы возьмем один вертекс и повернем его в сторону:

Затенение поверхности стало рассчитываться с учетом, словно в правом вертексе поверхность была перпендикулярной относительно источника света и потом плавно выравнивалась ко всем остальным вертексам, которые смотрят идеально вверх.

Текстурирование, или что нужно знать, чтобы стать Художником по поверхностям. Часть 6. Погружение в Систему Материалов

Зелеными стрелками указаны условные направления поверхности которые плавно перетекают из направления справа в направление наверху и внизу (ну и к левому направлению так же выравниваются).

Если вы присмотритесь, то по центру так же идет затенение, которое постепенно сходит на нет к левой крайней точке. Это связано с тем, что Maya автоматически порезала этот полигон на 2 треугольника. Как я говорил уже, не существует N-гонов - существуют треугольники, которые режут ваши N-гоны незаметными гранями. Представьте, что там проведена линия от правого к левому вертексу. И тогда становится понятно, что у верхнего и нижнего треугольников есть точка справа и есть точка слева. И теперь им нужно усреднять между ними поверхность.

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

Нет ничего лучше практики. В Autodesk Maya инструмент управления нормалями вертексов доступен в Mesh Display -> Vertex Normal Edit Tool.Этот инструмент позволяет редактировать направление нормалей вертексов - поиграйтесь, покрутите объект и увидите, как объект начинает по другому отражать свет и показывать затенения там, где поверхность изогнута.
Мяу-Мяу.

Котик, Директор опыта

Так для чего нам нормали вертексов?

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

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

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

Вот такая вот картинка из предыдущей статьи.
Вот такая вот картинка из предыдущей статьи.

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

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

Ваша задача, как Surface Artist'а, убедиться, что поверхность красиво играет на свету, и нормали вертексов выравнены корректно.

Vertex Color.

Теперь перейдем к еще одному не менее важному параметру для художников по поверхностям.

Как было сказано в начале статьи, Vertex Color - это параметр вертекса, который хранит в себе 4 значения. Обычно это от 0 до 1, а сами значения переводят визуально в цвета - 4 значения = 3 цвета + альфа. Удобно? Удобно, если не учитывать маленький нюанс, что эти значения могут быть как отрицательными, так и положительными и больше 1.

Но почему тогда это называется цвет вертекса? Так проще назначать вертексам значения - достаточно настроить кисточку в 3D редакторе или в движке напрямую и можно красить модель цветами, чтобы понимать, где какие примерно значения. Да и редко бывают ситуации, когда требуется что-то, что требует значений за пределами диапазона 0 - 1.

Как работает Vertex Color.

Vertex Color определяет то, какие значения должен полигон в себе содержать. То есть, если мы хотим, чтобы полигон был красным, то все 4 точки должны иметь значение цвета, равное 1.0.0.1 (RGBA).

Например, у нас есть вот такой вот меш:

Текстурирование, или что нужно знать, чтобы стать Художником по поверхностям. Часть 6. Погружение в Систему Материалов

Как видите, у него 4 полигона по 4 вертекса, а общее количество вертексов равно 9. При этом все грани у нас "мягкие", поэтому точек всего 9.

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

Не смотрите долго - глаза картинка выжжет. 9 вертексов.
Не смотрите долго - глаза картинка выжжет. 9 вертексов.

Но если мы покрасим две половинки этого меша в разные цвета - произойдет увеличение вертексов:

Здесь в указанных точках произошло удвоение количества вертексов. Теперь весь меш занимает 12 вертексов.
Здесь в указанных точках произошло удвоение количества вертексов. Теперь весь меш занимает 12 вертексов.

Почему произошло расщепление этих вертексов на 2?

Вертекс - это не только точка в пространстве, но и дополнительная информация. Когда мы красим все в один цвет - ничего не меняется, так как параметр остается один. Но когда параметров на одну точку становится 2, как в примере с зеленым и красным цветами - в этом месте вертекс раздваивается на 2 разных параметра.

Не смотря на то, что в центре вертекс пересекается с 4 полигонами, он все еще имеет всего 2 параметра - зеленый и красный цвета, и в связи с этим этот вертекс только раздваивается.

А если мы возьмем сразу 4 разных цветом полигона, то получим не 9, не 12 вертексов на один простой меш, а сразу 16.

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

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

Итого.

Итак. Мы разобрали на куски то, из чего состоит 3D модель и частично затронули тему того, как она собирается, и в каких случаях вертексы расщепляются.

Нормали вертексов позволили нам сделать самое важное - избавиться от страшных резких углов и создать красивые фаски, при этом не потеряв в количестве вертексов. Теперь, если мы делаем какой-то объект, то мы можем изучить его заранее и определить, а требуется ли вообще ему карта нормалей? А в 90% случаев выясняется, что нет.

Цвета вертексов позволили нам... А вот дальше мы и узнаем, зачем нам нужен Vertex Color, и что он позволяет делать.

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

Наша адаптация Системы Слоев Материалов.

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

Когда мы перешли на этот метод, то у нас сразу возникло очень много вопросов. Основные моменты, с которыми мы столкнулись:

  • Карты нормалей на весь объект очень большого разрешения и не позволяли достигать нужного уровня качества для создания красивых фасок.
  • Общая карта маски для грязи и повреждений имела так же большой размер и все еще низкого уровня качества.
  • Если на объекте большое количество материалов, то требовалось большое количество файлов текстур по 3 канала в каждой. И, опять же, большого размера.
  • Развертка всей модели для Texel Density усложняла работу с мелкими деталями.

Как мы решали эти сложности.

Карта нормалей.

От общей карты нормалей мы просто избавились.

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

Ни один объект не обременен картой нормалей для фасок. Все фаски выполнены вертексами.
Ни один объект не обременен картой нормалей для фасок. Все фаски выполнены вертексами.

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

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

Котик, Мастер плагинов

И тут многие могут спросить, а как же поверхность-то? Она же без нормалки! Все очень просто. Мы используем систему материалов, а значит у самих материалов есть своя карта нормалей, которая определяет то, как должна отражаться поверхность, какие у нее могут быть трещинки и прочее.

Текстурирование, или что нужно знать, чтобы стать Художником по поверхностям. Часть 6. Погружение в Систему Материалов

Как видите, материал дерева идеально лежит на столе (он же, кстати, используется и на полу). Все трещинки и бороздочки дерева красиво переливаются на свету, и чувствуется глубина.

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

Маски большого размера с низким качеством и остальные вопросы.

Здесь вопрос стоит более сложный.

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

И здесь нас начинают выручать Vertex Color'ы. VC позволяет разделить объект на части, которые мы можем укладывать раздельно.

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

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

Что касается развертки для запекания света (Lightmass), то в UE4 можно генерировать новый слой расположения островов, который будет учитывать уже общий Texel Density и расположит все острова относительно друг друга.

Как дальше происходит покраска?

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

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

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

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

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

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

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

Например, такая.
Например, такая.

Далее на объекте мы используем специальные маски размером 256 текселей в качестве масок-зон, а в зоны мы подкладываем маски грязи, царапин, или отколовшейся краски (как на примере выше). И получаем результат:

Размер маски 128 текселей.
Размер маски 128 текселей.

В чем преимущество такого подхода? Текстуры грязи, царапин и прочего у нас могут быть в проекте до 10-15 штук. Они размером 1024х1024 текселя. Можно больше, но нам этого достаточно для всего проекта в целом. А маски-зоны по 128 текселей занимают десятки килобайт.

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

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

Итого.

Можно задаться вопросом - а чем лучше Vertex Colors'ы от обычных масок, и ответ очевиден - качеством. На больших, то есть, огромных объектах, чтобы маска красиво разделяла материалы, придется ее делать таких же огромных размеров. Иначе перепады между материалами будут квадратными из-за нехватки размеров текселей.

VC позволяют избавиться от масок вовсе, освобождая оперативную память под другие текстуры / нужды.

Да, VC добавляет немного вертексов в модель, а иногда приходится добавлять дополнительные вертексы, чтобы поделить модель на зоны материалов корректно, но в наше время видеокарты очень даже хорошо справляются с обработкой вертексов. Ну и стоит помнить, что всегда есть LOD-ы, о которых мы поговорим в 7ой части. Они помогают очень мощно экономить на вертексах. А если рассматривать Mesh Shaders, которые будут добавлены в UE5, то и вовсе можно особо не беспокоиться о вертексах.

Фаски же, например, не добавляют вам никаких вертексов, так как там используются мягкие грани. То есть, 1 вертекс на две и более поверхности. против жестких граней, где на 1 поверхность 1 вертекс. Таким образом, карта нормалей тут точно становится лишней. А требуемое красивое сглаживание всегда можно получить, красиво настроив Vertex Normal'и.

Чуть-чуть практики.

Наверное, вас интересует, а как же в шейдерах UE4 настроить эти самые Цвета Вертексов?

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

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

Текстурирование, или что нужно знать, чтобы стать Художником по поверхностям. Часть 6. Погружение в Систему Материалов

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

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

Например, если мы используем до 3 цветов, то тут все легко и просто:

Текстурирование, или что нужно знать, чтобы стать Художником по поверхностям. Часть 6. Погружение в Систему Материалов

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

Все немного сложнее, если вам нужно использовать больше 3 цветов.

То есть, вы можете покрасить не просто по R, G и B.

Вы можете усложнять комбинации:

RG. GB. RB. RGB и 0 по всем каналам.

Вас никто не ограничивает - значения в любом случае будут храниться в одной точке.

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

Представим, что у нас помечены 3 полигона - один красным, второй красным и зеленым (результат желтый), и третий - зеленым.

Текстурирование, или что нужно знать, чтобы стать Художником по поверхностям. Часть 6. Погружение в Систему Материалов

Если мы хотим использовать, например, RG для подцветки 4-го материала, то он будет и на R и на G по 1. Если мы просто выдернем канал R, то мы получим и то, что покрашено по каналу R, но так же и то, что в зоне RG.

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

Это немного сложно объяснять словами, поэтому попробую это быстро нарисовать и объяснить на примере:

Когда мы начинаем вычитать из одного цвета другой - мы не вычитаем цвета, а вычитаем значения. То есть, мы как бы переносим все значения в один канал (назовем его - белый) и вычитаем одну зону из другой:

Если мы из красного начнем вычитать зеленый, то у нас будет вычитаться вся эта область:

Текстурирование, или что нужно знать, чтобы стать Художником по поверхностям. Часть 6. Погружение в Систему Материалов

А в результате вычитания получится вот эта область:

Текстурирование, или что нужно знать, чтобы стать Художником по поверхностям. Часть 6. Погружение в Систему Материалов

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

В коде выглядит вот так.
В коде выглядит вот так.

То же самое проворачивается и с другими цветами - G и B.

Но как получить цвет RG?

Текстурирование, или что нужно знать, чтобы стать Художником по поверхностям. Часть 6. Погружение в Систему Материалов

Как указано на картинке с кодом - нам нужно перемножить эти цвета. Тем самым мы получаем область только на пересечении, так как области только в R и только в G будут иметь 0 значение (1х0 и 0х1 = 0). После отнять синий цвет, чтобы убедиться, что он не подмешивается. А потом прогнать через saturate, чтобы отбросить все лишние значения.

То же самое касается и RB, GB и RGB.

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

Тут все просто - используйте Add.

Текстурирование, или что нужно знать, чтобы стать Художником по поверхностям. Часть 6. Погружение в Систему Материалов

А если каналов больше, чем два, то просто к результату добавьте еще =)

Сложение 4 результатов материалов в один.
Сложение 4 результатов материалов в один.

Итого.

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

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

Посмотрите на то, какие материалы получились у ребят из Epic Games в паке материалов "Automotive Materials", который мы разбирали в прошлой статье. Достаточно их перегнать в меньший размер, и можно использовать в играх. А там ведь еще и текстуры качества HDR, что придает материалам еще больше ценности.

А вот мой любимый манекен для тренировок актеров в нашей игре =)

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

То есть, материалы распределены по VC, а масками мы разделили цвета этих материалов и добавили швы. Как вам такой пример?

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

Мы научились создавать слои материалов, усложнять их, а теперь и качественно накладывать их, минимизируя требования к маскам и текстурам, немного перекидывая нагрузку на Vertex'ы.

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

Что дальше?

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

Перечитайте статью от Epic Games. В ней вы найдете требования для технического художника (дада, теперь эту профессию называют техническим художником). Изучите требования и начинайте постепенно углубляться в это направление.

Вроде бы и всё.

Если мои статьи были вам полезны - подписывайтесь на наш твиттер и инстаграмм, там мы выкладываем интересности о нашей игре =)

P. S. Ах, да, будет еще одна часть, где я расскажу немного об оптимизации, LODах, как считаются Draw Call'ы в UE4, как их оптимизировать, и почему атлас текстур не снижает уже давно Draw Call'ы. Возможно, затрону Distance Field тени, от которых мы без ума.

Но предупреждаю сразу - это будет ой как не скоро. Так что считайте, что это будет отдельная статья. Или статьи? В общем, наберитесь терпения, подписывайтесь на мой блог и настраивайте уведомления. Однажды они сработают =)

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

Есть много путей достижения цели, и даже наш метод не является 100% верным. Но на текущий момент времени нам кажется, что он лучший из существующих, однако мы всегда в поиске =)

Вернуться на предыдущую статью можно здесь.

7979
37 комментариев

Ох как я ждал эту статью. Теперь по нормалкам и вопросов не осталось.
Неделю разбирал 4 и 5 главу по пунктам, пока все ссылки перечитал указанные в статье как раз и 6-я вышла. Вопрос по большому размеру масок для объекта у меня возникал ещё в тот раз - хорошо что расписали здесь но пока не до конца понял как использовать вертекс цвета, под них отдельная развёртка делается? Получается на объекте 2 развертки? Я конечно ещё перечитываю статью и думаю дойдёт.
И как я понял всё это удовольствие я могу выполнить только для конкретного движка, то есть нельзя просто подготовить ассет по стандартному с картами нормалей, рафнес, альбедо...  выложить на 3ddd например и его будут качать для своих целей. А тут только для движка конкретно UE.

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

3
Ответить

Спасибо за подсказку о запекании света по развертке, добавил в текст +)

2
Ответить

Точно. Упустил момент с тенями.
Для запекания света в ue4 можно генерировать отдельно канал для развертки. То есть, загружаешь объект в анрил и указываешь в настройках импорта - генерировать канал развертки для лайтмапы.
Создаётся второй канал, по которому будет запекаться лайтмапа и на который будет накладываться.
По поводу укладки развёртки по ВК - все делается в одном канале, просто UV пространство используется для каждого цвета, словно других не существует

1
Ответить

клево все описал

1
Ответить

Спасибо =)

3
Ответить

Титаническая статья! Очень круто!

1
Ответить

Спасибо =)

1
Ответить