Normal Map по полочкам. Техническая сторона.
Skorpionchik 5422

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

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

Редактирование нормалей позволяет расширить возможности моделирования. К примеру плоскую поверхность можно сделать визуально фигурной либо наоборот.

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

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

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

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

Таким образом Normal Map коллосально расширяет возможности детально прорабатывать относительно "легкие" модельки. Однако возникает вопрос, как эту нормалку получить.

Самый верный и правильный способ, это "запекание" с более детальной модели. Процесс запекания кодирует нормали с хайполи модели в координаты RGB, учитывая так же нормали самой лоуполи, так называемая "компенсация".

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

Для корректного запекания нужна хорошая UV мапа. Основное правило простое, все харды (или грани между группами сглаживания) обязательно должны иметь разрез на UV, иначе будет виден шов. Можно запечь на модель с одной группой сглаживания и забить на швы в нужных местах, но тогда нормалка будет с жуткими градиентами (та самая компенсация нормалей лоуполи) что в дальнейшем обязательно вылезет боком. Чем меньше градиенты на нормалке, тем с ней легче работать. При подготовле лоуполи нужно настроить группы сглаживания, сделать разреры ЮВ по нужным граням, и уже потом продолжать резать по необходимости. 

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

При загрузке нормалки нужно обязательно учитывать гамма коррекцию (sRGB) Для нормалки она не используется.

Normal Map имеет два формата: OpenGL и DirectX, которые различаются направлением зеленого канала. Потому обязательно учитывайте какой формат используется вашим рендер движком. Во всех современных движках есть параметр, флипающий зеленый канал без использования сторонних редакторов.

На этом все. Вопросы приветствуются, при необходимости могу дополнить статью или написать новую.

Творческих успехов всем!

Комментарии (34)

+10
SNikon
Если можно - то с примерами как правильно нарезать по готовой модели перед запеканием --- можно на простых примерах без мазахизма !
0
Dipfrot
Здравствуйте. Просто разворачиваете модель в любом удобном для вас приложении. В максе выделяете модель и применяете скрипт UVW_to_SG он автоматически разобьёт ваши шелы на разные группы сглаживания. Вот собственно и всё ваша модель готова к запеканию. Скачать скрипт можете по ссылке https://drive.google.com/file/d/1InO0DLn-wTApldoL_c4-x4wPZ_gsRw3d/view?usp=sharing 
+5
IntroBuck
Хорошо бы на явном примере показать процесс (пукич) запечке в сабстенсе или марме
+1
Graphicus
да, было бы замечательно урок с примером!
0
Disah
Вопрос, как повернуть уже готовую нормал мапу на 90° так, чтобы ориентация осталась без изменений (зеленый сверху, фиолетовый снизу)
Для создания нормал мапов из текстур пользуюсь Crazy bump. У того же разработчика есть маленькая програмка для поворота нормал мапов CrazyBump Normals Transformer, но работает не всегда корректно и текстуры с большим разрешением 4K не переваривает.
+1
Skorpionchik
Сабстанс дизайнер может переворачивать, там есть нода для этого, но все равно возможны мелкие проблемы на швах, погрешность изза размера пикселя. Технически это можно сделать и в фотошопе, меняя красный и зеленый канал местами и инвертируя один из них, в зависимости от направления вращения, но это уже костыли, проще перебейкать повернув ЮВ.
+6
ViTcore
повренуть RGB на 90CCW , поменять местами красный и зеленый каналы, зеленый канал инвертировать.
повренуть RGB на 90CW , поменять местами красный и зеленый каналы, красный канал инвертировать.
+1
vladimir.drobzhev90
в частности в короне есть опции разворота нормали в карте normal map, если поиграть с галочками в настройках flip x, flip y
+1
Uraken
Почему в короне нужно почти всегда ставить галку "коррект гамма" в нормалях?
+3
-NiK-
Потому что bitmap texture грузит их в гамме 2.2 если не был выставлен оверрайд. Коррект гамма это и компенсирует.
0
Action-sen
Можно не ставить эту галку, а просто при загрузке нормалмапы ставить оверрайд гаммы 1.0. По сути то на то и выходит. Просто галку поставить удобнее, чем менять гамму, особенно, если драгндропаешь текстурки в матэдитор не используя диалогового окна загрузки.
0
Uraken
естессно.
+3
color_bleed
На мой взгляд, вы еще больше запутываете пользователей.

Есть правильные записи что координаты нормали XYZ записываются в RGB.

Но в остальном - что Вы такое пишите?!

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

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

Д и много нечитабельного "жаргона".
0
Skorpionchik
В 3д графике нормаль не всегда перпенликуляр, как я уже показал выше на примере. Так же на том же примере видно как нормали формируют группы сграживания, на последнем плейне с клеткой.
Но Вы можете опровергнуть мое утверждение, предоставив свое верное)
Я постарался выразитсья понятным обычному человеку языком.
+1
-NiK-
Не знаю, что конкретно имел в виду color_bleed, но если придираться, то скорее группы сглаживания формируют направление нормалей, а не наоборот. Иными словами, направление нормалей не меняет группы сглаживания, но группы сглаживания могут менять нормали.
Не думаю, что это вообще важно читателям поста. Тем более пост не об этом.
+2
Skorpionchik
Понятие групп сглаживание абстранктное, это придумано просто для удобства. Так же как полигоны, треугольники и прочее. 3д модель стостоит только из вертексов. Вот к примеру OBJ файл простого плейна.

v 0.000000 0.000000 0.000000
v 4.000000 0.000000 0.000000
v 0.000000 0.000000 -4.000000
v 4.000000 0.000000 -4.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 1.000000 1.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 1.000000 0.000000

Четыре координаты вершин, четыре координаты UV и четыре нормалей. Ни груп сглаживания, ни треугольников тут нет. Может быть еще вертекс колор, как еще один параметр вертексов.
Но это уже если слишком глубоко копать, и подавляющему большинству пользователей это не требуется.
+1
-NiK-
Вы лишь показали формат obj, где конечно никаких групп сглаживания нет.
Я говорил не об этом. Я лишь сказал, что нормали НЕ формируют группы сглаживания в 3дмаксе. Давайте не путаться в проф.терминологии, раз уж вы её активно используете. Но это если придираться :)

Если продолжить придираться, то разумеется никакая 3д модель не состоит только из вертексов. Фейсы описаны в любом формате, они представляют из себя набор тех самых вертексов.
Если из этого вы делаете вывод, что фейсов не существует, то можете пойти дальше и сделать вывод, что вертексов тоже не существует, ведь существуют только их координаты :) Так можно дойти до абсурда.
+1
Skorpionchik
Но формат обж может сохранять группы сглаживания, используя лишь координаты вершин и нормалей. Я привел в пример обж, так как он незакодированный, обычные несжатые координаты, которые легко посмотреть блокнотом.
И я все еще настаиваю на том, что группы сглаживания формируются нормалями.
0
-NiK-
Хорошо. Тогда возьмите чайник, назначьте одним поликам группу 1, другим 2. Это будут именно "группы сглаживания", не характер поверхности, не гладкость, именно смусгруппы.
После чего накиньте edit normal и делайте с нормалями что вам заблагорассудится. Потом это можно сколлапсить и посмотреть на группы сглаживания полигонов. Они все еще будут 1 и 2. И да, они уже не будут формировать "характер поверхности" как раньше.

Смусгруппы формируют нормали в максе, но не наоборот. Вы можете и вручную настраивать эти нормали. А при назначении определенной смусгруппы макс пересчитывает нормали этих полигонов соответствующим образом, вот и всё.
Наверное, мы говорим об одних и тех же вещах разными словами. Видимо, под группой сглаживания вы понимаете не как таковую группу сглаживания макса, а некую группу полигонов, которые выглядят сглаженными. Чтож, я не против такого общего определения, но для меня смусгруппа это 32битный флаг на полигоне :)
+1
Skorpionchik
Группы сглаживания сугубо максовское понятие. Вы сами верно подметили что изменив нормали визуально поменяются и группы сглаживания, хоть в параметрах они сохранятся. Так же можно одну группу сглаживания нормалями разбить на несколько. При экспорте/импорте в сторонний формат все группы слетят и пересчитаются заново.
С появлением в максе хард/софт эджей смысл смусгрупп пропал, разве что для удобного быстрого выделения, но мы сейчас говорим именно о шейдинге, отображению характера поверхности.
0
-NiK-
Ну я в принципе так и думал, что вы всё знаете, просто своеобразно называете вещи.
А вот формат обж я бы вам рекомендовал пролистать до самого низа ;)
0
vladimir.drobzhev90
Сам тоже прочитал с большим интересом, но так нифига не понял в итоге) Это как смотреть как в детективных фильмах кто-то делает "очевидные" умозаключения и ты такой "ну ок"))
+7
fartt
Ребята, вы настолько умные, что я даже не понимаю о чем вы)
+5
-NiK-
Не переживайте, возможно мы и сами не понимаем :)
+3
fartt
Странно, но это даже радует))
0
Anzur
А я бы посоветовал тебе говорить лишь за себя. Он то определенно понимает о чем говорит, этот скромный парень не сказал, что работал с такими студиями, как Infinity Ward, Sledgehammer Games, которые разрабатывают одну из самых успешных игровых франшиз в мире, а именно Call of Duty. Так что, мы с другом сидели и с улыбкой на лице читали, как ты советовал ему, Lead Artist-у, быть точнее в проф терминалогии ))) Хотя ты имеешь право высказывать свое мнение, но блин раскидываться советами )))
0
-NiK-
Конечно я тоже могу ошибаться (как и лид артист, наверное), но не могли бы вы указать где конкретно я ошибаюсь?

Если речь о смусгруппах, то в общем смысле автор прав, а в контексте 3дмакса не очень. Выходит мы рассуждали в разных контекстах. Его профессиональным качествам я оценку не давал, а последнее сообщение и вовсе было шуткой.
0
Anzur
Зато у вас мощные скрипты)) Жаль Autodesk не добавляет наработки энтузиастов в стандартную сборку, при этом выплачивая за лицензию автору определенную сумму. Помню один чувак через MCG сделал скрипт круче чем плагин Floor Generator. Но он был выполнен в версии 2017, и уже в 2020 и 21 он не запускался.
+1
zuleika
С языка сняли, но у меня глаз задергался ещё на первых сообщениях, я даже остальное не стала читать, чтоб не заплакать)))))
0
Anna_2791
Хорошая статья! Ждём ещё)))
0
Anzur
Хотел бы спросить у автора, вам не разрешают в вашем портфолио опубликовать работы из Modern Warfare? Некоторые моделлеры ведь уже публиковали.
+1
Skorpionchik
У Активижн очень сложная и продолжительная процедура получения разрешения на публикацию, потому в этот раз я решил не заморачиваться.
0
Anzur
Случайно не вы делали модель М4 Assult Rifle из этого проекта?
0
Skorpionchik
Не я.