Это норма — 4: решение проблем с картами нормалей

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

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

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

Мы используем карты нормалей для изменения направления нормалей 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 может работать с обоими типами и экспортировать оба типа карт нормалей.
Проблема: некоторые части кажутся плоскими/в них отсутствуют какие-то детали
Представьте, что при запекании карт нормалей программа запекания испускает лучи из поверхности lowpoly-модели, следуя по нормалям lowpoly, пока лучи не пересекутся с highpoly-моделью и не повернутся. После этого программа запекания берёт эту информацию и сохраняет её в карту нормалей.
Эти испущенные лучи не должны двигаться бесконечно, потому что могут столкнуться с далёкой частью highpoly и повернуться неправильно, поэтому программа запекания ограничивает дальность испускания лучей и иногда лучи могут останавливаться прежде, чем успеют пересечься с highpoly. В таком случае мы теряем детали и карта нормалей имеет области плоского цвета.

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

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



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

Здравствуйте, помогите пожалуйста, почему у меня пустая карта нормалей, которую я запекаю в 3ds Max? Настройки вроде бы все настроил, Cage все как положено, поверх всех объектов. Но на выходе карта нормалей пустая. Что я делаю не так?
На сайте c 28.02.2017
Сообщений: 2156
Omsk
Каким рендером печете?
На сайте c 10.01.2019
Сообщений: 11
Цитата Dogeva:
Каким рендером печете?
На сайте c 28.02.2017
Сообщений: 2156
Omsk
А сбоку там что торчит? Оба объекта должны совпадать по всем осям
На сайте c 10.01.2019
Сообщений: 11
Цитата Dogeva:
А сбоку там что торчит? Оба объекта должны совпадать по всем осям
Сбоку торчит Plain на которую я хотел назначить карту нормалей и увидеть что получилось
На сайте c 16.03.2016
Сообщений: 2144
Москва
развёртки нет значит
На сайте c 09.04.2013
Сообщений: 1309
столица мира
а если плейн и шестерни на нем — разные объекты, с них запечется правильная нормал мапа? я прост в максе таким не занимался.
На сайте c 10.01.2019
Сообщений: 11
Цитата dontpiter:
развёртки нет значит
На сайте c 06.05.2014
Сообщений: 3034
Краснодар
уверены что выбрали в прожекшен вашу геометирю?
На сайте c 16.03.2016
Сообщений: 2144
Москва
Сцену кидайте чё гадать то?
На сайте c 09.06.2013
Сообщений: 396
Тюмень/Анталия
У меня была подобная проблема, я забил потом. Любопытно, что люди посоветуют
На сайте c 06.08.2013
Сообщений: 1916
Москва
Medoed_s, заатач плейн с шестерней и заново пробуй. запечется все только если это 1 мешь будет.
На сайте c 15.01.2009
Сообщений: 55
Файл никто не скачал, так что выложу скрины. У меня та же проблема что и выше, нормально получается только с кубика с фасками запечь нормали на обычный кубик (кстати, там все идеально!).Короче вот моя лоу-поли модель

вот развертка этой модели

группы сгаживания совпадают с разверткой





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

ну и собсвенно попытка запекания:

немного поправил кейдж внутри

вот такой рендер делает скайлан

и на выходе такой файл — просто синий

попробывал проделать запечку в сабстанс пейнтер. эскпортирую в фбх по очереди лоу и хайполи

запекаю и получаю уже что-то, но очень кривое, особенно в отверстии по центру

вот как он мне показывает потом карту нормалей

В общем это моя первая запечка модели (не считая кубика) и я просто не понимаю, почему так криво. Но главное почему 3д макс отказывается запекать. Буду благодарен за ответы.
Создание карты нормалей в Blender (Normal Maps)

Normal Map — это текстура, контролирующая направление отражения света. Используется данная технология для создания высокодетализированных низкополигональных моделей. Необходима для визуализации относительно сложных объектов в компьютерных играх без потери качества.
Немного теории
Для создания карты нормалей необходимо иметь высокополигональную и низкополигональную модель. Во время создания текстуры информация из высокополигональной модели интерпретируются в цветовую составляющую RGB, где [r,g,b] соотносятся с осями [x,y,z]. Соответственно красный цвет (R) отвечает за координату X, зеленый (G) за координату Y и синий (B) за Z (высоту).
Вы можете создать модель состоящую из миллиона полигонов, а затем создать такую же (визуально и под определенным углом), но состоящую всего из двух полигонов.

Создание Normal Maps в Blender
Возьмите любую высокодетализированую поверхность. Для примера, я буду использовать плоскость, на которой расположено несколько простых геометрических объектов. Как видите, она состоит из 8234 треугольников.
Теперь создайте плоскость таких же размеров и расположите ее над высокодетализированым объектом:
Разделите окно 3D вида на две части и в левой выберите UV/Image Editor. Создайте в нем новое изображение с настройками по умолчанию (я только имя указал).
Выделите Вашу плоскость, перейдите в режим редактирования и создайте для нее UV-развертку:
Выделите Вашу высокополигональную модель, а затем удерживая Shift низкополигональную. На вкладке Render в самом низу у Вас находится меню Bake. Выставите для него следующие настройки и нажмите кнопку Bake.
По завершению процесса запекания, у Вас в окне UV/Image Editor должна появится текстура карты нормалей. В моем случае она выглядит следующим образом:
Вот собственно и все!
Чтобы увидеть результат работы данной техники, на панели свойств включите режим отображения GLSL и включите режим отображения текстур:
Теперь создайте для плоскости новый материал с настройками по умолчанию, затем перейдите на вкладку текстур и выставите следующие настройки:
Можете выбрать лампу, перемещать ее в 3D пространстве и видеть, как свет создает тени на плоскости так, как будто-то это вовсе не плоскость, а высокополигональная модель 🙂
Проблема с фаской (bevel) в Blender
Пытаюсь сделать скругленную фаску на одной из граней, но вместо этого получается то, что на скриншоте. При этом, на некоторых других гранях все нормально, а на этой и на нескольких других — нет. С блендером знаком совсем недавно, прошу объяснить простым языком, что не так. Спасибо
Голосование за лучший ответ
Тебе не нужно выделять грани, тебе нужно выделить ребра, которые будут скругляться. То есть выдели только одно кольцо из ребер и нажми Ctrl+B 0.1 Enter
потом F6 и установи через меню нужные параметры фаски.
MrVintageПрофи (598) 6 лет назад
Извиняюсь, ошибся в формулировках, выделяю не грани, а кольцо из ребер, жму Ctrl+B, вытягиваю и получается то, что на скриншоте.
Попробовал сделать так, как описали вы, всё то же самое
blender-3d.ru/forum Мыслитель (7532) Похоже что торец не соединён с трубой. Попробуй удалить двойные вершины и повторить операцию Bevel. Если проблема останется, тогда выложи саму модель.
Прошло уже 3 года, но все-таки. Короче чтобы все работало тебе надо нажать CTRL+A и выбрать apply scale. Этот блендеровский форум тебе всякой фигни насоветовал
Вадим БашкировЗнаток (368) 2 года назад
4 вообще то)
Isty Профи (570) Вадим Башкиров, Когда писал 3 было, хорош что помогло, у самого какое-то время заняло разобраться как это решить)
Вадим БашкировЗнаток (368) 2 года назад
Кстати твой ответ помог
ShaTTleГуру (2924) 2 года назад
Спасибо, дружище! Везде говорят, про исправление нормалей и никто не говорит о том, о чем сказал ты. Помог. Премного благодарен!