{"id":3975,"url":"\/distributions\/3975\/click?bit=1&hash=7a51e809b58a86b7ea96667de949aaf9244193fd91029f3a3a1c980f40244631","title":"\u0410\u0439\u0442\u0438 \u0432 \u0430\u0442\u043e\u043c\u043d\u043e\u0439 \u044d\u043d\u0435\u0440\u0433\u0435\u0442\u0438\u043a\u0435 \u2014 \u044d\u0442\u043e \u0441\u043a\u0443\u0447\u043d\u043e. \u041c\u0438\u0444 \u0438\u043b\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c?","buttonText":"\u0412\u044b\u044f\u0441\u043d\u0438\u0442\u044c","imageUuid":"c22764b5-e280-52b2-a6db-af308d4d1709","isPaidAndBannersEnabled":false}

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

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

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

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

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

  • Часть 1. Пиксель. Здесь.
  • Часть 2. Маски и текстуры. Здесь.
  • Часть 3. PBR и материалы. Здесь.
  • Часть 4. Модели, нормали и развертка. Здесь.
  • Часть 5. Система материалов. Здесь.
  • Часть 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 направления, а всего одно. Но что произошло с моделью?

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

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

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

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

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

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

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

Если вы присмотритесь, то по центру так же идет затенение, которое постепенно сходит на нет к левой крайней точке. Это связано с тем, что 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).

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

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

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

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

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

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

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

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

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

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

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

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

Итого.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Итого.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сложение 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% верным. Но на текущий момент времени нам кажется, что он лучший из существующих, однако мы всегда в поиске =)

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

0
37 комментариев
Написать комментарий...
Bohdan Karasenko

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

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

Ответить
Развернуть ветку
Денис Кузнецов
Автор

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

Ответить
Развернуть ветку
red pill

у меня вопрос по этому пайплайну - как быть с картой АО? как быть с различными деталями поверхности типа надписей, небольших заклепок, швов-имитаций стыков - все лепить на декали?

Ответить
Развернуть ветку
Денис Кузнецов
Автор

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

Надписи и прочее - это все в декали, да. Можно встроить легко и в материалы. Только тогда нужно будет подгонять их корректно по трансформу (расположение. вращение, масштаб).

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

Ответить
Развернуть ветку
Денис Кузнецов
Автор

Косяк =)
АО используется и работает, так что про АО не обращать коммент выше.
Более того, можно усилить АО и сделать еще более красивой:
https://docs.unrealengine.com/en-US/RenderingAndGraphics/Materials/BentNormalMaps/index.html

Ответить
Развернуть ветку
Денис Кузнецов
Автор

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

Ответить
Развернуть ветку
Paul Paa

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

Ответить
Развернуть ветку
Денис Кузнецов
Автор

Спасибо =)

Ответить
Развернуть ветку
Конь Геннадий

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

Ответить
Развернуть ветку
Денис Кузнецов
Автор

Спасибо =)

Ответить
Развернуть ветку
Malcain

Объёмно. На мой вкус, слишком много теории вначале.
Имхо, лучше всего обучающие материалы работают когда:
1. Сперва показывается результат было/стало. Ответ на вопрос: ради чего вообще это всё?
2. Показывается практика на примере работы. Ответ на вопрос: Ок, круто, а как это делается?
3. Рассказывается теория. Ответ на вопрос: Как это всё работает?

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

Материал крутой. Стоит добавить в Геймдев подсайт, а то там одни мобилки да инфоцигане с рекламой курсов.

Ответить
Развернуть ветку
Денис Кузнецов
Автор

Ну, тут скорее надо рассматривать с точки зрения всего цикла статей - от 1 до 6 =) Тогда оно будет чуток иначе восприниматься, чем просто отдельная статья. И некоторые пункты будут вычеркнуты, мне кажется.
Но в целом, я идею услышал, подумаю над ней для последующих статей уже =)
На счет добавления в под сайт - как можна туды репостнуть, не перенося это из моего блога? Это важно, так как часто вношу правки в текст, а просто переместив статью в подсайт через 2 недели потеряю контроль над статьями =(

Ответить
Развернуть ветку
Malcain

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

Ответить
Развернуть ветку
Денис Кузнецов
Автор

Да, я знаю. Подумаю, что можно сделать

Ответить
Развернуть ветку

Комментарий удален модератором

Развернуть ветку

Комментарий удален модератором

Развернуть ветку
Lonely Vasyan

Ох уж эти вертексные нормали. Для многих начинающих тридэ инфа о том, что у вертекса есть что-то еще, кроме координат в пространстве, это становится откровением.
С удовольствием почитаю, как автор на пальцах будет рассказывать про нормал маппинг.
А вообще здорово, что тридэ постепенно отходит от этих ухищрений. В зебре вон нормалей вертексов нет, наниты в УЕ5 скорее всего так же будут без них. Честная геометрия без лишней информации.

Ответить
Развернуть ветку
Денис Кузнецов
Автор

Нормали вертексов будут в наните =)
Это же сама суть отражения поверхности. Там пайплайн рендера будет переработан, но не принцип построения мешей.

Ответить
Развернуть ветку
Lonely Vasyan

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

Ответить
Развернуть ветку
Денис Кузнецов
Автор

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

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

Ответить
Развернуть ветку
Lonely Vasyan

В зебре вообще все по-другому. Там настолько другой метод рендера и хранения инфы, что работает все на CPU и RAM. VRAM и GPU не используются вообще. Рендеринг видюхой и как следствие сглаживание геометрии там доступно ток в превью через BPR. В остальном для работы только сабдивы накидывать. 

Ответить
Развернуть ветку
Денис Кузнецов
Автор

Ха =) Надо покопаться в принципах его работы =)

Ответить
Развернуть ветку
Hy6oMeT .

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

Ответить
Развернуть ветку
Денис Кузнецов
Автор

Ну вот и выяснили =)

Ответить
Развернуть ветку
Денис Кузнецов
Автор

А что ты имел в виду про "Нормал маппинг"? Я обычно такие сложные слова не запоминаю и привык к простому - наложить, запечь, сгенерировать =)

Ответить
Развернуть ветку
Lonely Vasyan

Normal map же. Та фиолетовая текстура, которая заставляет модельку играть на свету.

Ответить
Развернуть ветку
Денис Кузнецов
Автор

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

Ответить
Развернуть ветку
Андрей Касинский

Отличная статья, а что насчет UV? Если у меня мягкая грань, а  я там сделал UV разрез, то вертекс опять дублируется и его снова два в одном месте?

Ответить
Развернуть ветку
Денис Кузнецов
Автор

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

Ответить
Развернуть ветку
Max Derksen

Почему Surface Artist? Есть 3D Artist Hard-Surface. Первый раз слышу про "художников по поверхностям". Извини, тут без претензий, просто ни когда не слышал о такой позиции в игровой индустрии.

Ответить
Развернуть ветку
Денис Кузнецов
Автор

3D Artist HardSurf - это по-русски моделер объектов со сложной поверхностью.
В данном случае Hard Surface - это сложные поверхности, и в большей степени относится к моделированию.
Surface Artist - это художник поверхностей, где Surface используется в общем его смысле - то есть, любая поверхность - хардсюрф, изисюрф, нормалсюрф, айронмэнсюрф. Не имеет значения, это общее.

А в целом, название было взято из статьи Epic Games, где было предложено такое название специальности. Но тогда, два года назад, это только зарождалось. Сейчас уже есть более четкое понимание, как таких специалистов называть, и это уже часто называют Technical Artist - Технический Художник.
И весь цикл статей именно подводит к становлению технического художника.

А вообще, если почитать все статьи, то можно обнаружить, что в одной из них я давал определение этому названию =)

А минус мне влепил из-за того, что тебе название специальности не понравилось? =)

Ответить
Развернуть ветку
Anthony

что?))   нет дружище это не сложные поверхности - это твердые поверхности.  Танки и дома например.   Это значит человек не будет моделить персонажей. 

Ответить
Развернуть ветку
Татьяна Гашкова

Ну здесь все относительно) Персонаж со сложной броней, с какими-нибудь узорами на металле, кто моделит? органик или хардсюрф художник?) Или простые объекты, кубики/простейшие домики. Неужели для этого нужен хардсюрф художник?)
Тут скорей СЛОЖНЫЕ жёсткие поверхности попадают под описание))

Ответить
Развернуть ветку
Anthony

давай округлим, перса дадут делать чарактер артисту, а танк дадут делать хард сурфейс артисту. А персонажа танка дадут делать стажеру))

Ответить
Развернуть ветку
Денис Кузнецов
Автор

Да какая разница? Переводи, хоть, усложненнотвердотельные поверхности. Идеи это не отменяет =)
"Surface Artist" в данном случае именно художник по поверхностям.

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

Тут смысл был в том, что человек не понял идеи названия и спутал ее с названием, относящимся к совсем другой специальности. А ты влетел с правками в перевод =) Ну такое.

Ответить
Развернуть ветку
Anthony

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

Ответить
Развернуть ветку
Денис Кузнецов
Автор

Ох, ладно, пусть так.

Ответить
Развернуть ветку
Anthony

сдавайся, ты окружен фактами))

Ответить
Развернуть ветку
Max Derksen

Технический художник в общепринятом смысле тот, кто чутка залазит в код для выполнения художественных задач. Например написание шейдеров, плагинов и прочего. Сам этим занимаюсь, но не по работе. В Dragon Fly тех артист вообще тот, кто ретопит, запекает ассеты. А что касается Surface Artista это все еще странно звучит. Но поживем увидим, приживется ли это название у hr. А на счет минуса не обессудь.

Ответить
Развернуть ветку
Читать все 37 комментариев
null