Ошибки запекания карты нормалей

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

Хард-софт эджи

Hard Edge — жесткая грань между двумя плоскостями. В 3ds Max используется подход Smoothing Groups. Для создания жесткого эджа достаточно назначить на плоскости разные группы сглаживания.

Soft edge — гладкая грань. Чтобы создать ее в 3ds Max, на плоскости нужно назначить одинаковые группы сглаживания.

Чтобы грани запеклись как надо, пользуйся правилом «Hard edge — UV seam»: для каждой жесткой грани лоуполи модели нужно создавать шов на UV. Иначе детали и грани запекутся некорректно.

На выделенной грани расположен hard edge, но не сделан разрез на UV. В результате — артефакт.

На выделенной грани расположен hard edge и сделан разрез на UV — угол запекся корректно.

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

На маленьком цилиндре правило «Hard edge — UV seam» нарушено, поэтому там появился артефакт. На большом цилиндре все правильно.

Градиенты

Градиенты на 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!

Время на прочтение
9 мин

Количество просмотров 28K

image

Часть 1: что такое карты нормалей и как они работают

Часть 2: как запекаются карты нормалей

Часть 3: типы карт нормалей

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

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

Проблема: на рёбрах модели присутствуют «чёрные линии» или «вставки»

image

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

image

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

Здесь есть более подробное объяснение, но на практике правило довольно простое: когда на модели есть резкое ребро, нужно отделять в UV соединённые им грани.

Проблема: карта нормалей выглядит СОВЕРШЕННО неправильно, особенно под некоторыми углами

Эта проблема может возникать по множеству причин. Давайте обсудим некоторые из них:

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

    image

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

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

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

    В таком случае сравните lowpoly в обоих приложениях и если они отличаются, то попробуйте изменить параметры импорта/экспорта, используемые форматы файлов (файлы obj теряют информацию о нормалях) и проверьте совместимость своей программы с настраиваемыми нормалями.

Проблема: как мне создать карту нормалей острого конуса?

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

image

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

image

Этот цвет на 50% красный, на 50% зелёный и на 100% синий, и он не меняет направления нормалей карты нормалей касательного пространства, поэтому можно использовать его для удаления деталей в местах с неудачной проекцией.

Острый конус — это просто пример одного из случаев, когда карты нормалей могут не решить ваших проблем. Важно здесь помнить, что в некоторых случаях карта нормалей не является наилучшим решением, её возможности ограничены и мы не можем ожидать, что они будут вести себя так, как нам нужно, в любой ситуации. Иногда мы тратим много времени, пытаясь заставить работать карту нормалей, когда можно было бы просто добавить деталей в diffuse-текстуру или в lowpoly, а не пытаться передать деталь при помощи карты нормалей.

Проблема: детали на моей модели выглядят вывернутыми.

Это очень распространённая проблема, и её можно наблюдать во многих видеоиграх, даже AAA-уровня.

Как мы видели в этом туториале [перевод на Хабре], карты нормалей — это текстуры, использующие зелёный, красный и синий каналы для изменения способа отражения света от поверхности модели, когда он падает соответственно сбоку, сверху и спереди модели (помните, что это упрощённое объяснение и оно верно не на 100%).

image

Проблема в том, что некоторые приложения считают, что зелёный канал должен показывать модель как освещённую снизу, а другие считают, что он должен показывать модель как освещённую сверху. Иногда это называют «правостороннесть карты нормалей» (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. В таком случае мы теряем детали и карта нормалей имеет области плоского цвета.

image

Решение: зависит от того, как программа запекания позволяет управлять расстоянием запекания:

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

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

Проблема: карта нормалей имеет искажённые детали

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

image

Решение: я более подробно писал об этой теме в другом туториале [перевод на Хабре], но в целом решения бывают такими:

  • Сгладьте острый угол, добавив фаску (bevel).
  • Преобразуйте ребро острого угла в резкое ребро (hard edge)/разделите грани на разные группы сглаживания (smoothing group).
  • Используйте настраиваемые нормали (custom normals)/весовые нормали (weighted normals).

Проблема: карта нормалей выглядит пикселизированной или содержит полосы

Earthquake (AKA бог карт нормалей) написал очень хорошее объяснение этой проблемы.

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

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

image

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

Решения:

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

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

    image

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

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

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

    image

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

Проблема: на отдельных частях модели заметны пиксели

Очевидным решением будет увеличение UV-«острова» (island) этой части модели или использование более крупных текстур, но давайте рассмотрим и менее очевидные решения:

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

    image

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

  • Можно накладывать UV islands друг на друга, чтобы они использовали одинаковую информацию карты нормалей на разных частях модели. Просто переместите одну сторону модели на 1 единицу за наружу UV-пространства, чтобы программа запекания не пыталась получить детали с обеих сторон одновременно.

    Можно пойти ещё дальше и использовать в некоторых деталях trim-текстуры или декали для оптимизации использования текстур.

  • Текстуры используют сетку пикселей, а пиксели квадратны. Если какие-то детали образуют линию, попробуйте выровнять эту линию горизонтально или вертикально. Благодаря этому выровняются сетка пикселей и детали текстуры:

    image

    image

Проблема: моя модель симметрична, но с разных сторон карта нормалей отличается.

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

Ещё одна возможная причина — триангуляция: при импорте моделей в игровой движок они всегда триангулируются и иногда этот процесс может изменить нормали lowpoly, а по диагоналям граней lowpoly могут появиться артефакты. Чтобы избежать этого, триангулируйте модель перед запеканием, запеките карту нормалей, а затем примените модификатор симметрии.

Кроме того, вы можете изучить небольшой туториал Earthquake, который помог мне немного больше понять нормали вершин и карты нормалей.

Дополнительную информацию о картах нормалей можно узнать из wiki сайта Polycount.

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

Хард-софт эджи

Hard Edge — жесткая грань между двумя плоскостями. В 3ds Max используется подход Smoothing Groups. Для создания жесткого эджа достаточно назначить на плоскости разные группы сглаживания.

Soft edge — гладкая грань. Чтобы создать ее в 3ds Max, на плоскости нужно назначить одинаковые группы сглаживания.

Чтобы грани запеклись как надо, пользуйся правилом «Hard edge — UV seam»: для каждой жесткой грани лоуполи модели нужно создавать шов на UV. Иначе детали и грани запекутся некорректно.

На выделенной грани расположен hard edge, но не сделан разрез на UV. В результате — артефакт.
На выделенной грани расположен hard edge и сделан разрез на UV — угол запекся корректно.

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

На маленьком цилиндре правило «Hard edge — UV seam» нарушено, поэтому там появился артефакт. На большом цилиндре все правильно.

Градиенты

Градиенты на 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!

image

Часть 1: что такое карты нормалей и как они работают

Часть 2: как запекаются карты нормалей

Часть 3: типы карт нормалей

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

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

Проблема: на рёбрах модели присутствуют «чёрные линии» или «вставки»

image

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

image

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

Здесь есть более подробное объяснение, но на практике правило довольно простое: когда на модели есть резкое ребро, нужно отделять в UV соединённые им грани.

Проблема: карта нормалей выглядит СОВЕРШЕННО неправильно, особенно под некоторыми углами

Эта проблема может возникать по множеству причин. Давайте обсудим некоторые из них:

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

    image

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

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

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

    В таком случае сравните lowpoly в обоих приложениях и если они отличаются, то попробуйте изменить параметры импорта/экспорта, используемые форматы файлов (файлы obj теряют информацию о нормалях) и проверьте совместимость своей программы с настраиваемыми нормалями.

Проблема: как мне создать карту нормалей острого конуса?

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

image

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

image

Этот цвет на 50% красный, на 50% зелёный и на 100% синий, и он не меняет направления нормалей карты нормалей касательного пространства, поэтому можно использовать его для удаления деталей в местах с неудачной проекцией.

Острый конус — это просто пример одного из случаев, когда карты нормалей могут не решить ваших проблем. Важно здесь помнить, что в некоторых случаях карта нормалей не является наилучшим решением, её возможности ограничены и мы не можем ожидать, что они будут вести себя так, как нам нужно, в любой ситуации. Иногда мы тратим много времени, пытаясь заставить работать карту нормалей, когда можно было бы просто добавить деталей в diffuse-текстуру или в lowpoly, а не пытаться передать деталь при помощи карты нормалей.

Проблема: детали на моей модели выглядят вывернутыми.

Это очень распространённая проблема, и её можно наблюдать во многих видеоиграх, даже AAA-уровня.

Как мы видели в этом туториале [перевод на Хабре], карты нормалей — это текстуры, использующие зелёный, красный и синий каналы для изменения способа отражения света от поверхности модели, когда он падает соответственно сбоку, сверху и спереди модели (помните, что это упрощённое объяснение и оно верно не на 100%).

image

Проблема в том, что некоторые приложения считают, что зелёный канал должен показывать модель как освещённую снизу, а другие считают, что он должен показывать модель как освещённую сверху. Иногда это называют «правостороннесть карты нормалей» (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. В таком случае мы теряем детали и карта нормалей имеет области плоского цвета.

image

Решение: зависит от того, как программа запекания позволяет управлять расстоянием запекания:

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

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

Проблема: карта нормалей имеет искажённые детали

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

image

Решение: я более подробно писал об этой теме в другом туториале [перевод на Хабре], но в целом решения бывают такими:

  • Сгладьте острый угол, добавив фаску (bevel).
  • Преобразуйте ребро острого угла в резкое ребро (hard edge)/разделите грани на разные группы сглаживания (smoothing group).
  • Используйте настраиваемые нормали (custom normals)/весовые нормали (weighted normals).

Проблема: карта нормалей выглядит пикселизированной или содержит полосы

Earthquake (AKA бог карт нормалей) написал очень хорошее объяснение этой проблемы.

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

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

image

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

Решения:

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

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

    image

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

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

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

    image

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

Проблема: на отдельных частях модели заметны пиксели

Очевидным решением будет увеличение UV-«острова» (island) этой части модели или использование более крупных текстур, но давайте рассмотрим и менее очевидные решения:

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

    image

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

  • Можно накладывать UV islands друг на друга, чтобы они использовали одинаковую информацию карты нормалей на разных частях модели. Просто переместите одну сторону модели на 1 единицу за наружу UV-пространства, чтобы программа запекания не пыталась получить детали с обеих сторон одновременно.

    Можно пойти ещё дальше и использовать в некоторых деталях trim-текстуры или декали для оптимизации использования текстур.

  • Текстуры используют сетку пикселей, а пиксели квадратны. Если какие-то детали образуют линию, попробуйте выровнять эту линию горизонтально или вертикально. Благодаря этому выровняются сетка пикселей и детали текстуры:

    image

    image

Проблема: моя модель симметрична, но с разных сторон карта нормалей отличается.

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

Ещё одна возможная причина — триангуляция: при импорте моделей в игровой движок они всегда триангулируются и иногда этот процесс может изменить нормали lowpoly, а по диагоналям граней lowpoly могут появиться артефакты. Чтобы избежать этого, триангулируйте модель перед запеканием, запеките карту нормалей, а затем примените модификатор симметрии.

Кроме того, вы можете изучить небольшой туториал Earthquake, который помог мне немного больше понять нормали вершин и карты нормалей.

Дополнительную информацию о картах нормалей можно узнать из wiki сайта Polycount.

Это вторая часть серии туториалов о картах нормалей. Первая часть находится здесь, но для понимания второй части читать её не обязательно.

Общий принцип запекания карты нормалей относительно прост: у нас есть lowpoly-модель с UV-координатами и highpoly-модель; мы переносим информацию о нормалях с highpoly на lowpoly. Благодаря этому lowpoly будет отражать свет так же, как highpoly.

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

Если вы не контролируете нормали вершин lowpoly-модели, то потеряете контроль над картой нормалей.

image

Плохая корреляция карт нормалей

Чтобы контролировать сглаживание lowpoly-модели, нам нужны разделённые (split) нормали вершин (для создания жёстких рёбер) или усреднённые (averaged) нормали вершин (для создания гладких рёбер).

Как оказалось, не все 3D-программы используют для усреднения нормалей вершин одинаковые вычисления. Это значит, что в разных 3D-редакторах lowpoly-модель будет выглядеть иначе, а её нормали вершин будут указывать немного в разных направлениях. Обычно это не представляет большой проблемы, потому что эти отклонения очень малы, но они влияют на внешний вид модели; и эти различия усиливаются при использовании карт нормалей, потому что карты нормалей изменяют нормали lowpoly-модели, которые в разных программах различаются.

image

Индустрия 3D-графики работает над устранением этой проблемы; недавно появился стандарт под названием Mikk space. Это метод вычисления нормалей вершин, который могут использовать все 3D-приложения, чтобы нормали вершин во всех 3D-программах выглядели одинаково. Однако нужно учесть, что пока его используют не все 3D-приложения.

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

Скос деталей карт нормалей

Когда компьютер усредняет направление нормали у нормалей вершин lowpoly-модели, большие изменения в углах поверхности могут «скосить» нормали lowpoly-модели и они больше не будут перпендикулярными поверхности lowpoly.

Your browser does not support HTML5 video.

Так как программа запекания нормалей при поиске деталей highpoly использует направления нормалей lowpoly, то если эти направления будут скошенными, то они будут выглядеть скошенными на карте нормалей:

image

Это очень распространённая проблема, для которой найдено несколько решений. Идеального решения нет, всё зависит от геометрии.

1. В некоторых 3D-программах запекания существует опция повторного запекания (rebaking) этих частей с временным изменением нормалей lowpoly, чтобы они запекались без скоса. Например, такая опция есть в Marmoset Toolbag. Пользователь Reddit под ником Tanagashi любезно объяснил мне, что некоторые программы наподобие xNormal могут тесселировать lowpoly, чтобы добавить новые вершины и сделать нормали перпендикулярными к поверхности lowpoly, запекать карту нормалей в пространстве объекта, а затем преобразовывать её в касательное пространство на основании исходных нормалей lowpoly. С помощью новой карты нормалей программа может создавать маски для управления тем, где использовать исходную карту нормалей, а где созданную из тесселированной lowpoly-модели.

image

2. Добавление вершин сделает переход между нормалями вершин менее скошенным, потому что один угол в 90º будет разделён на несколько меньших градусов, делая второй переход менее скошенным. Очевидно, что это увеличивает количество полигонов, и поскольку вы добавляете геометрию, я рекомендую использовать эти дополнения для создания более интересного силуэта модели.

image

image

3. Разделение усреднённых нормалей вершин (делая ребро жёстким/используя отдельные smoothing groups): таким образом, каждая вершина будет иметь несколько нормалей, каждая из которых перпендикулярна к поверхности lowpoly. Не забывайте, что когда 3D-программа имеет разделённую нормаль вершины, то она на самом деле создаёт дубликат вершины, увеличивая таким образом количество вершин и немного снижая производительность. Кроме того, как мы увидим позже, жёсткие рёбра создают проблему «чёрных рёбер».

image

4. Можно изменять нормали моделей, чтобы изгибать нормали lowpoly, чтобы они были перпендикулярными нормалям highpoly. Помните, что не все программы позволяют использовать изменённые нормали (в Zbrush есть только усреднённые нормали, файлы OBJ и устаревшие FBX не содержат специальной информации о нормалях). По сути, существует два способа изменения нормалей:

  • Взвешенные нормали (Weighted normals): это автоматический метод, похожий на усреднённые нормали вершин. Идея заключается в том, что при усреднении нормалей вершин не все грани должны иметь одинаковую силу: крупные грани «притягивают» к себе нормали вершин сильнее, чем мелкие грани. Благодаря этому крупные грани, которые обычно важнее, будут иметь более качественное проецирование деталей. Особенно хорошо это работает с highpoly-панелями.

    image

  • Собственные нормали (Custom normals): при помощи инструментов из 3D-редактора мы можем изгибать нормали lowpoly. Это относительно новая идея, для реализации которой не существует стандартизированных инструментов. Помните, что изгибание нормалей может создавать очень странное нежелательное затенение в других частях модели, поэтому эта техника обычно комбинируется с фасками (bevels). Некоторые люди называют эту технику «midpoly-моделированием».

    image

Cage/baking distance

По умолчанию, испускаемые с поверхности lowpoly лучи проходят ограниченное расстояние, чтобы lowpoly не получала информацию о нормалях от далёких частей highpoly. Это расстояние обычно называется «frontal/rear distance», потому что лучи могут испускаться по направлению внутрь, наружу, или в обоих направлениях. На рисунке ниже это расстояние показано красным:

image

Некоторые 3D-приложения (например, 3ds Max) также позволяют использовать «клетку» (cage). Cage — это «копия» lowpoly-модели, которую можно модифицировать таким образом, чтобы она идеально заключала в себе highpoly. Также в некоторых случаях (не всегда) она позволяет нам менять направление лучей, не изменяя при этом исходные нормали вершин lowpoly. Это может помочь получит наилучшие граничные случаи запекания и избежать скосов; однако нужно помнить, что мы запекаем, используя не направление вершин нормалей, но в конечном итоге применим карту нормалей для изменения истинных нормалей lowpoly, поэтому результат может выглядеть странно.

image

Швы на рёбрах

Как мы видели, если имеется модель с жёсткими рёбрами (некоторые рёбра имеют больше одной smoothing group, или некоторые рёбра помечены как «hard»), то программа запекания разделяет нормаль вершин между двумя гранями. У этой операции есть хорошие и плохие стороны.

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

Плохо то, что теперь между нормалями существует пробел, и это может означать, что мы можем потерять информацию, если lowpoly имеет пробел в нормалях там, где она не может получить деталей highpoly. Более того, некоторые части проекции lowpoly могут пересекаться и конкурировать за одно UV-пространство. Оба эффекта создают шов вдоль ребра, заметность которого зависит от движка.

image

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

image

image

Заключение

Подготовив lowpoly-модель и сделав её как можно ближе к highpoly-модели, я начинаю работать над сглаживанием перед UV. Я задаю сглаживание для lowpoly (если объект органический, то я начинаю с полностью сглаженной модели, если он имеет твёрдую поверхность, то я задаю угол сглаживания в пределах 30-60º и настраиваю сглаживание, пока результат не будет выглядеть хорошо).

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

Если возникают ошибки со скосами, то я добавляю дополнительные рёбра (обычно я делаю фаски (bevel), чтобы сохранить округлость силуэта). Это срабатывает для большинства моих моделей, но я могу исправлять ошибки со скосами, если использую для запекания Marmoset Toolbag, или применяя собственные/взвешенные нормали.

При наличии ошибок проецирования я изменяю baking distance/cage, модифицирую lopoly/highpoly, чтобы они лучше подходили для запекания, или удаляю карты нормалей на отдельных очень жёстких частях, например, на концах конусов.

Следующая статья будет инструкцией по устранению проблем с запеканием карт нормалей и обсуждением наиболее часто встречающихся проблем и решений.

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

Работа с 3D-графикой


Рекомендация: подборка платных и бесплатных курсов 3D-моделирования — https://katalog-kursov.ru/

image

Часть 1: что такое карты нормалей и как они работают

Часть 2: как запекаются карты нормалей

Часть 3: типы карт нормалей

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

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

Проблема: на рёбрах модели присутствуют «чёрные линии» или «вставки»

image

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

image

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

Здесь есть более подробное объяснение, но на практике правило довольно простое: когда на модели есть резкое ребро, нужно отделять в UV соединённые им грани.

Проблема: карта нормалей выглядит СОВЕРШЕННО неправильно, особенно под некоторыми углами

Эта проблема может возникать по множеству причин. Давайте обсудим некоторые из них:

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

    image

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

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

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

    В таком случае сравните lowpoly в обоих приложениях и если они отличаются, то попробуйте изменить параметры импорта/экспорта, используемые форматы файлов (файлы obj теряют информацию о нормалях) и проверьте совместимость своей программы с настраиваемыми нормалями.

Проблема: как мне создать карту нормалей острого конуса?

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

image

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

image

Этот цвет на 50% красный, на 50% зелёный и на 100% синий, и он не меняет направления нормалей карты нормалей касательного пространства, поэтому можно использовать его для удаления деталей в местах с неудачной проекцией.

Острый конус — это просто пример одного из случаев, когда карты нормалей могут не решить ваших проблем. Важно здесь помнить, что в некоторых случаях карта нормалей не является наилучшим решением, её возможности ограничены и мы не можем ожидать, что они будут вести себя так, как нам нужно, в любой ситуации. Иногда мы тратим много времени, пытаясь заставить работать карту нормалей, когда можно было бы просто добавить деталей в diffuse-текстуру или в lowpoly, а не пытаться передать деталь при помощи карты нормалей.

Проблема: детали на моей модели выглядят вывернутыми.

Это очень распространённая проблема, и её можно наблюдать во многих видеоиграх, даже AAA-уровня.

Как мы видели в этом туториале [перевод на Хабре], карты нормалей — это текстуры, использующие зелёный, красный и синий каналы для изменения способа отражения света от поверхности модели, когда он падает соответственно сбоку, сверху и спереди модели (помните, что это упрощённое объяснение и оно верно не на 100%).

image

Проблема в том, что некоторые приложения считают, что зелёный канал должен показывать модель как освещённую снизу, а другие считают, что он должен показывать модель как освещённую сверху. Иногда это называют «правостороннесть карты нормалей» (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. В таком случае мы теряем детали и карта нормалей имеет области плоского цвета.

image

Решение: зависит от того, как программа запекания позволяет управлять расстоянием запекания:

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

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

Проблема: карта нормалей имеет искажённые детали

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

image

Решение: я более подробно писал об этой теме в другом туториале [перевод на Хабре], но в целом решения бывают такими:

  • Сгладьте острый угол, добавив фаску (bevel).
  • Преобразуйте ребро острого угла в резкое ребро (hard edge)/разделите грани на разные группы сглаживания (smoothing group).
  • Используйте настраиваемые нормали (custom normals)/весовые нормали (weighted normals).

Проблема: карта нормалей выглядит пикселизированной или содержит полосы

Earthquake (AKA бог карт нормалей) написал очень хорошее объяснение этой проблемы.

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

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

image

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

Решения:

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

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

    image

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

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

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

    image

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

Проблема: на отдельных частях модели заметны пиксели

Очевидным решением будет увеличение UV-«острова» (island) этой части модели или использование более крупных текстур, но давайте рассмотрим и менее очевидные решения:

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

    image

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

  • Можно накладывать UV islands друг на друга, чтобы они использовали одинаковую информацию карты нормалей на разных частях модели. Просто переместите одну сторону модели на 1 единицу за наружу UV-пространства, чтобы программа запекания не пыталась получить детали с обеих сторон одновременно.

    Можно пойти ещё дальше и использовать в некоторых деталях trim-текстуры или декали для оптимизации использования текстур.

  • Текстуры используют сетку пикселей, а пиксели квадратны. Если какие-то детали образуют линию, попробуйте выровнять эту линию горизонтально или вертикально. Благодаря этому выровняются сетка пикселей и детали текстуры:

    image

    image

Проблема: моя модель симметрична, но с разных сторон карта нормалей отличается.

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

Ещё одна возможная причина — триангуляция: при импорте моделей в игровой движок они всегда триангулируются и иногда этот процесс может изменить нормали lowpoly, а по диагоналям граней lowpoly могут появиться артефакты. Чтобы избежать этого, триангулируйте модель перед запеканием, запеките карту нормалей, а затем примените модификатор симметрии.

Кроме того, вы можете изучить небольшой туториал Earthquake, который помог мне немного больше понять нормали вершин и карты нормалей.

Дополнительную информацию о картах нормалей можно узнать из wiki сайта Polycount.

На сайте c 26.02.2017
Сообщений: 29

08.12.2017 18:57

Всем привет!

Пытаюсь разобраться с запеканием Normals Map (3ds Max 2017), третий день не могу понять в чем собака зарыта. При чем при запекании других моделей, сделанных на скорую руку из бокса, сферы, плейна или цилиндра, никаких проблем не возникает. Почему не получается с этой моделью, не пойму.Подскажите, в чем может быть загвоздка.

На сайте c 23.09.2009
Сообщений: 7396
Киев

08.12.2017 19:06

Ну группы сглаживания же отпечатались. Я бы вот такие сделал — 

Одну группу на верхушку и на боковухи тоже разные группы. Возможно, на боковухи тоже можно одну группу, там угол меньше 90 между ними, но не уверен. И ещё на каждую группу сглаживания — своя развёртка, так вроде делают. Тоесть длинную полоску боковух побить на 6 отдельных кусков. Но тоже не уверен)

На сайте c 26.02.2017
Сообщений: 29

08.12.2017 19:08

Цитата DoCentttt:

Ну группы сглаживания же отпечатались.

те, что отпечатались, надо в отдельные ГС определить или наоборот все в одну ГС?

з.ы. Сорри, твоя картинка не сразу появилась, поробую как ты посоветовал, спасибо!

DoCentttt ,

а UV-развертку делать до ГС или после, глупый наверное вопрос, но я уже так замудохался разными вариантами…smiley-smile.gif

з.ы. Опять, не дождался окончательного ответа и задал вопрос, сорри)))

На сайте c 23.09.2009
Сообщений: 7396
Киев

08.12.2017 19:13

Цитата Cobalt-70:

UV-развертку делать до ГС

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

Цитата Cobalt-70:

не дождался окончательного ответа

Нет, это у меня мода такая дурная. Порциями выдавать)

На сайте c 25.02.2009
Сообщений: 2341
Kyiv

08.12.2017 21:00

Карта нормалей печется с нормалей хайполи на нормали лоуполи, у Вас какая лоуполи, такая и нормалка получается.

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

На сайте c 26.02.2017
Сообщений: 29

08.12.2017 21:37

Спасибо!

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

Может я что не так делаю, хотя, конечно не так, иначе получилось бы.

В общем назначил ГС, сделал uv-развертку, не стал сшивать, оставил по группам сглаживания. Накинул Турбосмуз с галкой «по группам сглаживания», по-разному настраивал кейдж, но в результате всегда получается подобный результат:

На сайте c 16.03.2016
Сообщений: 2094
Москва

09.12.2017 13:20

Группа сглаживания должна быть одна на весь объект. Развёртка — чем меньше швов тем лучше.

1. Max

2 SD

Лоуполи гайка без нормалмап

normal map

Финал

На сайте c 25.02.2009
Сообщений: 2341
Kyiv

09.12.2017 19:05

Цитата dontpiter:

Группа сглаживания должна быть одна на весь объект. Развёртка — чем меньше швов тем лучше.

Прошу прощения, но Вы не правы)

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

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

На сайте c 26.02.2017
Сообщений: 29

10.12.2017 14:55

Цитата Skorpionchik:

Прокомментируй,  плз, эту картинку. Почему на правой нет острых углов (что и требуется), а на левой есть? Хотя вроде как и твой и мой нормал мапы похожи? Я вообще запутался.

На сайте c 20.02.2017
Сообщений: 1468
Ижевск

10.12.2017 16:39

Слева лоуполи с наложенной нормал мап, справа — хайполи.

На сайте c 26.02.2017
Сообщений: 29

10.12.2017 17:22

Цитата Mirfen:

Слева лоуполи с наложенной нормал мап, справа — хайполи.

smiley-shok.gif Так и должно было получится?!. smiley-shok.gif

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

Но углы же видны на боковой грани

На сайте c 20.02.2017
Сообщений: 1468
Ижевск

10.12.2017 17:49

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

Сам месяц назад экспериментировал.

Геометрией — довольно много полигонов:

Поверхность из одного полигона с нормал мап:

На сайте c 26.02.2017
Сообщений: 29

10.12.2017 18:59

Mirfen,

чего только не перепробовал, а результат одинаковый, не пойму в чем дело…

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

лоуполи перед запеканием


группы сглаживания

uv-развертка
результат, слева лоуполи с нормал мап, справа хайполи

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

На сайте c 25.02.2009
Сообщений: 2341
Kyiv

10.12.2017 19:46

Цитата Cobalt-70:

Цитата Mirfen:

Слева лоуполи с наложенной нормал мап, справа — хайполи.

smiley-shok.gif Так и должно было получится?!. smiley-shok.gif

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

Но углы же видны на боковой грани

Конечно на силуэте вы будете видеть грани лоуполи модели, так как нормал не сглаживает сетку. Можно добавить сечений, и будет плавнее, но и поликаунт выше.

На сайте c 26.02.2017
Сообщений: 29

10.12.2017 20:02

Цитата Skorpionchik:

Конечно на силуэте вы будете видеть грани лоуполи модели, так как нормал не сглаживает сетку. Можно добавить сечений, и будет плавнее, но и поликаунт выше.

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

На сайте c 20.02.2017
Сообщений: 1468
Ижевск

10.12.2017 20:25

Цитата Cobalt-70:

Мне это не для игр надо, просто изучаю макс как хобби

В основном для игр и нужен этот приём, так как позволяет уменьшить полигонаж. Я тоже не шибко специалист, кстати. Выше Скорпиончик уже всё описал достаточно подробно. А насчёт того, что не получается — может, просто цель, которую вы поставили перед собой, достигается не нормал мапой? Я вообще нормал мап использую только для бампа.

На сайте c 26.02.2017
Сообщений: 29

10.12.2017 20:47

Mirfen

Видел это урок, как и кучу других. Кстати, вот такая модель, как  в видео у «криворукого» моделлера, получается без проблем.

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

Спасибо за советы.

На сайте c 25.02.2009
Сообщений: 2341
Kyiv

10.12.2017 20:51

Покажите результаты, и Вам быстрее помогут разобраться, покажите скрины хайполи, лоуполи, ЮВ  мапы и финального результата.

На Вашем скрине с рендером нормал мапа имеет инвертированый зеленый канал.

Есть два типа

DirectX — Зеленый канал Y-

и OpenGL — Зеленый канал Y+

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

Вообще Нормал Мап это координаты нормалей, закодированные в RGB (R -> X, G -> Y, B -> Z). Потому когда подгружаете нормал мап, всегда принудительно вырубайте гамма коррекцию.

На сайте c 26.02.2017
Сообщений: 29

10.12.2017 21:42

Цитата Skorpionchik:

Есть два типа DirectX — Зеленый канал Y- и OpenGL — Зеленый канал Y+

Не знаю, правильно ли понял, у меня «Nitrous (Direct3D 11.0 Feature Level 11 -NVIDIA GeForce GTX 465)»

А про гамма-коррекцию я в курсе, включаю.

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

$begingroup$

does anyone know why this is happening to me ?
i tried normals outside, didnt help.

Edit: edited caps, and added photos, sorry new to these boards, thanks in advance :) enter image description here

  • normals
  • baking
  • error

asked Aug 3, 2018 at 17:06

Koocheng's user avatar

$endgroup$

1

  • $begingroup$
    Don’t use caps please, you can edit the question, also upload images inline here as the question totally depends on it. Yellow on normal map usually means intersecting geometry — rays from one surface get to near surface and vice versa
    $endgroup$

    Aug 3, 2018 at 17:10

1 Answer

$begingroup$

answered Aug 4, 2018 at 18:26

Koocheng's user avatar

$endgroup$

$begingroup$

does anyone know why this is happening to me ?
i tried normals outside, didnt help.

Edit: edited caps, and added photos, sorry new to these boards, thanks in advance :) enter image description here

  • normals
  • baking
  • error

asked Aug 3, 2018 at 17:06

Koocheng's user avatar

$endgroup$

1

  • $begingroup$
    Don’t use caps please, you can edit the question, also upload images inline here as the question totally depends on it. Yellow on normal map usually means intersecting geometry — rays from one surface get to near surface and vice versa
    $endgroup$

    Aug 3, 2018 at 17:10

1 Answer

$begingroup$

answered Aug 4, 2018 at 18:26

Koocheng's user avatar

$endgroup$

@akaSpy

Приветствую, коллеги по цеху!

Снова я к вам за помощью, так как косвенно это относится к плагину экспорта и вы в целом больше в теме внутренних особенностей.

В общем, проблема такая. Карту нормалей запёк в Substance Painter. В Substance всё выглядит отлично, в Marmoset тоже. Но в игре (Зов Припяти) имеет такие же ошибки сглаживания (3ds Max с Xoliul Shader):
2018-01-30_20-56-53

Не могу разобраться в чём дело, как только не пробовал запекать. Подскажите, пожалуйста, какие есть варианты? Такое ощущение, что, что-то не то с нормалями.

P.S. Модель сделана в Blender и экспортирована через текущий плагин.

@igelbox

Здравствуй, @akaSpy
По скриншоту сложно сказать в чём проблема.
Было бы полезно посмотреть на blend-файл, object-файл и получившуюся карту нормалей, чтобы хоть как-то понять в чём может быть проблема.
А экспорт же был сделан с использованием Format Version: CS/CoP?

@akaSpy

@igelbox, спасибо, что откликнулся. И извини, что ответил не сразу, был пока не у дел. Я сегодня проведу ещё пару тестов и постараюсь предоставить детальную информацию.

@akaSpy

@igelbox

Пока не могу нормально провести тесты, так как ломается модель.
Сделал тестовую модель, но не могу понять, что с ней происходит в Actor Editor:
2018-02-03_19-09-27-

Похоже на проблему с группами сглаживания, судя по возросшему vertex count. В игре (Зов Припяти) аналогично плохо всё:
2018-02-03_19-14-55

Это как-то решается?

P. S. Сам экспорт модели проходит нормально, при импорте обратно в Блендер модель выглядит корректно.

@akaSpy

@igelbox

Думаю проблема в не правильной Format Version:. У меня, при выставленной Format Version: CS/CoP — нормально в CoP SDK открывает:
image

@akaSpy

@igelbox
Действительно, спасибо! Как же я не догадался попробовать, ведь при импорте та же проблема была. В общем, у меня по какой-то причине эти кнопки перепутаны. Я когда импортировал модель Winchester 1300 из игры, то при выставленном CS/CoP ломались группы, а при SoC норм. При экспорте видимо та же ситуация. Версия плагина 0.4.0 Видимо есть какой-то баг, либо, что-то я неправильно установил.

@akaSpy

@igelbox
По поводу основной проблемы. Подскажи, пожалуйста, передаётся ли tangent space из Blender? Подобные проблемы сглаживания указывают, как раз на то, что не соответствуют tangent space Blender’a и Stalker’a. И как их синхронизировать не могу понять. Кучу разных способов перепробовал, но ошибки сглаживания как были, так и есть.

@igelbox

Я когда импортировал модель Winchester 1300 из игры, то при выставленном CS/CoP ломались группы, а при SoC норм. При экспорте видимо та же ситуация. Версия плагина 0.4.0 Видимо есть какой-то баг

Какая версия игры? Какой конкретно файл импортировался? Чем был сконвертирован из ogf в object?

Подскажи, пожалуйста, передаётся ли tangent space из Blender?

на сколько я знаю, формат object не предоставляет возможности передачи tangent map, т.е. SDK его каждый раз рассчитывает при экспорте в ogf.
Если всё таки есть примеры где он передаётся, напиши — мы реализуем в аддоне.

@akaSpy

Какая версия игры? Какой конкретно файл импортировался? Чем был сконвертирован из ogf в object?

  1. Версия игры — 1.6.02 (Steam-лицензия)
  2. Импортировал файл — wpn_winchester1300_hud.object (скачать). Это не оригинальный из игры, а мой, но он также нормально импортируется только при выборе SoC.
  3. Конвертер не помню от куда скачал, датируется 24-06-2015, конвертируется через converter.exe с помощью .bat-файла.

@igelbox

У меня, при открытии этого файла в CoP SDK, он загружается так же плохо, как и в Blender. Получается — это проблема с converter.exe (что он всегда конвертирует в SoC-овские группы сглаживания).
@PavelBlend, может ты знаешь, каким конвертером правильно преобразовывать модели ЗП.
Но, вообще, думаю можно смело импортировать сконверченные модели с Format Version: SoC, а сохранять для SDK с Format Version: CS/CoP.

@akaSpy

Но, вообще, думаю можно смело импортировать сконверченные модели с Format Version: SoC, а сохранять для SDK с Format Version: CS/CoP.

В том то и дело, что если сохраняешь с Format Version: CS/CoP, то бьются группы сглаживания, а если в SoC, то всё ок :) Магия! Может у меня, что-то локально не так.

Может при импорте куда-то фиксируется в blend-файл? Тот файл, который я выше скидывал, удалось сохранить как CS/CoP, но без битых групп?

@igelbox

Может при импорте куда-то фиксируется в blend-файл?

Навряд ли. Такого в аддоне не было.

Тот файл, который я выше скидывал, удалось сохранить как CS/CoP, но без битых групп?

Да. Импортировал в Blender как SoC и сразу же экспортировал как CS/CoP. Потом открыл получившийся object-файл в SDK и там со сглаживанием всё хорошо.
Версии ПО:
SDK — 0.7
blender-xray — 0.5.0

@PavelBlend

Конвертер бардака всегда сохраняет группы сглаживания в формате SoC, независимо откуда был взят ogf файл (из ТЧ или из ЧН/ЗП).

@akaSpy я скачал твой файл wpn_winchester1300_hud.object, импортировал в blender, потом экспортировал в object в формате CS/CoP, потом сохранил в ogf с помощью SDK 0.7. В итоге в игре модель выглядит так же как в blender:
sg_cop_test

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

И вот blend сцена с исправленным сглаживанием:
fix_sg.zip

@akaSpy

Да. Импортировал в Blender как SoC и сразу же экспортировал как CS/CoP. Потом открыл получившийся object-файл в SDK 0.7 и там со сглаживанием всё хорошо.
@akaSpy я скачал твой файл wpn_winchester1300_hud.object, импортировал в blender, потом экспортировал в object в формате CS/CoP, потом сохранил в ogf с помощью SDK 0.7. В итоге в игре модель выглядит так же как в blender:

Попробую поставить свежую версию плагина, очень странно.

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

@PavelBlend
Дело не в группах сглаживания, они сделаны такими специально для тестирования карты нормалей. В игре карта нормалей по какой-то причине не компенсирует подобное сглаживание, хотя должно. Я предполагаю это из-за не соответствия tangent space. Но как синхронизировать не могу найти решение. Толи вектора из Blender имеют не то направление, то ли ещё чего. Пока нет мыслей.

@akaSpy

@PavelBlend

@akaSpy можешь показать как выглядит карта нормалей?

@akaSpy

@PavelBlend да, я в течении получаса подготовлю модель и карту нормалей, и скину сюда.

@akaSpy

@PavelBlend

@akaSpy я менял группы сглаживания и косяков стало меньше. Может в сталкере карта нормалей не компенсирует сглаживание, а дополняет его. Сквозь карту нормалей проглядываются затенения от групп сглаживания. В оригинальных моделях ЗП на острых углах нет сглаживания. Может так нужно делать и со своими моделями?

@akaSpy

@s30-zip

Так же не забывайте удалять двойные вершины и выворачивать нормали наружу.

@akaSpy

@igelbox
Хочу уточнить, а при экспорте необходимо накидывать модификатор Edge Split, чтобы сохранить группы сглаживания?

Только недавно обратил внимание, что появляется ошибка (про неё я уже прочитал):
Maya-SG incompatible: sharp edge adjacents has same smoothing group
Так вот Edge Split фиксит её.

И вообще как сохранить группы сглаживания?

@akaSpy

@PavelBlend
Подскажи, а как ты экспортишь группы сглаживания? У меня почему-то бьются в AE и в игре соответственно ломается нормалка.

В редакторах:
2018-02-07_20-47-11

В игре:
2018-02-07_20-51-33

Edited: похоже опять проблема с форматом. Не знаю почему, но у меня экспортируется только в SoC нормально.

@PavelBlend

@akaSpy просто нажимаю File>Export>XRay Object и ставлю тип формата (SoC или CS/CoP) и всё.
И никаких модификаторов Edge Split не нужно ставить.

А при экспорте этой модели есть предупреждения Maya-SG incompatible? Может острое ребро преобразовалось в сглаженное. Хотя если это ЗП, то не должно быть такого предупреждения. Только для ТЧ есть определённые ограничения в этом плане.

@akaSpy

@PavelBlend
Понятно, спасибо!

В SoC формате группы сохраняет. Но склеивает вершины и из-за этого бьет группы :(((( Флаг HQ Geometry не помогает. Существуют какие-то лекарства?

2018-02-07_21-06-02

@igelbox

@akaSpy

Хочу уточнить, а при экспорте необходимо накидывать модификатор Edge Split, чтобы сохранить группы сглаживания?
И вообще как сохранить группы сглаживания?

Обычно и без него работает. Но, думаю, он может помогать в сложных случаях (разделяя треугольники, дублируя рёбра), когда текущий меш не представим в формате SoC/Maya. Тут, кстати, есть ишью по этому поводу (если уж очень нужен SoC формат) — #57, но у меня пока мощи не хватает, сделать нормальный алгоритм расчёта.
А в CoP-формате — нет таких ограничений, любые группы сглаживания должны поддерживаться аддоном, безо всяких дополнительных модификаторов.

@akaSpy

@igelbox
Спасибо за ответ! Я честно говоря так и не понял, почему у меня нормально не экспортируется в CoP-формате. Плагин поставил свежий. Может ещё СДК на всякий случай переустановить, странно это всё.

@igelbox

Попробовал открыть модель из Test/raw/sdk/editors/rawdata/meshes/dynamics/weapons/wpn_winchester1300/ из ранее приложенного «Каталог с файлами» в SDK 0.7 — сглаживание сломано, в SDK — 0.4 — склаживание — норм.

Попробовал экспортировать модель из Test/raw/GameTest.blend используя формат CS/CoP — в SDK 0.7 — сглаживание норм, в SDK — 0.4 — склаживание сломано.

Может всё-таки версия SDK — не правильная. У меня, кстати, были похожие проблемы при использовании SDK 0.4: при компиляции OGF ломались нормали и в игре это выглядело как на половине с «original»:
akim
Из-за этого в аддоне и появилась сырая поддержка экспорта в ogf (см. половину с «my (fixed)»).
Сейчас, я тестирую в (откуда я их взял — уже не помню):

  • xray-cop-sdk-setup.exe (версия 0.7) — 467937392 байт — MD5=b4dbf14d8a0731daa80ef9b9ea973f49
  • xray-sdk-setup-v0.4.exe — 328910736 байт — MD5=4b79e90bc978493d0e1e3b3e88dca3bf

Вообщем, попробуй тоже экспортировать с CS/CoP и открыть в SDK для ЗП. Если не получается, то пиши, какой SDK используешь (не думаю, что сюда надо ссылку на пиратские ресурсы постить, может просто описание, как его найти на просторах интернета).

@akaSpy

@igelbox
Ты прав. Я установил чистый официальный SDK 0.7. Что-то было внутри SDK, что ломало весь процесс, либо какие-то файлы от 0.4 версии. С экспортом CS/CoP сглаживание заработало как надо. Правда не сразу. Модификатор Edge Split ломает группы в модели, по крайней мере в промежуточном использовании в *.fbx для запекания карты нормали, развёртки. И меня это сильно путало. Когда отказался от него, всё пошло как надо. Большое тебе спасибо! Наконец-то мои мучения закончились :)

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

Накинул тестовую текстурку:
2018-02-08_12-17-14

@s30-zip

@igelbox

Похоже на то, что вопрос решён. Если что, можно будет переоткрыть эту ишью.

На сайте c 26.02.2017
Сообщений: 29

08.12.2017 18:57

Всем привет!

Пытаюсь разобраться с запеканием Normals Map (3ds Max 2017), третий день не могу понять в чем собака зарыта. При чем при запекании других моделей, сделанных на скорую руку из бокса, сферы, плейна или цилиндра, никаких проблем не возникает. Почему не получается с этой моделью, не пойму.Подскажите, в чем может быть загвоздка.

На сайте c 23.09.2009
Сообщений: 7395
Киев

08.12.2017 19:06

Ну группы сглаживания же отпечатались. Я бы вот такие сделал — 

Одну группу на верхушку и на боковухи тоже разные группы. Возможно, на боковухи тоже можно одну группу, там угол меньше 90 между ними, но не уверен. И ещё на каждую группу сглаживания — своя развёртка, так вроде делают. Тоесть длинную полоску боковух побить на 6 отдельных кусков. Но тоже не уверен)

На сайте c 26.02.2017
Сообщений: 29

08.12.2017 19:08

Цитата DoCentttt:

Ну группы сглаживания же отпечатались.

те, что отпечатались, надо в отдельные ГС определить или наоборот все в одну ГС?

з.ы. Сорри, твоя картинка не сразу появилась, поробую как ты посоветовал, спасибо!

DoCentttt ,

а UV-развертку делать до ГС или после, глупый наверное вопрос, но я уже так замудохался разными вариантами…smiley-smile.gif

з.ы. Опять, не дождался окончательного ответа и задал вопрос, сорри)))

На сайте c 23.09.2009
Сообщений: 7395
Киев

08.12.2017 19:13

Цитата Cobalt-70:

UV-развертку делать до ГС

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

Цитата Cobalt-70:

не дождался окончательного ответа

Нет, это у меня мода такая дурная. Порциями выдавать)

На сайте c 25.02.2009
Сообщений: 2341
Kyiv

08.12.2017 21:00

Карта нормалей печется с нормалей хайполи на нормали лоуполи, у Вас какая лоуполи, такая и нормалка получается.

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

На сайте c 26.02.2017
Сообщений: 29

08.12.2017 21:37

Спасибо!

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

Может я что не так делаю, хотя, конечно не так, иначе получилось бы.

В общем назначил ГС, сделал uv-развертку, не стал сшивать, оставил по группам сглаживания. Накинул Турбосмуз с галкой «по группам сглаживания», по-разному настраивал кейдж, но в результате всегда получается подобный результат:

На сайте c 16.03.2016
Сообщений: 2135
Москва

09.12.2017 13:20

Группа сглаживания должна быть одна на весь объект. Развёртка — чем меньше швов тем лучше.

1. Max

2 SD

Лоуполи гайка без нормалмап

normal map

Финал

На сайте c 25.02.2009
Сообщений: 2341
Kyiv

09.12.2017 19:05

Цитата dontpiter:

Группа сглаживания должна быть одна на весь объект. Развёртка — чем меньше швов тем лучше.

Прошу прощения, но Вы не правы)

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

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

На сайте c 26.02.2017
Сообщений: 29

10.12.2017 14:55

Цитата Skorpionchik:

Прокомментируй,  плз, эту картинку. Почему на правой нет острых углов (что и требуется), а на левой есть? Хотя вроде как и твой и мой нормал мапы похожи? Я вообще запутался.

На сайте c 20.02.2017
Сообщений: 1468
Ижевск

10.12.2017 16:39

Слева лоуполи с наложенной нормал мап, справа — хайполи.

На сайте c 26.02.2017
Сообщений: 29

10.12.2017 17:22

Цитата Mirfen:

Слева лоуполи с наложенной нормал мап, справа — хайполи.

smiley-shok.gif Так и должно было получится?!. smiley-shok.gif

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

Но углы же видны на боковой грани

На сайте c 20.02.2017
Сообщений: 1468
Ижевск

10.12.2017 17:49

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

Сам месяц назад экспериментировал.

Геометрией — довольно много полигонов:

Поверхность из одного полигона с нормал мап:

На сайте c 26.02.2017
Сообщений: 29

10.12.2017 18:59

Mirfen,

чего только не перепробовал, а результат одинаковый, не пойму в чем дело…

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

лоуполи перед запеканием


группы сглаживания

uv-развертка
результат, слева лоуполи с нормал мап, справа хайполи

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

На сайте c 25.02.2009
Сообщений: 2341
Kyiv

10.12.2017 19:46

Цитата Cobalt-70:

Цитата Mirfen:

Слева лоуполи с наложенной нормал мап, справа — хайполи.

smiley-shok.gif Так и должно было получится?!. smiley-shok.gif

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

Но углы же видны на боковой грани

Конечно на силуэте вы будете видеть грани лоуполи модели, так как нормал не сглаживает сетку. Можно добавить сечений, и будет плавнее, но и поликаунт выше.

На сайте c 26.02.2017
Сообщений: 29

10.12.2017 20:02

Цитата Skorpionchik:

Конечно на силуэте вы будете видеть грани лоуполи модели, так как нормал не сглаживает сетку. Можно добавить сечений, и будет плавнее, но и поликаунт выше.

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

На сайте c 20.02.2017
Сообщений: 1468
Ижевск

10.12.2017 20:25

Цитата Cobalt-70:

Мне это не для игр надо, просто изучаю макс как хобби

В основном для игр и нужен этот приём, так как позволяет уменьшить полигонаж. Я тоже не шибко специалист, кстати. Выше Скорпиончик уже всё описал достаточно подробно. А насчёт того, что не получается — может, просто цель, которую вы поставили перед собой, достигается не нормал мапой? Я вообще нормал мап использую только для бампа.

На сайте c 26.02.2017
Сообщений: 29

10.12.2017 20:47

Mirfen

Видел это урок, как и кучу других. Кстати, вот такая модель, как  в видео у «криворукого» моделлера, получается без проблем.

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

Спасибо за советы.

На сайте c 25.02.2009
Сообщений: 2341
Kyiv

10.12.2017 20:51

Покажите результаты, и Вам быстрее помогут разобраться, покажите скрины хайполи, лоуполи, ЮВ  мапы и финального результата.

На Вашем скрине с рендером нормал мапа имеет инвертированый зеленый канал.

Есть два типа

DirectX — Зеленый канал Y-

и OpenGL — Зеленый канал Y+

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

Вообще Нормал Мап это координаты нормалей, закодированные в RGB (R -> X, G -> Y, B -> Z). Потому когда подгружаете нормал мап, всегда принудительно вырубайте гамма коррекцию.

На сайте c 26.02.2017
Сообщений: 29

10.12.2017 21:42

Цитата Skorpionchik:

Есть два типа DirectX — Зеленый канал Y- и OpenGL — Зеленый канал Y+

Не знаю, правильно ли понял, у меня «Nitrous (Direct3D 11.0 Feature Level 11 -NVIDIA GeForce GTX 465)»

А про гамма-коррекцию я в курсе, включаю.

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

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

Работа с 3D-графикой


Рекомендация: подборка платных и бесплатных курсов 3D-моделирования — https://katalog-kursov.ru/

image

Часть 1: что такое карты нормалей и как они работают

Часть 2: как запекаются карты нормалей

Часть 3: типы карт нормалей

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

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

Проблема: на рёбрах модели присутствуют «чёрные линии» или «вставки»

image

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

image

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

Здесь есть более подробное объяснение, но на практике правило довольно простое: когда на модели есть резкое ребро, нужно отделять в UV соединённые им грани.

Проблема: карта нормалей выглядит СОВЕРШЕННО неправильно, особенно под некоторыми углами

Эта проблема может возникать по множеству причин. Давайте обсудим некоторые из них:

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

    image

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

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

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

    В таком случае сравните lowpoly в обоих приложениях и если они отличаются, то попробуйте изменить параметры импорта/экспорта, используемые форматы файлов (файлы obj теряют информацию о нормалях) и проверьте совместимость своей программы с настраиваемыми нормалями.

Проблема: как мне создать карту нормалей острого конуса?

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

image

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

image

Этот цвет на 50% красный, на 50% зелёный и на 100% синий, и он не меняет направления нормалей карты нормалей касательного пространства, поэтому можно использовать его для удаления деталей в местах с неудачной проекцией.

Острый конус — это просто пример одного из случаев, когда карты нормалей могут не решить ваших проблем. Важно здесь помнить, что в некоторых случаях карта нормалей не является наилучшим решением, её возможности ограничены и мы не можем ожидать, что они будут вести себя так, как нам нужно, в любой ситуации. Иногда мы тратим много времени, пытаясь заставить работать карту нормалей, когда можно было бы просто добавить деталей в diffuse-текстуру или в lowpoly, а не пытаться передать деталь при помощи карты нормалей.

Проблема: детали на моей модели выглядят вывернутыми.

Это очень распространённая проблема, и её можно наблюдать во многих видеоиграх, даже AAA-уровня.

Как мы видели в этом туториале [перевод на Хабре], карты нормалей — это текстуры, использующие зелёный, красный и синий каналы для изменения способа отражения света от поверхности модели, когда он падает соответственно сбоку, сверху и спереди модели (помните, что это упрощённое объяснение и оно верно не на 100%).

image

Проблема в том, что некоторые приложения считают, что зелёный канал должен показывать модель как освещённую снизу, а другие считают, что он должен показывать модель как освещённую сверху. Иногда это называют «правостороннесть карты нормалей» (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. В таком случае мы теряем детали и карта нормалей имеет области плоского цвета.

image

Решение: зависит от того, как программа запекания позволяет управлять расстоянием запекания:

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

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

Проблема: карта нормалей имеет искажённые детали

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

image

Решение: я более подробно писал об этой теме в другом туториале [перевод на Хабре], но в целом решения бывают такими:

  • Сгладьте острый угол, добавив фаску (bevel).
  • Преобразуйте ребро острого угла в резкое ребро (hard edge)/разделите грани на разные группы сглаживания (smoothing group).
  • Используйте настраиваемые нормали (custom normals)/весовые нормали (weighted normals).

Проблема: карта нормалей выглядит пикселизированной или содержит полосы

Earthquake (AKA бог карт нормалей) написал очень хорошее объяснение этой проблемы.

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

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

image

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

Решения:

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

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

    image

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

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

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

    image

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

Проблема: на отдельных частях модели заметны пиксели

Очевидным решением будет увеличение UV-«острова» (island) этой части модели или использование более крупных текстур, но давайте рассмотрим и менее очевидные решения:

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

    image

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

  • Можно накладывать UV islands друг на друга, чтобы они использовали одинаковую информацию карты нормалей на разных частях модели. Просто переместите одну сторону модели на 1 единицу за наружу UV-пространства, чтобы программа запекания не пыталась получить детали с обеих сторон одновременно.

    Можно пойти ещё дальше и использовать в некоторых деталях trim-текстуры или декали для оптимизации использования текстур.

  • Текстуры используют сетку пикселей, а пиксели квадратны. Если какие-то детали образуют линию, попробуйте выровнять эту линию горизонтально или вертикально. Благодаря этому выровняются сетка пикселей и детали текстуры:

    image

    image

Проблема: моя модель симметрична, но с разных сторон карта нормалей отличается.

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

Ещё одна возможная причина — триангуляция: при импорте моделей в игровой движок они всегда триангулируются и иногда этот процесс может изменить нормали lowpoly, а по диагоналям граней lowpoly могут появиться артефакты. Чтобы избежать этого, триангулируйте модель перед запеканием, запеките карту нормалей, а затем примените модификатор симметрии.

Кроме того, вы можете изучить небольшой туториал Earthquake, который помог мне немного больше понять нормали вершин и карты нормалей.

Дополнительную информацию о картах нормалей можно узнать из wiki сайта Polycount.

  • Ошибки использования дозирующего ингалятора
  • Ошибки искусственного интеллекта примеры
  • Ошибки ип на усн доходы
  • Ошибки инфинити fx37 на приборной панели
  • Ошибки инфинити fx35 на панели приборов