что такое нормали в blender
Правильное создание карты нормалей в Blender
Карта нормалей — это такая текстура, которая позволяет за счет игры света эмулировать дополнительные (не существующие изначально) детали на 3d модели. В данном случае мы будем переносить подробный вид модели со скульпта на низкополигональный меш, который сделали в прошлом посте. Разумеется, с решением встречающихся на этом пути проблем с нормалями, черными линиями и прочей непотребщиной.
Введение в карты нормалей
Гораздо проще понять о чем речь, посмотрев на вот эту картинку:
Тут изображен стрит-арт художника, который использует эмуляцию цвета тени для создания оптической иллюзии объема на плоской дороге. То есть, по факту деталей нет, там плоская дорога, но если цвета настроены правильным образом — человеческий глаз начинает видеть иное.
Карта нормалей делает то-же самое с текстурой низкополигональной модели, что позволяет отразить на ней ранее не заметные или не существующие детали. Такие как вены на руках, уточненные уголки губ или морщины и прочее, улучшить детализацию ушей, глаз, носа. Если вы не помните, то созданный в прошлом посте низкополигональный меш выглядит не самым лучшим образом.
Такой меш имеет высокую производительность за счет низкой детализации и подходит для мобильных игр, в которых очень важна малая детализация. Но он выглядит очень плохо. Карта нормалей же позволяет, сохранив такую низкую детализацию(3000 полигонов) и производительность, передать, тем не менее, все элементы оригинальной модели в точности. Так делают в большинстве современных игр, в том-же World of Warcraft, к примеру.
Подготовка среды в Blender
У вас изначально должен быть включен Cycles Renderer и задана хоть какая-то текстура для модели. Так-же должна быть сама модель + ее 3d скульпт или иной высокополигональный объект, с которого мы будем считывать нормали. Обе модели должны находиться в центре, с точным наложением друг на друга. У низкополигональной модели уже должна быть UV развертка.
Теперь создадим файл текстуры для нашей карты нормалей.
Делается это в UV/Image Editor’е, который я разместил слева вверху.
Чем больше размер карты нормалей, тем более качественно передаются детали и тем больше она потребляет видеопамяти. Вполне достаточно 1024 пикселей, но вы можете сделать и 4к текстуру, если хотите, все равно весить она будет очень мало.
Теперь надо в Node-Editor’е добавить нашу текстуру как нормаль используя шейдер NormalMap.
Добавьте примерно такую цепочку шейдеров:
Важно при этом задать пространство Tangent для карты нормалей и выбрать UV пространство из выпадающего списка. Далее стоит выбрать текстуру из выпадающего меню ту, которую мы создали выше.
И не забыть выставить тип данных на Non Color Data.
Создание карты нормалей
Теперь мы готовы срисовать карту нормалей с высокополигонального меша и автоматически применить ее на низкополигональный объект. В правом меню Blender’а найдите внизу вкладку Bake(Запекание, если я не ошибаюсь) и выберите там тип Normal.
Выглядеть по умолчанию это будет вот так:
Тут у нас немного кривые настройки и с этими настройками карта сайта будет иметь кучу черных артефактов и прочих сюрпризов. Я, когда первый раз создавал карту нормалей, был просто в шоке от творящегося безумия. Поиски в интернете решений, к сожалению ничего не дали, поэтому я пишу этот пост. В частности бесили черные бугры на объекте и прочие явления. Сейчас покажу, вы сами можете это увидеть, если выделите в Outliner’е сначала высокополигональный объект, а потом его ремеш, вот так:
А потом нажмете на кнопку Bake. Результат будет таким:
Тут вы видите черные полосы в тех местах, где два меша пересекаются и дополняют друг друга. К тому же сама карта нормалей выглядит как оранжево-зеленое непотребство, коим она быть не должна. Карта нормалей в обычном виде имеет сине-фиолетовые оттенки.
К счастью, решение этим проблемам было мной найдено посредством множественных проб и ошибок. Надо выставить для запекания настройку Cage с более-менее большим цифровым значением. Вот так:
Если теперь нажать на кнопку Bake все пойдет как надо.
Теперь все почти идеально, как вы видите карта нормалей запеклась в точности так, как мне было нужно и это привело к тому, что модель обрела наконец рельеф и форму, сохранив при этом малое количество полигонов. Для сравнения:
Как вы видите все спорные детали были сглажены и идеально подогнаны, за счет правильной игры теней, всего-лишь.
Так-же улучшена детализация ушей, шеи, пальцев и прочих элементов, хотя они и остались квадратными по контуру:
Хотя отдельные мелкие косяки все-же остались. Связаны они с… да шут его знает с чем связаны, они просто есть. Вот например, пальцы ног:
А вот аналогичная проблема на руках.
Так-же она имеется в ноздрях носа.
К счастью стандартные инструменты Blender’а позволяют решить такую проблему.
Уточнение карты нормалей
Для уточнения карты нормалей мы будем использовать встроенный в Blender режим Texture Paint. Чтобы его включить щелкните по шейдеру карты нормалей, а потом в главном окне Blender’а перейдите в TexturePaint mode.
В итоге нас перебросит в режим рисования выбраной(NonrmalMap) текстуры. Рисовать мы, ясное дело, ничего не будем. А будем Использовать кисть Smear, то есть смешивания. Выбрать ее можно в списке кистей.
Дальше просто водим ей по артефактам. Вот так выглядит стопа после обработки.
Таким-же точно методом правим остальные проблемные места.
Скачать
Вот в общем-то и все секреты, которые я хотел вам поведать. Скачать файл проекта вы можете ниже. Файл проекта находится в папке Blends. Лицензия — Creative Commons.
Blender, 1000 мелочей
Базовые приёмы работы с Blender версии 2.79.
Общее
Типы выбора геометрии:
Кнопка в редакторе на панели сверху справа отвечает за используемый рендер. По умолчанию там выставлен Blender Render, но желательно его вовсе не использовать и переключать на Cycles Render. При этом у материалов, света и ещё некоторых настроек понадобится нажать кнопку Use Nodes.
Включение Use Nodes:
Режимы отображения:
Для стандартного режима solid в менюшке справа в графе Shаding можно включить маткапы, для удобства. Это специальный шейдер, применяющийся сразу на всю геометрию в кадре и не влияющий на итоговый рендер. Обычно маткап стоит включать при скульпте, для большей наглядности.
Ещё несколько кнопок на главной панели отвечают за смещение, поворот и размер объектов (можно тащить за ось или за центр). В Blender большинство возможностей продублировано горячими кнопками (и для быстроты стоит преимущественно пользоваться ими). Для вышеупомянутых функций выбраны такие горячие кнопки: G (переместить), если после этого нажать кнопку нужной оси (X, Y или Z), то перемещение пойдёт по ней. R (поворот). S (общий размер).
Основные действия:
Чтобы смесить объект на фиксированное расстояние можно нажать G, затем (не двигая мышкой), букву нужной оси и в конце набрать число пунктов, на которое нужно передвинуть объект. То есть должна получится запись вида «GX20» или «GZ+100» или «GY-2» или «GX3.25» и так далее. Сдвигая в положительном направлении оси «+» можно не писать.
При добавлении примитивов, слева тоже появляется окошко их предварительной тонкой настройки, которое исчезнет, если начать совершать прочие действия. Например, для цилиндра можно выставить количество боковых граней, кроме радиуса и высоты.
Параметры при добавлении:
Горячие клавиши на цифровой клавиатуре управляют перспективой и видами. Numpad 5 переключает между ортографическим и перспективным режимом камеры. Numpad 7 выставляет вид сверху и так далее.
Объекты на сцене освещены общим фоном (background), а также источниками света. Цвет и сила первого настраивается во вкладке с синим кружком (World). У источников освещения есть специальная вкладка с настройками, появляющаяся когда они выбраны.
Даже если в сцене нет источников света, она освещается фоном (если не убрать его силу на 0)
Изменение размеров всего объекта пропорционально растягивает и геометрию, которую он содержит. В то время как увеличение/уменьшение геометрии в режиме редактирования не меняет размеры самого объекта. Следить за этим не всегда нужно, но при работе с физикой и точными масштабами полезно помнить, что сам по себе объект это просто пустышка, и чаще всего ожидается, что она будет единичного размера (тогда множитель её размера не меняет размер того, что внутри).
Перенос центра объекта к курсору:
Редактирование
Можно не пользоваться опциями в Tools, запомнив нужные сочетания клавиш, но на первых порах эта вкладка (и пара вкладок пониже) пригодятся
Иногда требуется выделить либо удалить подобные разрезы. Для этого можно отметить несколько точек разреза и обратиться к меню Select, выбрав Edge Loop. Теперь разрез можно двигать или удалить, нажав Delete и указав нужный вариант.
Горячая кнопка I (i) создаёт грань/грани внутри выделенной области, после чего можно отрегулировать размер.
Клавиша Delete позволяет выбирать способы удаления геометрии. Что-то можно убрать совсем, что-то растворить/объединить.
Иногда при экспорте модель может неправильно затеняться. Скорее всего дело в неправильных нормалях. Включить отображение нормалей можно в подразделе Mesh Display, вытянув окно справа. Во вкладке Shading окна слева есть способы правки нормалей.
Для создания заполняющих граней (рёбер) по точкам используется клавиша F. Если выделен замкнутый контур, то по Alt F можно сделать автозаполнение его треугольными гранями.
Чтобы отделить элемент геометрии в отдельный объект, нужно выделить его и нажать P, выбрав вариант Selection.
Трудности и «глюки», возникающие у новичков в программе Blender, и как их преодолеть
Blender это замечательный бесплатный 3d пакет, который делает возможным и доступным осуществление гигантского количества проектов, и, как человек, прошедший путь от абсолютного новичка в 3d до преподавателя данной программы в учебном центре «Специалист» в Москве, я могу поделиться несколькими типами, которые помогут преодолеть несколько несложных, но каверзных моментов, которые хоть и очень просты, но далеко не очевидны, и могут заставить просидеть несколько часов в поиске решения проблемы.
Перевод программы и подсказок
Для того чтобы активировать подсказки, если они не работают, нужно зайти в меню Edit-Preferences-Interface. Поставить галочку напротив Tooltips.
Для активизации перевода подсказок в том же разделе открываем выпадающее меню Translation, ставим русский язык, и галочку напротив Affect Tooltips.
Забагивание области просмотра
Находится эта функция в меню View-Frame selected.
Clipping
устраняется заходом в боковое меню нажатием кнопки N, и во вкладке view в выпадающем меню view, уменьшаем значение Clip Start (Например 0,001)
Нормали
-Нормали это вектор перпендикулярный плоскости полигона, который указывает блендеру куда ему отражать свет. Направлен этот вектор только в одну сторону, то есть если нормаль вашего полигона развернута внутрь объекта, как часто случается в blender, то из за этого у вас будут проблемы на каком-то этапе работы.
Развернуть нормали нам помогут функции Mesh-Normals-Flip (или recalculate outside)
Также мы можем выделить все полигоны объекта (шорткат А) и нажать Recalculate outside чтобы blender автоматически пересчитал все наши полигоны наружу.
За направлением нормалей лучше следить.
Двойные вертексы
Карты нормалей
Проблема в том что карты нормалей, в вышеперечисленных, и не только, программах, запекаются c использованием DirectX, а blender работает с OpenGL. Если говорить простым языком то нам нужно развернуть зеленый канал на карте нормалей. Делается это следующим образом:
Надеюсь, что данный пост поможет людям, осваивающим блендер, проскочить несколько часов поиска решения проблем!
Запекание карты нормалей из материала в Cycles
Если вы когда-либо пытались запечь нормали в Blender, используя движок рендеринга Cycles, вы, вероятно, замечали следующее поведение: процесс запекания использует только информацию о геометрии меша и игнорирует вариации нормалей, созданные вашим материалом. Это означает, что если вы используете карту нормалей и/или карту рельефа, то они не будут учитываются.
Если мы подумаем об этом, это не должно быть достаточно удивительно: поскольку Cycles основан на системе нодов, мы можем создавать материалы с бесконечным числом комбинаций, мы можем даже использовать одну карту нормалей для диффузного шейдера, а другую для глянцевого шейдера. Он обеспечивает полную свободу творчества… но это также означает, что Cycles не может определить, какая часть вашего материала связана с вычислением нормалей. Таким образом, инструмент запекания не имеет другого выбора, кроме как полностью игнорировать эффекты, созданные вашим материалом, когда вы выбираете тип запекания Normal.
Слишком большая свобода приводит к разочарованию! На самом деле, запекание нормалей, включая эффекты материала действительно полезны по крайней мере по двум причинам:
Несмотря на то, что это не так просто, вы, все-таки, можете создать карту нормалей, включая эффекты от вашего материала в Cycles. Я нашел несколько способов позволяющих добиться этого. Все они, насколько я могу судить, являются математически правильными (иначе итоговая карта нормалей создавала бы немного иной эффект, нежели исходный материал). С моей точки зрения, наиболее эффективным способом было создание специальной группы нодов в Cycles. Я назвал ее normal to map. В этой статье я покажу, как работать с этой группой нодов и обосную ее математическую сторону.
Если вы просто хотите использовать normal to map, вы можете загрузить blend-файл. Файл содержит очень простой пример и саму группу нодов. Этот файл лицензируется под CC0 1.0 Universal, поэтому вы можете свободно использовать эту группу для своих собственных целей.
Далее в этой статье, я буду предполагать, что вы знакомы с Blender, Cycles и инструментом запекания в Blender.
Как использовать группу normal to map
Группа normal to map предназначена для запекания информации о нормалях вашего материала в карту нормалей. Поэтому вы должны добавить ее непосредственно перед процессом запекания и затем удалить из своего материала.
Входной слот Normal соответсвует тому же входу, что и у стандартных BSDF-шейдеров, и он является нормалью, которую вы хотите запечь. Есть два выходных слота: цвет sRGB и Non-color. Вы должны использовать тот же выход, что и цветовое пространство текстуры, которую вы запекли. По умолчанию Blender создает текстуру в цветовом пространстве sRGB.
Я рекомендую вам использовать формат Non-Color: требуется меньше вычислений (не применяется гамма-коррекция), поэтому вы избежите некоторых проблем округления при расчетах. Вы можете изменить цветовое пространство вашей текстуры на панели свойств в редакторе UV/Image.
Пошаговая инструкция использования группы normal to map:
Группа создает соответствующие цвета для представления информации о нормалях. Поэтому вы должны использовать шейдер Emission, как если бы объект излучал информацию о них. Поскольку чистый шейдер Emission не подвержен влиянию светлячков и отскокам света, вы можете использовать всего-лишь один сэмпл для рендеринга. Это означает, что процесс запекания экстримально быстрый!
Улучшение производительности
Создание одной карты нормалей для замены части материала может дать интересные улучшения. Рассмотрим изображения ниже. Для левой части в материале тела используется карта нормалей, карта рельефа и процедурная текстура для генерации дополнительных вариаций нормалей. Для правой части я запек все вышеперечисленный текстуры в одну карту нормалей с помощью группы Normal to map. Я сохранил результат в файл и создал гораздо более простой материал, используя запеченную карту нормалей.
В таблице ниже приведены некоторые данные о визуализации:
Материал | Время рендеринга | Пик используемой памяти |
---|---|---|
Оригинальный материал | 16:03 | 1371 Mб |
Запеченная карта нормалей | 13:55 | 350 Mб |
Для данной модели использование более простого материала оказывает значительное влияние на производительность!
Известные проблемы
Из-за внутренних вычислений вы можете получить незначительные изменения между исходными нормалями, и вычисленными с помощью группы нодов Normal to map. Поскольку эти отличия минимальны, они совершенно незаметны.
Группа Normal to map сильно зависит от вращения и масштаба вашей модели. Не забудьте применить эти преобразования перед запеканием.
Самая раздражающая проблема исходит не от самой группы, а от процесса запекания. Если вы внимательно посмотрите на два изображения выше, они покажутся вам идентичными… но это не так! Если вы откроете эти изображения на отдельных вкладках при 100%-ом разрешении и будете переключаться между ними, вы заметите странный эффект: некоторые детали, похоже, скользят по поверхности! Посмотрите на гифку ниже, чтобы увидеть этот эффект:
Мне потребовался день, чтобы убедиться в том, что этот эффект не был создан группой Normal to map! На самом деле проблема связана с трансформацией карты рельефа в карту нормалей. Если обобщить, карта рельефа хранит информацию о высоте, в то время как карта нормалей сохраняет изменение высоты. Это означает, что если текстура содержит три пикселя для отображения карты рельефа, каждый пиксель представляет собой разную высоту. Для достижения такого же результата с помощью карты нормалей текстура должна содержать не менее двух пикселей для кодирования изменения высоты. Из-за этого мы и получаем небольшой сдвиг между картой рельефа и картой нормалей.
Поэтому, когда мы хотим преобразовать информацию о карте рельефа в информацию о карте нормалей, мы получаем смещение информации на финальной текстуре. Один из способов избежать этого — использовать текстуру с более высоким разрешением для окончательного запекания. Но это не всегда желательно.
Поэтому, если вы планируете использовать группу Normal to map, держите в голове этот нюанс, особенно если вы создаете рендер модели крупным планом.
Как работает группа Normal to map
В этом разделе рассказывается о том, что происходит под капотом. Вам не нужно понимать эту часть для использования группы. Но если вас интересует математика, давайте начнем с карты нормалей.
Очевидно, что карта номралей не имеет ничего общего с цветом! Текстура нормалей — это изображение, и мы можем открыть его в редакторе изображений. Но это не изображение, потому что каждый пиксель (или, точнее, каждый тексель) не является цветовой информацией: это информация о нормалях.
Что такое нормаль? Нормаль — это вектор, перпендикулярный поверхности. Почему это так важно? Потому что нормаль используется, чтобы определить, где находиться лицевая сторона грани, а где тыльная. Что еще более важно, нормаль используется практически в любом шейдерном ноде. Например, чтобы определить, как свет отскакивает от поверхности. Если мы можем изменять ориентацию нормали, то, тем самым мы можем изменить способ отражения света, создать поддельные царапины и имитировать не существующую геометрию. Это и есть то, для чего используется карта нормалей.
Текстура нормалей содержит направления нормалей, учитывая исходные их направления (0,0,1). Это означает, что координаты должны быть в касательном пространстве. И в этом суть: Cycles представляет информацию о нормалях в мировом пространстве. Чтобы запечь карту нормалей, нам нужно преобразовать вектора нормалей из мирового пространства в касательное пространство. Итак, мы должны выполнить следующую операцию:
Где Nws — вектор нормали в мировом пространстве (тот, который создается материалом), M — матрица преобразований из мирового пространства в касательное пространство, а Nts — вектор нормали в касательном пространстве (тот, который мы хотим получить). Матрица трансформации M представляет собой матрицу 3×3, составленную в линию касательным вектором, бикасательным вектором и исходным вектором нрмали грани:
Cycles обеспечивает нас касательным вектором и вектором нормали для текущей грани. Мы можем легко вычислить бикасательным вектор как перекрестное произведение вектора нормали и касательного вектора. Однако Cycles не поддерживает матричные операции, но мы можем легко разложить эти операции:
И создать набор нодов для выполнения вычислений:
Все это могло бы быть намного проще, если бы нод Vector Transform работал с касательным пространством… может быть интересным улучшением в будущем.