Гайд по текстурированию: проверка запекаемых карт. Часть 1: проверка нормала
В изучении 3D-графики большую роль играет работа над ошибками. Хоть в продакшене это чаще всего невозможно, но в обучении все новички должны стремиться доводить свои работы до идеала. Проще сказать, чем сделать, ведь один вопрос решать известные проблемы, а совсем другое — фиксить то, о существовании чего и не догадываешься.
Действительно, вот ты затекстурил очередной пропс, смотришь на него и вроде в общем всё хорошо, но что-то с ним не так. Цвета неправильные? Roughness однообразный? Может быть это всё из-за плохого света? Точно, плохой свет. или всё же нужно перезапеч карту AO покачественней?
Через подобного рода «поиск улучшений» проходят все артисты в начале своего пути. Даже когда начинаешь разбираться во всем получше — всё равно возникают подобные ситуации.
В этом цикле статей мы разберем основные проблемы, которые встречаются у новичков в процессе запекания карт, текстурирования, презентации своих работ и тд.. Мы поговорим об разнообразии и истории на Roughness и Albedo, о главных ошибках при использовании Height канала и ещё о многом другом.
Обсуждать всё это мы будем на примере заранее созданной модели шлема американских пилотов времен Вьетнамской войны — SPH-4
Конкретные требования к качеству запекаемых карт нельзя определить однозначно. На одних проектах допускается normal map со слабо заметными артефактами, на других же — требуют просматривать каждую карту в максимальном приближении.
Все зависит от значимости ассета. Если в играх от первого лица есть возможность рассмотреть все детали, то в проектах от третьего — бессмысленно тратить время на полировку каждого элемента. Учитывать нужно и степень освещенности сцены, разрешение текстур, шейдеры и тп. Незачем шлифовать объект до безупречности, если он прячется в дальнем темном углу.
В этой статье мы пройдемся по типичным артефактам на normal map и пофиксим их.
Итак, ты создал классную модель, развернул её и даже успел забэйкать карты, но что-то с ними не так:
..да и остальные карты смотрятся так себе.
Однозначно нужно чинить. В большинстве случаев начинать стоит с нормала, ведь на нем проявляется большая часть проблем. Разберешься с ним — и работа пойдет намного легче.
Normal map
Отметим проблемные места на шлеме.
Практически все артефакты при запекании нормала решаются по шаблону.
Разберем пять основных ошибок, которые видно на шлеме.
Пересечение кейджа. Если простыми словами: при бейке нормала программа создает область вокруг объекта, из которой проецируются световые лучи, помогающие запечь карту. Когда объекты находятся слишком близко друг к другу или в настройках запекания выставлены высокие значения Cage Distance, элементы могут перепекаться друг на друга, что и видно на скриншоте.
Решение: назначить объектам разные имена, если ты запекаешь по неймингу, или разнести их в сцене дальше друг от друга. Как вариант, можно покрутить настройки Cage Distance.
Швы, вызванные неправильной расстановкой smoothing group или инвертированным зеленым каналом. Если с первым всё просто — Hard Edge — UV шов, то за вторым придется следить отдельно.
Существует два основных алгоритма работы Normal map — OpenGL и DirectX. Отличаются они направленностью света в зеленом канале. В OpenGL свет идет снизу вверх (Y+), а в DirectX — наоборот (Y-). Если ты запекаешь нормал в Marmoset и используешь DirectX в своем сабстанс проекте — нужно обязательно инвертировать зеленый канал. Алгоритм DirectX/OpenGL выбирается при создании проекта. Но его можно сменить и в процессе работы в Edit —> Project Configurations.
Причина таких жестких швов на нормале — разная ориентация шеллов на UV. Старайся следить, чтобы островки имели общую направленность. Во-первых, это поможет избежать подобных проблем на нормале. Во-вторых, в будущем будет проще использовать гранжи с явной направленностью при текстурировании.
Несоответствие high poly и low poly версий модели — частая ошибка новичков. Из-за этого на нормале смещаются запеченные элементы. Старайся сопоставлять и подгонять друг к другу хайполи и лоуполи перед запеканием.
Тут видно, что карта нормалей вовсе не пропеклась. Скорее всего, была допущена ошибка в нейминге. Если ты запекаешь карты по именам, названия должны быть корректными и совпадать на low и high poly моделях. И не забывай назначать правильные суффиксы в именах мешей.
Читайте также: Как можно в домашний условиях приклеить ткань ткани
Каким бы сложным не казался процесс запекания карты нормалей, 90% возникающих проблем решаются по одному алгоритму.
Большая часть артефактов на нормале решена, теперь можно приступать к запеканию остальных карт и исправлять оставшиеся проблемы.
В следующем материале мы тщательно проверим AO, Curvature, Position, World Space Normal карты, пофиксим лишние запеченные тени, черные пиксельные линии на стыках UV шеллов и другие мелкие недостатки. Stay tuned.
Это норма: что такое карты нормалей и как они работают
На протяжении нескольких лет я пытался разобраться в картах нормалей и в проблемах, которые обычно возникают при работе с ними.
Большинство найденных объяснений было слишком техническим, неполным или чересчур сложным для моего понимания, поэтому я решил попробовать объяснить собранную мной информацию. Я понимаю, что эти объяснения могут быть неполными или не совсем точными, но всё равно попробую.
Первые созданные человеком 3D-модели выглядели примерно так:

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

Требовалось другое решение, и так были изобретены нормали. (Всё происходило не совсем так, но так проще объяснять и понимать.)
Давайте проследим за линией из центра полигона, перпендикулярной его поверхности. Мы дадим этой линии очень непривычное название: нормаль. Цель нормали — контролировать, куда указывает поверхность, чтобы когда свет отразиться от этой поверхности, она могла использовать нормаль для вычисления получившегося отражения. Когда свет падает на полигон, мы сравниваем угол луча света с нормалью полигона. Луч отражается под тем же углом относительно направления нормали:

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

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

Мы будем воспринимать переход как единую поверхность, потому что свет будет отражаться между одним и другим полигоном плавным образом, и между ними не будет пробелов. По сути, свет отражается от этих полигонов плавно, как будто у нас имеется множество полигонов.
Читайте также: Какая группа растений не имеют тканей
Именно этим мы управляем, задавая smoothing groups (3ds Max, Blender) или указывая рёбра как hard или smooth (Modo, Maya): мы сообщаем программе, какие переходы между гранями должны быть плавными, а какие — жёсткими.
Вот сравнение одной сферы из 288 полигонов с жёсткими и плавными переходами:

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

Именно поэтому в 3D-редакторах обычно есть параметр углов сглаживания: если у нас есть два связанных полигона под углом, превышающем угол сглаживания, то их переход будет плавным, а соединение полигонов под углом меньше угла сглаживания будет жёстким. Благодаря этому крутые углы между поверхностями будут отображаться как разные поверхности, как это и бывает в реальном мире.
Итак, мы использовали нормали для контроля над переходами между гранями модели, но можно пойти ещё дальше.
Так как мы меняем способ отражения света от объекта, можно также сделать так, чтобы очень простой объект отражал свет, как сложный. Это называется картой нормалей. Мы используем текстуру для изменения направления света, отражающегося от 3D-объекта, заставляя его выглядеть сложнее, чем он есть на самом деле.
Примером из реального мира могут служить голограммы, которые раньше вручали в подарок при покупке картофельных чипсов (по крайней мере, у нас, в Испании). Они совершенно плоские, но отражают свет так, как бы это делал 3D-объект, благодаря чему становятся сложнее, чем на самом деле. В мире 3D-графики это работает даже лучше, но всё равно имеет свои ограничения (поскольку поверхность остаётся плоской).
Хоть мы и применяем нормали полигонов для реализации какой-то чёрной магии, на самом деле мы не контролируем сглаживание поверхности модели при помощи нормалей полигонов. Мы используем нормали вершин для контроля сглаживания нормалей. По сути, идея та же, но немного более сложная.
С каждой вершиной может быть связано одна или несколько нормалей. Если она имеет одну нормаль, то можно назвать её усреднённой нормалью вершины, а если несколько — то разделённой нормалью вершины.
Давайте возьмём два полигона, соединённых ребром. Если переход между двумя гранями плавный (если мы указали его как плавный в Maya/Modo, или обе имеют одинаковую smoothing group в Max/Blender), то каждая вершина имеет одну нормаль, которая является средней нормалей полигонов (поэтому она и называется усреднённой нормалью вершины). Важное примечание: до недавнего времени каждый 3D-редактор использовал собственный способ вычисления усреднённых нормалей вершин, то есть карты нормалей, вычисленные в одной программе, в другой могли выглядеть совершенно иначе. Подробнее об этом я расскажу во второй части туториала.

Если переход жёсткий (hard edge или разные smoothing groups), то каждая вершина имеет несколько нормалей: по одной для каждой соединённой вершины, выровненной по их нормалям. При этом между нормалями образуется пробел, который выглядит как две разные поверхности. Именно это называется разделённой нормалью вершины.


Как вы могли догадаться, контроль нормалей вершин очень важен, если мы хотим контролировать карты нормалей. К счастью, нам не обязательно изменять нормали напрямую или даже видеть их, но понимание того, как это работает, поможет вам понять, почему мы выполняем работу именно так и больше разбираться в проблемах, с которыми мы можем встретиться.
При запекании карты нормалей мы по сути говорим программе изменить направление, которому следуют нормали lowpoly-модели, так, чтобы они соответствовали направлению в highpoly-модели; поэтому lowpoly-модель будет отражать свет так же, как highpoly. Вся эта информация хранится в текстуре под названием «карта нормалей». Давайте рассмотрим пример.
Читайте также: Гладкая мышечная ткань мочевого пузыря препарат гистология
Допустим, у нас есть вот такая низкополигональная модель (lowpoly). Плоская поверхность с четырьмя вершинами и настроенными UV, которые программа запекания будет использовать для создания карты нормалей.

И она должна получить информацию о нормалях от этой высокополигональной (highpoly) модели, нормали которой сложнее.

Помните, что мы переносим только информацию о нормалях, то есть UV, материал, топология, преобразования и т.п. к делу не относятся. Проверенное правило: если highpoly-модель выглядит хорошо, то её нормали тоже хороши и вполне должны подходить для запекания.
Программа запекания берёт lowpoly-модель и испускает лучи, следуя по направлениям нормалей lowpoly (именно поэтому нам нужно контролировать нормали lowpoly). Эти лучи имеют ограниченную длину чтобы не получать информацию нормалей от далёких граней (обычно это расстояние называется bake distance или cage distance). Когда эти лучи сталкиваются с highpoly, программа запекания вычисляет, как отразить эти лучи, чтобы они следовали по направлению нормалей highpoly, и сохраняет эту информацию в карту нормалей.

Вот результат запекания для нашего примера:

У нас есть текстура, которую движок использует для изменения нормалей lowpoly, чтобы свет отражался от этой lowpoly-модели так же, как он отражался бы от highpoly-версии. Не забывайте, что это только текстура, которая не влияет на силуэт lowpoly-модели (невозможно изменить способ отражения света от модели, если свет не падает на эту модель).
Хотя понятно, что можно «считать» внешний вид highpoly по внешнему виду карты нормалей, очевидно, что карты нормалей — это не обычные текстуры, потому что они хранят информацию не о цвете, а о нормалях. Также это значит, что карты нормалей нельзя рассматривать как обычные текстуры; к тому же, как мы увидим, они обладают особыми параметрами сжатия и гамма-коррекции.
Можно воспринимать карту нормалей как набор из трёх текстур в оттенках серого, хранящийся в одном изображении:

Первое изображение сообщает движку, как эта модель должна отражать свет, падающий справа; оно хранится в красном канале текстуры карты нормалей.
Второе изображение сообщает движку, как модель должна отражать свет, падающий снизу*; оно хранится в зелёном канале текстуры карты нормалей.
*В некоторых программах свет падает не снизу, а сверху, то есть могут быть «левосторонние» и «правосторонние» карты нормалей. Как мы увидим позже, это может вызывать некоторые проблемы.
Третье изображение сообщает движку, как модель должна отражать свет, падающий спереди; оно хранится в синем канале текстуры карты нормалей. Так как большинство объектов при освещении спереди выглядят белыми, карты нормалей обычно кажутся синеватыми.
Когда мы комбинируем все три изображения в одно, то получаем карту нормалей. Помните, что это объяснение не полностью корректно, но надеюсь, что оно позволит вам понять информацию, хранящуюся внутри карты нормалей, и лучше разобраться, что она делает.
Нормали — это векторы, которые используются для определения того, как свет отражается от поверхности. Их можно использовать для контроля над переходом между гранями (усреднением нормалей соединённых вершин для создания плавного перехода или разделением их для создания жёсткого перехода), но также их направление можно изменять, чтобы lowpoly-модель отражала свет так же, как более сложная модель.
Эта информация хранится в трёх отдельных каналах изображения, и 3D-редактор считывает её, чтобы понять, в каком направлении должна смотреть поверхность модели.
В следующей статье цикла мы поговорим о том, как можно запекать эти детали из highpoly-модели в lowpoly.
- Свежие записи
- Балкон в многоквартирном доме: является ли он общедомовым имуществом?
- Штраф за остекление балкона в 2022: что это и как избежать наказания
- Штраф за мусор с балкона: сколько заплатить за выбрасывание окурков
- Оформление балконного окна: выбираем шторы из органзы
- Как выбрать идеальные шторы для маленькой кухни с балконом
