Мы уже разобрались с теорией и терминологией, поговорили о типах карт нормалей и их различиях. Сегодня ты узнаешь, как подготовить модель к запеканию normal map, избегая типичных ошибок.
Хард-софт эджи
Hard Edge — жесткая грань между двумя плоскостями. В 3ds Max используется подход Smoothing Groups. Для создания жесткого эджа достаточно назначить на плоскости разные группы сглаживания.
Soft edge — гладкая грань. Чтобы создать ее в 3ds Max, на плоскости нужно назначить одинаковые группы сглаживания.
Чтобы грани запеклись как надо, пользуйся правилом «Hard edge — UV seam»: для каждой жесткой грани лоуполи модели нужно создавать шов на UV. Иначе детали и грани запекутся некорректно.
Важно! Это не значит, что UV швы нельзя делать и в других местах. Технически, их можно расположить где угодно, лишь бы на финальном ассете они не были заметны.
Градиенты
Градиенты на normal map возникают, потому что карта нормалей пытается выровнять градиент на шейдинге объекта. Простыми словами, если на Low Poly во вьюпорте видно градиенты, а на High Poly их нет — они появятся на карте нормалей.
Карта нормалей таким образом пытается привести вид Low poly объекта к виду High poly.
Это может вызвать сложности, если для модели нужно создавать лоды (LODs — Level of details, несколько вариаций одной и той же модели с постепенным уменьшением детализации и снижением количества треугольников). В таком случае, после удаления некоторых граней, градиент может появиться на LOD01 и создать визуальные артефакты.
Потяжки
Потяжки можно отнести к градиентам, но разберемся с ними отдельно.
При некорректно построенной сетке, на шейдинге изогнутых элементов могут появляться артефакты. Так бывает, если на изогнутой плоскости оставить длинные треугольные полигоны, предназначенные для оптимизации модели.
В таких случаях лучше пренебречь оптимизацией и сделать сетку чуть тяжелее, но избежать появления артефактов.
Совпадение High Poly и Low Poly моделей
При запекании карты нормалей, вся информация о деталях на поверхности и сглаженности граней полностью переносится с High poly модели. Если угол High poly в пространстве расположен не в том же месте, где и у Low poly, — на карте нормалей появится пробел.
Если что-то подобное появилось на твоем объекте — в первую очередь проверяй соответствие хайполи и лоуполи. Иногда хайполи перед сглаживанием нужно немного сдвинуть / увеличить относительно лоуполи, чтобы после сабдивайда / турбосмуза они оказались в одинаковых координатах. Это костыль, но в некоторых ситуациях он может помочь.
Сечения на цилиндрах
Проблема с выбором количества сечений на цилиндрах косвенно относится к теме сопоставления хайполи и лоуполи моделей. Если у Low poly слишком мало сечений, то после запекания появятся пробелы на верхней и нижней плоскости. Причина та же — несоответствие Low и High poly версий объекта.
Летающая геометрия
Летающая геометрия (Float geometry) — это техника создания «парящих» над поверхностью элементов хайполи.
Она нужна для быстрого добавления вшитых деталей в объекты. Это намного проще, чем вшивать каждый элемент по-настоящему, а результат на карте нормалей выглядит так же.
Average normal
В настройках запекания всегда можно найти функцию уравнивания нормалей. Она усредняет нормали для запекания — так можно сделать углы более плавными.
Но есть у этой настройки и обратная сторона: из-за выравнивания нормалей на углах, детали на ровных поверхностях могут начать «плыть». И чем ближе деталь к углу — тем сильнее.
В разных программах с этим эффектом можно бороться по разному. Мы поговорим подробнее на эту тему в следующей статье цикла.
Ложная перспектива
Ложная перспектива, или Fake perspective, используется художниками при создании дополнительных элементов на high poly — деталей, которые не поддерживаются сеткой Low poly объекта. Например, любая летающая геометрия.
Суть ложной перспективы в том, чтобы немного сужать вершины элементов по отношению к их основе. Основа — место, в котором элемент «вшивается» в тело объекта.
Это нужно, чтобы элемент было видно на карте нормалей после запекания. Если не следовать этому правилу, геометрия может полностью или частично скрываться на normal map.
Размер элементов и разрешение текстуры
При работе с хайполи геометрий нужно учитывать, в каком разрешении будет запекаться финальная карта нормалей. Таким образом ты сможешь заранее продумать толщину фасок на High poly и тебе не придется создавать лишние детали.
Если на твоем проекте используется низкий тексель, старайся делать фаски толще, а запекаемые элементы — больше. Таким образом, они не будут теряться после запекания.
(Texel density — количество пикселей на единицу площади объекта. Texel density 1024px/m означает, что на один квадратный метр объекта должно выделяться 1024 пикселя)
Отверстия в High Poly
Если в финальной версии объекта планируется запечь отверстия, но нет возможности промоделировать их геометрией — обязательно зашивай все эти дыры на High poly. Иначе на карте нормалей появятся странные артефакты.
В такой ситуации для создания отверстий лучше промоделить экструды, зашить их, а потом — закрасить черным цветом в карте Albedo.
Плотность High Poly
«Чем плотнее сетка — тем лучше результат на карте нормалей» — хороший аргумент, но до определенного момента.
Если взять текстуру с разрешением 2048х2048 и развертку, которая занимает 100% UV пространства — максимальное количество доступных нам пикселей равняется 4 194 304. И это фантастическая ситуация. В реальной жизни развертка может быть заполнена на 70% плюс оверлапы и паддинг. В результате эта цифра уменьшается на 30-40% процентов.
Так как в один пиксель можно запечь информацию об одной плоскости — нет никакого смысла создавать хайполи модели на 20-30 млн треугольников.
Можно возразить: «Но ведь ничего плохого в большом количестве полигонов нет. Лучше перестраховаться и сделать чуть больше нужного». Отчасти это верно, но такой подход создаст две проблемы.
Во-первых, работая с перегруженным трискаунтом, художник создает детали, которые в итоге не попадут на финальную текстуру. Лишние действия забирают много времени, особенно, если речь идет о скульптинге.
Во-вторых, тяжелая геометрия тормозит работу программ и экспорт/импорт геометрии из софта в софт.
Вывод: хайполи должна выглядеть красиво и сглажено, но не стоит перегружать геометрию лишними треугольниками.
Пользуясь этими правилами, ты сможешь сэкономить десятки часов, которые художники тратят на решение каждой отдельной проблемы.
В следующей статье подойдем к вопросу запекания normal map с практической стороны и поговорим о кнопках в разных программах. Stay tuned!
|
Вставить имя в ответ 3D-ARIES
Репутация: 463
На сайте c 19.04.2018 |
26.12.2021 07:12
слева исходная модель. а справа запеченая. на правой модели видно что вся рука и нога куклы, черная почему то.
При попытке поместить «AO» в другое место. например перед слотом Диффуз. получается тоже самое. по урокам делаю тоже самое. у них все получается. у меня как всегда нифига не получается!! |
Время на прочтение
9 мин
Количество просмотров 28K

Часть 1: что такое карты нормалей и как они работают
Часть 2: как запекаются карты нормалей
Часть 3: типы карт нормалей
Это четвёртая часть туториала о картах нормалей, но она независима от остальных частей и её можно читать отдельно.
Здесь я перечисляю проблемы карт нормалей, с которыми я сталкивался за годы работы, и некоторые решения, позволяющие их устранить.
Проблема: на рёбрах модели присутствуют «чёрные линии» или «вставки»

Такое происходит, когда у модели есть резкие рёбра (hard edges), поскольку вершины модели имеют нормали, полностью перпендикулярные поверхности полигона, из-за чего программа запекания может пропустить некоторые детали (оставляя на модели чёрные линии).

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

Также возможно, что вы используете в качестве карты нормалей касательного пространства карту нормалей мирового пространства. В таком случае убедитесь, что вы выполняете запекание карты нормалей касательного пространства, и используете её в этом качестве.
Решение: старайтесь всегда использовать для вычисления карт нормалей базис касательного пространства Mikk. Это стандартизованный способ вычисления нормалей, позволяющий избегать подобных проблем. Если программа запекания карт нормалей не может использовать Mikk, попробуйте воспользоваться программой наподобие handplane для переключения между различными касательными пространствами.
- Вы используете в карте нормалей гамма-коррекцию: карты нормалей — это не обычные изображения с информацией о цвете. Они содержат информацию о нормалях поверхностей, и не ведут себя как цветные изображения. Гамма-коррекция — это регулирование цветов изображения, способное нежелательным образом изменять цвет карты нормалей. Чтобы убрать гамма-коррекцию из карты нормалей, смените цветовое пространство карты нормалей на linear/linear color/raw или снимите флажок sRGB в движке Unreal.
- Вы не используете карту нормалей касательного пространства как карту нормалей касательного пространства: убедитесь, что движок не использует карту нормалей касательного пространства как карту нормалей пространства объекта, рельефную карту (bump map), карту смещений (displacement map) и т.д…
- Нормали lowpoly-модели в программе запекания отличаются от нормалей lowpoly в программе рендеринга: это может происходить, если в процессе экспорта/импорта теряется информация о группах сглаживания (smoothing groups)/резких рёбрах (hard edge), если вы используйте изменённые/весовые нормали, а программа рендеринга не поддерживает их или отбрасывает эту информацию.
В таком случае сравните lowpoly в обоих приложениях и если они отличаются, то попробуйте изменить параметры импорта/экспорта, используемые форматы файлов (файлы obj теряют информацию о нормалях) и проверьте совместимость своей программы с настраиваемыми нормалями.
Проблема: как мне создать карту нормалей острого конуса?
Решение: вам это… не нужно. Не обязательно создавать карты нормалей для всего. Острый конус — классический пример этого, но существует множество других случаев, когда карты нормалей не являются решением.

Мы используем карты нормалей для изменения направления нормалей lowpoly-моделей. Иногда направление нормалей правильно и не требует никаких изменений, а иногда нормали lowpoly чрезвычайно повёрнуты (как в случае острого шипа) и детали из highpoly-модели неправильно сопоставляются с поверхностью lowpoly-модели. В таких случаях я просто удаляют детали карты нормалей при помощи такого цвета:

Этот цвет на 50% красный, на 50% зелёный и на 100% синий, и он не меняет направления нормалей карты нормалей касательного пространства, поэтому можно использовать его для удаления деталей в местах с неудачной проекцией.
Острый конус — это просто пример одного из случаев, когда карты нормалей могут не решить ваших проблем. Важно здесь помнить, что в некоторых случаях карта нормалей не является наилучшим решением, её возможности ограничены и мы не можем ожидать, что они будут вести себя так, как нам нужно, в любой ситуации. Иногда мы тратим много времени, пытаясь заставить работать карту нормалей, когда можно было бы просто добавить деталей в diffuse-текстуру или в lowpoly, а не пытаться передать деталь при помощи карты нормалей.
Проблема: детали на моей модели выглядят вывернутыми.
Это очень распространённая проблема, и её можно наблюдать во многих видеоиграх, даже AAA-уровня.
Как мы видели в этом туториале [перевод на Хабре], карты нормалей — это текстуры, использующие зелёный, красный и синий каналы для изменения способа отражения света от поверхности модели, когда он падает соответственно сбоку, сверху и спереди модели (помните, что это упрощённое объяснение и оно верно не на 100%).

Проблема в том, что некоторые приложения считают, что зелёный канал должен показывать модель как освещённую снизу, а другие считают, что он должен показывать модель как освещённую сверху. Иногда это называют «правостороннесть карты нормалей» (normal map right-handiness):
- OpenGL-приложения (правосторонние, положительный зелёный канал): Blender, Maya, Modo, Toolbag, Unity.
- DirectX-приложения (левосторонние, отрицательный зелёный канал): 3DStudio Max, CryEngine, Source Engine, Unreal Engine.
- Substance Painter может работать с обоими типами и экспортировать оба типа карт нормалей.
Решение: инвертировать зелёный канал карты нормалей. У большинства игровых движков есть опция текстур инвертирования карты нормалей, или же вы можете вручную инвертировать зелёный канал текстуры в Photoshop (перейдите во вкладку каналов, выберите зелёный канал и нажмите Ctrl+i).
Проблема: некоторые части кажутся плоскими/в них отсутствуют какие-то детали
Представьте, что при запекании карт нормалей программа запекания испускает лучи из поверхности lowpoly-модели, следуя по нормалям lowpoly, пока лучи не пересекутся с highpoly-моделью и не повернутся. После этого программа запекания берёт эту информацию и сохраняет её в карту нормалей.
Эти испущенные лучи не должны двигаться бесконечно, потому что могут столкнуться с далёкой частью highpoly и повернуться неправильно, поэтому программа запекания ограничивает дальность испускания лучей и иногда лучи могут останавливаться прежде, чем успеют пересечься с highpoly. В таком случае мы теряем детали и карта нормалей имеет области плоского цвета.

Решение: зависит от того, как программа запекания позволяет управлять расстоянием запекания:
- Некоторые программы ищут детали только снаружи lowpoly и игнорируют то, что находится «внутри» lowpoly-модели (однако большинство современных программ запекания выполняет поиск в обоих направлениях). В таком случае нужно модифицировать модели так, чтобы lowpoly полностью находилась внутри highpoly.
- Другие программы, например Max, используют клетку (cage) — «экструдированную» версию lowpoly, которую можно изменять для точного управления границами процесса запекания.
- Другие программы позволяют задавать расстояние запекания числом (в Substance Painter это max frontal/rear distance).
Также можно попробовать сделать lowpoly и/или highpoly более похожими друг на друга, чтобы лучи смогли получить детали по всей поверхности модели. Ещё один вариант заключается в запекании двух карт нормалей с разными расстояниями cage и их смешивании в разных частях текстур. Некоторые пуристы создания карт нормалей могут на вас за это ругаться, так что берегите уши.
Проблема: карта нормалей имеет искажённые детали
Это очень типичная проблема. Такое происходит, когда нормали lowpoly неправильно соответствуют деталям highpoly, поэтому кажутся наклонёнными (на самом деле, если смотреть на них с направления нормалей вершин, они соответствуют идеально). Такое обычно происходит, когда некоторые грани образуют очень острый угол.

Решение: я более подробно писал об этой теме в другом туториале [перевод на Хабре], но в целом решения бывают такими:
- Сгладьте острый угол, добавив фаску (bevel).
- Преобразуйте ребро острого угла в резкое ребро (hard edge)/разделите грани на разные группы сглаживания (smoothing group).
- Используйте настраиваемые нормали (custom normals)/весовые нормали (weighted normals).
Проблема: карта нормалей выглядит пикселизированной или содержит полосы
Earthquake (AKA бог карт нормалей) написал очень хорошее объяснение этой проблемы.
Если lowpoly и highpoly очень похожи, то бОльшая часть карты нормалей будет иметь один базовый цвет карты нормалей, а другими цвета будут в местах отличия lowpoly от highpoly.
Если ситуация обратная: lowpoly и highpoly очень отличаются, то карта нормалей будет иметь гораздо большее разнообразие цветов и начнут возникать градиенты:

Такие плавные градиенты вызывают проблемы, потому что для их представления нужно множество цветов, а самые распространённые способы сжатия текстур основаны на снижении общего количества цветов.
Решения:
- Сделайте lowpoly более похожей на highpoly: благодаря этому карте нормалей придётся делать меньше работы и она будет более похожей на первое изображение, что позволит избежать больших и плавных градиентов. Также может помочь изменение нормалей lowpoly, чтобы они лучше соответствовали highpoly.
- Используйте 16-битные карты нормалей: по умолчанию в большинстве изображений используется 8-битная глубина цвета. Это значит, что каждый канал цвета текстуры может использовать 8 разных значений (0 или 1). Для всех трёх каналов цвета это даёт нам 256 возможных цветов.
При наличии плавных градиентов мы можем замечать на модели полосы, потому что изображение не имеет достаточного количества цветов для представления такого небольшого изменения цвета.

16-битные значения могут использовать 16 различных битовых значений на каждый канал, что составляет 65536 возможных цветов. Это означает, что диапазон плавных градиентом может быть больше. Учтите, что 16-битные изображения больше по размерам, чем 8-битные (потому что содержат больше информации). Кроме того, иногда 16-битные изображения содержат альфа-канал; тогда они называются 24-битными изображениями. [Прим. пер.: тут у автора очевидная ошибка.]
Также существуют изображения с большей глубиной цвета, но для карт нормалей они не используются, потому что 16 бит более чем достаточно.
- Используйте дизеринг: нехватка цветов в текстурах — это проблема, которой уже несколько десятков лет, и десятки лет назад было придумано её решение — использование дизеринга. Идея заключается в том, чтобы перемежать пиксели в текстуре, обозначая градиент и при удалении это выглядит вполне хорошо. Обычно дизеринг можно включить при экспорте текстуры.

- Убедитесь, что карта нормалей правильно сжата: при сжатии текстур компьютер берёт области близких цветов и объединяет их, создавая блоки одного цвета, снижая количество цветов в изображении. Для обычных изображений это обычно нормально, но ужасно для карт нормалей: это не только уничтожает градиенты, но и может объединить информацию каналов цвета. Для карт нормалей придуманы специальные алгоритмы сжатия. Убедитесь, что игровой движок интерпретирует изображение как карту нормалей (обычно это можно сделать, выбрав опцию ассета текстуры, пометив его как карту нормалей), и параметры сжатия будут настроены автоматически.
Проблема: на отдельных частях модели заметны пиксели
Очевидным решением будет увеличение UV-«острова» (island) этой части модели или использование более крупных текстур, но давайте рассмотрим и менее очевидные решения:
- Запекайте с удвоенным разрешением карты нормалей, а затем уменьшайте размер изображения: если вы используете текстуру 512×512, то запекайте карту нормалей с разрешением 1024×1024, а затем преобразуйте изображение в 512×512. Благодаря этому каждый пиксель окончательной текстуры будет получать информацию от четырёх пикселей, создавая своего рода «сглаживание» (antialiasing) и снижая пикселизацию. Это также справедливо и для других запечённых изображений; кроме того, стоит сохранять версии текстур высокого разрешения на случай, если позже вам захочется увеличить детали в некоторых областях.

Заметьте, на этом изображении карты нормалей имеют одинаковое разрешение, но та, которую мы запекли с разрешением 1024, выглядит более сглаженной и похожей на highpoly, потому что в процессе уменьшения она сохранила в себе дополнительную информацию.
- Можно накладывать UV islands друг на друга, чтобы они использовали одинаковую информацию карты нормалей на разных частях модели. Просто переместите одну сторону модели на 1 единицу за наружу UV-пространства, чтобы программа запекания не пыталась получить детали с обеих сторон одновременно.
Можно пойти ещё дальше и использовать в некоторых деталях trim-текстуры или декали для оптимизации использования текстур.
- Текстуры используют сетку пикселей, а пиксели квадратны. Если какие-то детали образуют линию, попробуйте выровнять эту линию горизонтально или вертикально. Благодаря этому выровняются сетка пикселей и детали текстуры:


Проблема: моя модель симметрична, но с разных сторон карта нормалей отличается.
При применении к модели симметрии направления нормалей могут измениться из-за того, что изменился способ соединения граней. Иногда это означает, что можно получить шов прямо по центру модели. Чтобы избежать этого, сделайте так, чтобы нормали lowpoly в самом центре были выровнены, и при необходимости настройте сглаживание.
Ещё одна возможная причина — триангуляция: при импорте моделей в игровой движок они всегда триангулируются и иногда этот процесс может изменить нормали lowpoly, а по диагоналям граней lowpoly могут появиться артефакты. Чтобы избежать этого, триангулируйте модель перед запеканием, запеките карту нормалей, а затем примените модификатор симметрии.
Кроме того, вы можете изучить небольшой туториал Earthquake, который помог мне немного больше понять нормали вершин и карты нормалей.
Дополнительную информацию о картах нормалей можно узнать из wiki сайта Polycount.

Если вы когда-либо пытались запечь нормали в Blender, используя движок рендеринга Cycles, вы, вероятно, замечали следующее поведение: процесс запекания использует только информацию о геометрии меша и игнорирует вариации нормалей, созданные вашим материалом. Это означает, что если вы используете карту нормалей и/или карту рельефа, то они не будут учитываются.
Если мы подумаем об этом, это не должно быть достаточно удивительно: поскольку Cycles основан на системе нодов, мы можем создавать материалы с бесконечным числом комбинаций, мы можем даже использовать одну карту нормалей для диффузного шейдера, а другую для глянцевого шейдера. Он обеспечивает полную свободу творчества… но это также означает, что Cycles не может определить, какая часть вашего материала связана с вычислением нормалей. Таким образом, инструмент запекания не имеет другого выбора, кроме как полностью игнорировать эффекты, созданные вашим материалом, когда вы выбираете тип запекания Normal.
Слишком большая свобода приводит к разочарованию! На самом деле, запекание нормалей, включая эффекты материала действительно полезны по крайней мере по двум причинам:
- Если вы используете карту нормалей (normal map), чтобы получить детали из высокополигональной модели и карту рельефа (bump map), чтобы создать дополнительные детали, вы, вероятно, объедините их в своем материале (речь о Cycles). Но если вы хотите экспортировать свою модель в другой движок рендеринга, то некоторые из них (особенно рендеры реального времени) позволяют использовать либо карту нормалей, либо карту рельефа, но не обе одновременно. Вам не нужно выбирать одну карту или другую…
- Если вы используете текстуры с высоким разрешением, может быть полезно объединить информацию с карты нормалей, карты рельефа и процедурных текстур в единую карту нормалей, чтобы уменьшить объем памяти и упростить ваш материал.
Нод Material Output имеет вход Displacement. Если вы используете данный слот в своем материале, то он деактивирует все другие слоты Normal для всех нодов. Но, поскольку это также явно указывает Cycles на то, как ваш материал влияет на геометрию объекта, тогда эффект смещения будет включен в процесс запекания.
Несмотря на то, что это не так просто, вы, все-таки, можете создать карту нормалей, включая эффекты от вашего материала в Cycles. Я нашел несколько способов позволяющих добиться этого. Все они, насколько я могу судить, являются математически правильными (иначе итоговая карта нормалей создавала бы немного иной эффект, нежели исходный материал). С моей точки зрения, наиболее эффективным способом было создание специальной группы нодов в Cycles. Я назвал ее normal to map. В этой статье я покажу, как работать с этой группой нодов и обосную ее математическую сторону.
Если вы просто хотите использовать normal to map, вы можете загрузить blend-файл. Файл содержит очень простой пример и саму группу нодов. Этот файл лицензируется под CC0 1.0 Universal, поэтому вы можете свободно использовать эту группу для своих собственных целей.
Далее в этой статье, я буду предполагать, что вы знакомы с Blender, Cycles и инструментом запекания в Blender.
Как использовать группу normal to map
Группа normal to map предназначена для запекания информации о нормалях вашего материала в карту нормалей. Поэтому вы должны добавить ее непосредственно перед процессом запекания и затем удалить из своего материала.

Входной слот Normal соответсвует тому же входу, что и у стандартных BSDF-шейдеров, и он является нормалью, которую вы хотите запечь. Есть два выходных слота: цвет sRGB и Non-color. Вы должны использовать тот же выход, что и цветовое пространство текстуры, которую вы запекли. По умолчанию Blender создает текстуру в цветовом пространстве sRGB.
Я рекомендую вам использовать формат Non-Color: требуется меньше вычислений (не применяется гамма-коррекция), поэтому вы избежите некоторых проблем округления при расчетах. Вы можете изменить цветовое пространство вашей текстуры на панели свойств в редакторе UV/Image.

Для людей, использующих управление цветом Filmic Blender, sRGB помечен как sRGB EOTF, а Non-color как Non-Color Data.
Пошаговая инструкция использования группы normal to map:
- Добавьте группу «normal to map» к вашему материалу.
- Подключите вектор нормали который вы хотите запекать к входу Normal.
- Подключите выбранный выходной слот к шейдеру Emission.
- В редакторе UV/Image создайте новое изображение.
- На панели свойств в редакторе UV/Image выберите то же цветовое пространство, что и у выходного сокета.
- Добавьте нод Image Texture и укажите в нем только что созданное изображение (данный нод должен быть выделенным(активным)).
- В меню запекание выберите тип Emit.
- Нажмиет кнопку Bake.

Группа создает соответствующие цвета для представления информации о нормалях. Поэтому вы должны использовать шейдер Emission, как если бы объект излучал информацию о них. Поскольку чистый шейдер Emission не подвержен влиянию светлячков и отскокам света, вы можете использовать всего-лишь один сэмпл для рендеринга. Это означает, что процесс запекания экстримально быстрый!
Улучшение производительности
Создание одной карты нормалей для замены части материала может дать интересные улучшения. Рассмотрим изображения ниже. Для левой части в материале тела используется карта нормалей, карта рельефа и процедурная текстура для генерации дополнительных вариаций нормалей. Для правой части я запек все вышеперечисленный текстуры в одну карту нормалей с помощью группы Normal to map. Я сохранил результат в файл и создал гораздо более простой материал, используя запеченную карту нормалей.


В таблице ниже приведены некоторые данные о визуализации:
| Материал | Время рендеринга | Пик используемой памяти |
|---|---|---|
| Оригинальный материал | 16:03 | 1371 Mб |
| Запеченная карта нормалей | 13:55 | 350 Mб |
Для данной модели использование более простого материала оказывает значительное влияние на производительность!
Известные проблемы
Из-за внутренних вычислений вы можете получить незначительные изменения между исходными нормалями, и вычисленными с помощью группы нодов Normal to map. Поскольку эти отличия минимальны, они совершенно незаметны.
Группа Normal to map сильно зависит от вращения и масштаба вашей модели. Не забудьте применить эти преобразования перед запеканием.
Самая раздражающая проблема исходит не от самой группы, а от процесса запекания. Если вы внимательно посмотрите на два изображения выше, они покажутся вам идентичными… но это не так! Если вы откроете эти изображения на отдельных вкладках при 100%-ом разрешении и будете переключаться между ними, вы заметите странный эффект: некоторые детали, похоже, скользят по поверхности! Посмотрите на гифку ниже, чтобы увидеть этот эффект:

Мне потребовался день, чтобы убедиться в том, что этот эффект не был создан группой Normal to map! На самом деле проблема связана с трансформацией карты рельефа в карту нормалей. Если обобщить, карта рельефа хранит информацию о высоте, в то время как карта нормалей сохраняет изменение высоты. Это означает, что если текстура содержит три пикселя для отображения карты рельефа, каждый пиксель представляет собой разную высоту. Для достижения такого же результата с помощью карты нормалей текстура должна содержать не менее двух пикселей для кодирования изменения высоты. Из-за этого мы и получаем небольшой сдвиг между картой рельефа и картой нормалей.

Поэтому, когда мы хотим преобразовать информацию о карте рельефа в информацию о карте нормалей, мы получаем смещение информации на финальной текстуре. Один из способов избежать этого — использовать текстуру с более высоким разрешением для окончательного запекания. Но это не всегда желательно.
Поэтому, если вы планируете использовать группу Normal to map, держите в голове этот нюанс, особенно если вы создаете рендер модели крупным планом.
Как работает группа Normal to map
В этом разделе рассказывается о том, что происходит под капотом. Вам не нужно понимать эту часть для использования группы. Но если вас интересует математика, давайте начнем с карты нормалей.
Очевидно, что карта номралей не имеет ничего общего с цветом! Текстура нормалей — это изображение, и мы можем открыть его в редакторе изображений. Но это не изображение, потому что каждый пиксель (или, точнее, каждый тексель) не является цветовой информацией: это информация о нормалях.
Что такое нормаль? Нормаль — это вектор, перпендикулярный поверхности. Почему это так важно? Потому что нормаль используется, чтобы определить, где находиться лицевая сторона грани, а где тыльная. Что еще более важно, нормаль используется практически в любом шейдерном ноде. Например, чтобы определить, как свет отскакивает от поверхности. Если мы можем изменять ориентацию нормали, то, тем самым мы можем изменить способ отражения света, создать поддельные царапины и имитировать не существующую геометрию. Это и есть то, для чего используется карта нормалей.
Текстура нормалей содержит направления нормалей, учитывая исходные их направления (0,0,1). Это означает, что координаты должны быть в касательном пространстве. И в этом суть: Cycles представляет информацию о нормалях в мировом пространстве. Чтобы запечь карту нормалей, нам нужно преобразовать вектора нормалей из мирового пространства в касательное пространство. Итак, мы должны выполнить следующую операцию:
Nts = MNws
Где Nws — вектор нормали в мировом пространстве (тот, который создается материалом), M — матрица преобразований из мирового пространства в касательное пространство, а Nts — вектор нормали в касательном пространстве (тот, который мы хотим получить). Матрица трансформации M представляет собой матрицу 3×3, составленную в линию касательным вектором, бикасательным вектором и исходным вектором нрмали грани:

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

И создать набор нодов для выполнения вычислений:

Все это могло бы быть намного проще, если бы нод Vector Transform работал с касательным пространством… может быть интересным улучшением в будущем.
Затем мы должны закодировать векторные координаты в значения цвета, чтобы создать окончательную текстуру нормалей. Поскольку вектор нормали является единичным вектором x, y и z, координаты находятся в диапазоне от -1 до 1. Мы должны преобразовать эти координаты в значения цвета между 0 и 1. Нод Vector Curves может сделать эту математику для нас.

Наконец, цветовое пространство sRGB означает, что Blender будет применять гамма-коррекцию 1/2.2, поскольку форматы файлов с глубиной цвета 8 бит на канал (PNG, JPEG…) должны предварительно кодировать значения цвета, подобные этому. Но поскольку текстура нормалей не содержит значений цвета, а состоит из векторных координат, мы должны предотвратить это, применяя обратную гамма-коррекцию 2.2. Использование нецветного пространства (non color space) для запекания текстуры прямолинейно, потому что мы сообщаем Blender, что хотим использовать линейное цветовое пространство (гамма-коррекция не требуется).
источник урока
#статьи
- 9 мар 2023
-
0
Что такое запекание текстур
Разбираем одно из ключевых понятий в 3D-моделировании и все основные операции, связанные с ним.
Скриншот: Damon Woods / ArtStation / Skillbox Media

Считает игры произведениями искусства и старается донести эту идею до широких масс. В свободное время стримит, рисует и часами зависает в фоторежимах.
В производстве игр важно найти баланс между производительностью и качеством картинки. Для лучшей оптимизации будущего проекта разработчики прибегают к процессу запекания, но не кулинарных творений, а данных, связанных с визуальной составляющей, — освещения, симуляций, анимаций и, конечно же, текстур.
Термин «запекание» или «запечка» — буквальный перевод с английского слова baking. В контексте 3D-моделирования под этим подразумевается перенос комплексных данных в статичную форму. В данном случае — в текстурные карты. Эти текстуры формируют поверхность будущего материала.
1. Создание уникальных материалов. В качестве основы может быть как фото, так и изображение, нарисованное вручную или созданное процедурным методом с помощью нодов. Художник запекает набор текстурных карт, свойства которых зависят от того, как должен выглядеть итоговый материал после экспорта в игровые движки или системы рендеринга. Также в процессе запекания текстуры можно спроецировать на готовую UV-развёртку модели.
Кадр: Ryan King Art / YouTube
2. Запекание упрощает рендеринг в реальном времени, так как игровой движок должен просчитать все тени, освещение и полигоны в каждом кадре. Запечённые текстуры уже содержат в себе информацию об отражении, освещении, объёме и прочих свойствах объекта, которые создают ощущение реализма.
Изображение: Dannie Carlone / ArtStation
3. Когда художник продаёт или делает на заказ модель с использованием PBR-материалов, загруженных с какого-либо ресурса, он рискует нарушить авторское право. Например, на большинство бесплатных материалов портала BlenderKit распространена лицензия Royalty Free, согласно которой пользователь может использовать загруженный контент в своих работах в коммерческих целях, но не в первозданном виде. И в этом случае запекание текстур помогает художнику избежать неприятностей при использовании лицензированного контента: у будущего покупателя не будет доступа к исходникам. Вместо этого он получит наборы текстур, содержащие лишь фрагменты сторонних материалов.
Скриншот: BlenderKit / Skillbox Media
4. В игровые движки и системы рендеринга нерационально загружать модели, содержащие несколько миллионов полигонов. В целях оптимизации и экономии ресурсов создаётся low-poly-версия high-poly-модели, а все мелкие детали переносятся в виде текстурных карт.
Изображения: Leo Haslam / ArtStation
Существует много вариаций текстур, и каждая из них наделяет поверхность объекта особыми свойствами. Такое разнообразие связано с тем, что у каждого ПО разные системы шейдеров и наборы инструментов. Задача художника состоит в том, чтобы подготовить собственный набор карт, исходя из специфики игрового движка, системы рендеринга и общего визуального стиля проекта.
Скриншот: Damon Woods / ArtStation / Skillbox Media
Diffuse Map / BaseColor Map (Albedo/Color Map) — основная карта, которая определяет цвет и изображение поверхности меша. Исходя из названия, несложно сделать вывод, что у этой текстуры множество названий. Пользователи часто считают их синонимами, ведь данный тип карт обычно подключают в один и тот же слот шейдеров. Однако диффуз-карта и карта альбедо отличаются друг от друга как визуально, так и по свойствам. Поэтому начинающие 3D-художники часто путают понятия, когда речь заходит о создании базовой текстуры. В чём же отличие?
Изображение: ShaderMap
На стандартных диффуз-картах изображение содержит светлые участки и тени. Это приводит к тому, что при наличии дополнительных источников света и технических карт на объекте могут появиться лишние тени или засветы. В контексте реалистичной графики это может негативно повлиять на итоговую картинку.
В последние годы художники часто используют PBR-материалы с картой альбедо в качестве основы. По сравнению с диффуз-текстурой она достаточно блёклая: на изображении отсутствуют затенения и яркие участки, но остаётся информация о цвете будущего материала. Все расчёты по освещению выполняет движок или система рендеринга в сочетании с картой Ambient Occlusion, речь о которой пойдёт ниже. Из-за этого поверхность объекта выглядит более яркой и естественной.
Normal Map — карта нормалей с информацией о направлении каждого пикселя. Визуально она выглядит как цветная текстура с RGB-каналами. Красный отвечает за направление по оси X, зелёный — за ось Y и, соответственно, синий — за ось Z («выдавливает» нормали из поверхности). В зависимости от направления света в сцене карта нормалей придаёт объекту рельеф, создавая иллюзию высокополигональной модели. Форму рельефа можно отрегулировать, настроив RGB-каналы вручную.
Изображение: ShaderMap / Skillbox Media
Примечание
Bump Map — более ранняя версия карты нормалей. Это 8-битная карта, поддерживающая оттенки белой, чёрной и серой гаммы. При сером пространстве поверхность остается неизменной. Белый цвет создает имитацию выпуклых деталей, а чёрный, наоборот, «вдавливает» их внутрь. Тем не менее в некоторых системах шейдеров всё ещё существует поддержка Bump Map, и вместо неё можно подключить современную Normal Map.
Displacement Map — карта смещения, которая добавляет поверхности объём и эффект глубины. В отличие от Normal Map и Bump Map она не просто создает иллюзию объёма от освещения, но и смещает геометрию объекта, в результате чего он приобретает видимый объём.
Изображение: Katsukagi / 3D Textures / Skillbox Media
Примечание
Height/Parallax Map — карта высот/параллакса — аналог Displacement Map. Она тоже создаёт эффект рельефа, выходящего за пределы меша. Карту высот часто используют для текстурирования ландшафта, так как её свойства изменяют высоту вершин. За счёт этого некоторые участки меша визуально кажутся выше, чем другие, в зависимости от того, с какого ракурса зритель или игрок смотрит на текстурированную поверхность.
AO (Ambient Occlusion) Map — текстура, придающая мягкое затенение поверхности объекта, как при рассеянном освещении в облачную погоду. Она содержит данные о том, какие участки текстуры будут меньше или больше освещаться. Ambient Occlusion влияет только на диффузные (не зеркальные) отражения поверхности и зависит от общего света окружения, а не от отдельных источников.
Изображение: Autodesk Mudbox
Примечание
Сейчас многие игровые движки поддерживают эффект Ambient Occlusion в реальном времени. Эта техника известна как SSAO (Screen-Space Ambient Occlusion).
Specular Map — текстура с данными отражения от источников освещения. Обычно она выглядит как карта в серых тонах, где светлые участки сильнее отражают свет. Если нужно подчеркнуть отражение сложных металлических поверхностей — например, металлов со ржавчиной, — можно использовать цветную текстуру и таким образом оттенить отражение, что характерно для подобных материалов.
Glossiness Map — карта глянцевитости (не блеска), которая используется в сочетании с картой Specular. Она определяет, какие области поверхности дают больше глянца, а какие — меньше, в зависимости от интенсивности цветов карты. Чёрные области текстуры создают полный глянец, белые убирают его, а серые дают промежуточное значение свойства.
Metallic Map — альтернатива карте Specular, указанной выше. Эта чёрно-белая текстура работает как маска основной карты и сообщает системе рендеринга, какие участки поверхности объекта металлические, а какие — нет.
Roughness Map — карта шероховатости, которая идёт в сочетании с Metallic Map. Прямая противоположность карты глянцевитости, поэтому текстура инвертирована.
Примечание
Существует два подхода к текстурированию металлов PBR-материалами — Diffuse/Specular/Glossiness и Albedo/Metallic/Roughness.
В первом случае необходимо самостоятельно отрегулировать Specular Map, чтобы отражение не получилось слишком цветным и рассеянным, так как у металлов нет таких свойств. Для более реалистичного отображения металлов тёмные участки Specular-текстуры получают основной оттенок поверхности, а неметаллические — серый. В свою очередь, участки диффуз-текстуры закрашивают чёрным в тех местах, где предполагается металлическая поверхность.
Подход с картой Metallic намного проще: система рендеринга самостоятельно посчитает оттенок отражения элементов, отмеченных белым. Цвет металла зависит от базового цвета карты, а остальные элементы будут отмечены чёрным.
Изображение: обучающий материал от Уэса МакДермотта
Если все условия соблюдены, итоговый результат обоих подходов будет практически неотличим. Но стоит учитывать, что в этом случае Specular-подход потребует больше производительности из-за наличия цвета в карте отражений, и художнику придётся больше работать над покраской текстур, чтобы достичь нужного эффекта реализма.
В отличие от реалистичной графики стилизация не так требовательна к реализму. Поэтому в рамках стилизованных проектов набор текстур зависит от специфики общего визуала. Часто встречаются случаи, когда художнику не требуется ни одна из карт, озвученных выше, кроме Diffuse, так как материалам не нужно ни отражение, ни рельеф, ни тени — все эти свойства уже присутствуют в базовой текстуре за счёт ручной рисовки или других художественных техник.
Emissive/Emission Map — цветная карта для имитации излучения света материалом. Цветные участки соответствуют цвету излучения. В зависимости от настроек шейдеров в ПО, поверхность объекта может просто светиться изнутри или стать полноценным источником света.
Изображение: Jordan Hannon / ArtStation
Curvature/Concavity/Convexity Map — карта кривизны в серых тонах, которая содержит информацию о выпуклых (белый цвет) и вогнутых (тёмно-серый цвет) участках. Нейтральные области отмечены серым цветом. Чаще всего используется в качестве маски, когда нужно подчеркнуть мелкие трещины, изношенность, щели и швы, в которых скопилась грязь.
Изображение: Cameron Schulz / ArtStation
Изображение: Cameron Schulz / ArtStation
Изображение: Cameron Schulz / ArtStation
Opacity/Transparency/Alpha Map — чёрно-белая карта (иногда с оттенками серого), определяющая непрозрачность текстуры. Чёрный цвет — прозрачные участки, белый — непрозрачные. Чаще всего используется для текстурирования решёток, растительности и волос.
Изображение: crowinhand / Sketchfab / Skillbox Media
Transfluency Map — цветная карта прозрачности. Внешне похожа на диффуз-карту, но её оттенок более яркий. Свойство прозрачности позволяет источникам света пропускать сквозь материал часть лучей. Transfluency Map используют в работе, когда нужно подчеркнуть реализм в сценах, где лучи солнца или яркого фонаря просвечивают листья деревьев, лепестки цветов, ткани и другие тонкие меши. Цветную карту прозрачности сочетают с картой Opacity для определения границ эффекта от текстуры.
Color (ID) Map — техническая цветовая карта (не путать с Color Map / Albedo Map), которая упрощает дальнейшую работу по раскраске или наложению текстур сложных объектов. Для этого модель разделяют на логические части и за каждой закрепляют материал с определённым цветом. Например, бежевый — для тела, коричневый — для одежды и так далее. Подобная разметка помогает быстро распределить все необходимые материалы по текстурному пространству и подготовить основную карту.
Примечание
Как и прочие ситуативные карты, перечисленные выше, текстуру Color ID запекать необязательно. Тем не менее она значительно упрощает процесс текстурирования в Substance Painter и аналогичных программах.
Во многих подходах наборы текстур можно сгенерировать с помощью графических редакторов или специальных программ наподобие ShaderMap. Поэтому в рамках этого материала мы рассмотрим несколько нюансов запекания текстур, которые встречаются при переносе деталей high-poly-моделей на low-poly.
Перед запечкой необходимо подготовить так называемый кейдж (от англ. cage) — продублированный меш low-poly-объекта. Кейдж должен максимально плотно прилегать к high-poly- и low-poly-моделям, но не пересекаться с их геометрией. Таким образом исходящие лучи при запекании будут отскакивать от кейджа и получать информацию о том, как преобразовывать мелкие детали high-poly-объекта в карту нормалей для low-poly.
Примечание
Во время процесса переноса нельзя изменять геометрию low-poly модели и кейджа, иначе на запечённых текстурах появятся артефакты. Если остались какие-то детали, которые нужно перекрыть кейджем, то геометрию кейджа можно двигать только в пространстве путём перемещения, не меняя направление граней и вершин.
Также желательно назначить кейджу материал яркого цвета. Так при корректировке перекрытия будет проще заметить, какие части high-poly-модели всё ещё находятся поверх кейджа.
Чаще всего после запекания текстур на поверхности низкополигонального объекта образуются артефакты из-за отсутствия шва в местах жёстких рёбер, о которых мы упоминали в материале про UV-развёртку. В этом случае придётся либо переделать развёртку и отметить недостающие швы, либо смягчить углы с помощью специальных инструментов в программе для 3D-моделирования. Например, использование Фаски (Bevel) в Blender на краях высокополигональной модели помогает улучшить качество запекания.
Кадр: Academic Phoenix Plus / YouTube
Примечание
Перед тем как исправлять артефакты, вызванные швами, оцените, насколько они критичны в контексте текущей задачи. Если модель сделана не для ассета на маркетплейсе и не для игры, а рассчитана на использование в статичном рендере или расположена в сцене таким образом, что данные недочёты не увидит зритель, возможно, рациональнее уделить внимание каким-то более важным вещам.
Ещё одна частая проблема — некорректное отображение нормалей в результате запекания. Полученный рельеф кажется либо слишком вдавленным, либо нечётким, либо его вообще нет. Это связано с тем, что лучи, исходящие от low-poly-объекта, не могут правильно считать информацию о рельефе high-poly-объекта из-за того, что его меш расположен слишком близко или слишком далеко. Эту проблему может исправить корректировка расстояния во время запекания.
Кадры: Academic Phoenix Plus / YouTube
С более подробным списком проблем, связанных с запеканием карт нормалей и их решением, можно ознакомиться в четвёртой части туториала This is normal от художника Карлоса Лемонса на ArtStation. На Habr размещён неофициальный перевод этой главы на русский язык.
Примечание
Существуют техники, при которых необязательно запекать все мелкие детали высокополигональной модели. Достаточно обзавестись специальным набором кистей и использовать их в программах, которые поддерживают альфа-кисти и карты высот.
В рамках ознакомительного материала невозможно разобрать все тонкости запекания в каждой программе для 3D-моделирования. Но можно узнать о них больше, ознакомившись с небольшой подборкой обучающих материалов.
3ds Max:
- официальная документация;
- подборка уроков (канал Autodesk 3ds Max Learning Channel).
Maya:
- видеоурок по компоновке UV-развёртки персонажа и запеканию текстур (канал TutorCG);
- видеоурок по переносу деталей с high-poly на low-poly (канал Figura).
Blender:
- пошаговое руководство по UV-развёртке и запеканию текстур (сайт Brandon’s Drawings 2D/3D-художника Брэндона Стокинга);
- видеоурок по запеканию нормалей с высокополигонального объекта на низкополигональный (канал Blender Guru);
- видеоурок по запеканию разных деталей на одну карту (канал Ryan King Art).
Substance Painter:
- официальная документация;
- видеоурок (канал Flipped Normals Marketplace).
Marmoset Toolbag:
- официальная документация по запеканию деталей высокополигональной модели на низкополигональную;
- официальный видеоурок.
3DCoat:
- официальный видеоурок.
Существует много причин, по которым запекают текстуры. В любом случае этот процесс помогает оптимизировать объекты, поверхность которых наделена множеством свойств.
Окончательный вид текстуры формируют технические карты — Normal, Specular, Ambient Occlusion и многие другие.
Набор текстур зависит от визуального стиля проекта, специфики ПО и предполагаемой фактуры самих материалов.
При переносе деталей high-poly-модели на low-poly необходимо проверить наличие швов на жёстких рёбрах, настроить правильную дистанцию между проецируемыми мешами и использовать кейдж.
Запекание текстур доступно во всех программах для 3D-моделирования, но сам процесс в каждой из них происходит по-разному. Выберите для себя самый оптимальный и понятный инструмент, внимательно изучите его и приступайте к освоению «кулинарных» навыков в 3D.
Научитесь: 3D моделирование для начинающих
Узнать больше



