В чем разница между bump, normal и displacement? Улучшение текстур с помощью карт нормалей (Normal maps).

💖 Нравится? Поделись с друзьями ссылкой

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

Изначально у нас есть HighPoly модель Box001 (с большим количеством полигонов). У нас стоит задача сделать LowPoly модель, которая будет повторять основные формы заданной модели.

В данном случае хватит всего 14 полигонов что бы сделать основу (Box002 ) для наложения карты нормалей с Box001 .

Настройка визуализации карты нормалей

Выделив Box002, нажимаем на вкладку Rendering/RenderToTexture (горячая клавиша «0»).

Перед нами открылось окно Render To Texture. В параметрах Projection Mapping ставим галочку напротив Enabled , нажимаем Pick… , выделяем HighPoly модель и кликаем Add .

Вокруг объекта появился контейнер проецирования, который надо подогнать так, чтобы в него поместилась вся HighPoly модель. Для этого переходим на вкладку Modify/ Projection/ Cage , нажимаем Reset , если контейнер был автоматически создан с искаженной формой, и изменяем параметры Amount и Percent , увеличивая контейнер до нужного размера.

В окне Render To Texture , в параметрах Output нажимаем Add… Если вы рендерите с помощью Vray , то выберите Vray Normals Map и нажмите Add Elements . Если используете стандартный рендер, то выберите Normals Map.

Есть возможность изменить имя карты (Name ), путь для сохранения карты нормалей (File Name and Type ), тип слота материала (Target Map Slot ), а также размер карты (Width/Height ).

Нажимаем Render и видим результат.

P.S.: Карта нормалей сохраняется автоматически. Стандартный путь сохранения: C:\Users\Документы\3dsMax\sceneassets\images.

Применение карты нормалей к LowPoly модели

Выделяем ранее созданную LowPoly модель.

На панели Modify выбираем модификатор Automatic Flatten UVs, который был создан автоматически в процессе создания карты нормалей. Нажимаем кнопку Open UV Editor… В открывшемся окне выбираем File/SaveUVs… , и сохраняем развёртку.

Открываем редактор материалов MaterialEditor (горячая клавиша М ), создаём материал VRayMtl . В слот Bump выбираем карту Normal Bump .

Заходим в параметры карты Normal Bump. В слот Normal выбираем карту Bitmap , и открываем ранее созданную карту нормалей. Применяем созданный материал к LowPoly модели.

На панели Modify добавляем модификатор Unwrap UVW . Нажимаем кнопку Open UV Editor… В открывшемся окне выбираем File/LoadUVs… и загружаем сохранённую развёртку.

В окне Edit UVWs, в правом верхнем углу, открываем свиток текстур и выбираем созданную нами карту нормалей.

Запустив Render, мы увидим, что LowPoly модель имеет те же детали, что и HighPoly . Детали можно сделать более или менее выраженными, меняя значения параметра Bump в используемом материале.

В статье мы подробно рассмотрим отличия карт bump от normal и displacement.

Вы столкнулись с трудностями при назначении карты bump на 3D-объект? Не переживайте! Многие 3D-художники, которые только начали изучать с 3D-текстурирование, испытывают сложности в этой области, не зная, какой тип карт выбрать: bump, normal и displacement.

Все три типа карт создают дополнительную детализацию на поверхности геометрии. Некоторые из этих деталей «настоящие», другие нет. Итак, попытаемся разобраться, в чем же заключается разница между картами bump, normal и displacement.

Что такое карты bump

Карты bump являются одним из старейших типов карт. И первое, что нужно понять - это то, что bump создает фейковую детализацию. И это правда, поскольку карты bump создают иллюзию глубины на поверхности модели с помощью трюка со светом. Никакой дополнительной детализации при этом не добавляется.

Обычно, карты bump - это черно-белые 8-битные изображения. И это только 256 цветов черного, серого или белого. С помощью этих значений карты bump сообщают 3D-редактору всего 2 вещи: деформировать геометрию вверх или вниз.

Когда значения карты bump близки к 50% серого, с поверхностью геометрии практически ничего не происходит. Когда изображение ярче, ближе к белому, детали выдавливаются на поверхности геометрии. Если изображение более темное, ближе к черному, детали вдавливаются в поверхность геометрии.

Карты bump отлично подходят для создания на поверхности модели мелкой детализации, например, пор или морщин на коже. Кроме того, их сравнительно легко создать в таком 2D-редакторе, как Photoshop, помня при этом, что работать нужно только с черно-белыми цветами.

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

Что такое карты normal

Карты нормалей или normal-карты - это улучшенные карты bump. Normal-карты, как и карты bump, создают фейковую детализацию, не добавляя дополнительных деталей геометрии в сцене. В результате, карты нормалей создают на поверхности модели иллюзию детализации, но эта детализация в корне отличается от той, которую создают карты bump.

Как мы уже знаем, карты bump используют черно-белые цвета, чтобы вдавливать или выдавливать поверхность геометрии. Normal-карты работают с RGB-информацией, которая точно отвечает X, Y и Z значениям в 3D-сцене. Эта RGB-информация сообщает 3D-редактору точное направление нормалей каждого полигона поверхности. Ориентация нормалей поверхности, которые часто называются просто нормалями, сообщает 3D- редактору, в какой цвет окрасить тот или иной полигон.

Normal-карты бывают двух типов и выглядят совершенно по-разному в 2D-пространстве.

Наиболее распространенным типом карт нормалей являются normal-карты типа tangent space, которые зачастую сочетают в себе лиловый и синий цвета. Этот тип карт нормалей лучше всего подходит для мешей, которые должны деформироваться при анимации. Normal-карты типа tangent space идеально подходят для персонажей. Для объектов, которые статичны и не испытывают деформаций, больше подходят карты нормалей типа object space. Эти карты окрашены в различные цвета и просчитываются немного быстрее normal-карт типа tangent space.

При использовании карт нормалей нужно понимать несколько моментов. В отличие от bump’а эти карты сложнее создать в 2D-редакторе типа Photoshop. Запекаются normal-карты с хайпольного меша на лоупольный. Однако, есть несколько путей их редактирования. Например, возможность редактирования карт нормалей представлена в MARI.

Кроме того, normal-карты лучше других вписываются в большинство пайплайнов. Но в отличие от карт bump в этом правиле есть исключение. И касается оно мобильного геймдева, поскольку аппаратные средства начали «понимать» карты нормалей сравнительно недавно.

Что такое карты displacement

Когда же дело доходит до создания дополнительной детализации для лоупольных мешей в игру вступают карты displacement, которые способны творить чудеса. Карты displacement создают физическую детализацию меша, на который они назначаются. Для создания displacement’а меш необходимо подразделить несколько раз или тесселировать, чтобы разрешения хватило для создания реальной геометрии.

Карты displacement выгодно отличает то, что их можно запечь с хайпольного меша или нарисовать вручную. Карты displacement, как и карты bump, работают с черно-белыми значениями цветов. При этом с легкостью можно использовать и 8-битные карты displacement, но лучший результат можно получить с помощью 16- или 32-битных карт displacement. И, хотя, 8-битные карты displacement лучше выглядят в 2D-пространстве, в на рендере они могут вызвать странные артефакты и пр. из-за недостаточной информации.

А вот что касается времени просчета, то тут все далеко не так круто. Создание дополнительной детализации в режиме реального времени достаточно трудоемкий процесс, с которым 3D-редактор справится не быстро. Кроме того, большинство 3D-редакторов просчитывают displacement уже на рендере. По сравнению с картами bump и normal карты displacement могут серьезно сказаться на времени рендера.

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

Одновременное использование всех карт

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

Наверно все слышали (да и видели), такие игры как Doom III, Far Cry, Bloodrayne, и задавались вопросом «Как они смогли добиться такой реалистичности моделей?». Пару лет назад некоторые журналисты заявляли, что Джон Кармак планировал использовать модели персонажей от 500.000 до 1.000.000 полигонов. Люди, писавшие это, просто не понимали с чем имеют дело. Такие высокополигональные модели используются, но не напрямую в игре, а для создания карты нормалей (normals map).

Введение:

1. Для начала немного терминов.

1.1. О нормалях.

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

1.2. О карте нормалей (normals map).

Обычное освещение (в Direct3D или OpenGL) использует значения нормалей для расчета освещения в вершинах, освещение же в точках между вершин получается линейной интерполяцией значений, вычисленных в вершинах. Normal map позволяет избавиться от интерполяции и выполнять расчет освещения не повершинно, а попиксельно.

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

2 Основная часть работы.

2.1. Начало.

Определимся с тем, какой софт нам нужен для выполнения поставленной задачи:
3DS Max;
Adobe Photoshop;
плагин Texporter для 3dsmax (http://www.cuneytozdas.com/software/3dsmax/#Texporter);
программа для 3д дизайнеров - NVIDIA Melody (http://developer.nvidia.com/object/melody_home.html);
плагин NormalMapFilter для Photoshop;
плагин *.dds экспорта для Photoshop;
плагин NormalMapFilter.

Что нужно будет моделировать:
high полигональная модель головы (количество полигонов значения не имеет, чем больше, тем лучше);
low полигональная модель головы (это непосредственно модель, которая будет использоваться в игре; количество полигонов – столько, сколько позволит ваш движок)
ВНИМАНИЕ: (ОЧЕНЬ ВАЖНЫЙ МОМЕНТ) – модели должны быть строго подобны! Как это обеспечить, будет рассмотрено ниже.

2.2. Убиваем двух зайцев (как из одной модели получить две).

Так как нам нужно 2 подобные модели (low и high), почему бы нам не сделать сначала high, а потом оптимизировать ее в low. Так и поступим. Для этого используем метод моделирования с помощью сплайнов и патчей, подробно описанный в книге Кима Ли "3DS Max для дизайнера". Удобство моделирования в сплайнах/патчах нам подходит больше всего по той причине, что такой моделлинг позволяет получить на выходе модель любой сложности.


В итоге мы и получим требуемые low и high модели, имеющие общие ключевые точки и отличающиеся между собой только количеством полигонов (а следовательно и детальностью проработки).

3. Текстурирование и расчет карты нормалей.

3.1. Текстурирование.

Итак, в нашем распоряжении есть модель человеческой головы, выполненная в двух вариантах: low и нigh.


High модель можно временно спрятать, она нам в ближайшее время не понадобиться.

Теперь приступаем к работе над low моделью. Применяем модификатор UVW map, или Unwrap UVW, кто как больше привык, и готовим модель к текстурированию. После того как вы проделали эту процедуру, примените к модели утилиту Texporter (по желанию, если вы опытный текстурщик, то можете обойтись и без нее), полученную текстуру наложите на модель, и проверьте, нет ли сильных искажений.


Модель с текстурой, полученной с помощью Texporter и текстурная развертка.

ВНИМАНИЕ: разрешение стороны текстуры должно быть кратно степени 2 (256х256, 512х512 … и т.д.),
ВНИМАНИЕ: карта нормалей будет размещена точно так же, как вы настроили текстурные координаты в UVW map.

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

4. Работа с картой нормалей и diffuse текстурой.

4.1 Программа для 3д дизайнеров - Melody (NVIDIA media tool).

Установите Melody. Полученные ранее модели теперь нужно загрузить в эту программу. Melody - многофункциональный софт, предназначенный для работы с моделями (оптимизация, создание LOD-ов, и т.д.), но нас в данном случае интересует расчет карт нормалей (Generate Normal Map). Итак, жмите кнопку Load Working Model и загружайте low модель. После того как вы это сделаете, появится вторая кнопка - Load Reference Model, жмите ее и загружайте high модель. Далее должно появиться вот такое окно:


Теперь пришло время заняться настройками. Жмем кнопку Normal Map Settings, и перед вами появляется следующее окно:


О настройках следует сказать несколько слов.

Normal map filename. Этот пункт, в общем-то, не должен вызвать сложностей, просто укажите место куда сохранить текстуру (карту нормалей).

Generate Texture Coordinates for normal map. В этом пункте вас просят указать текстурные координаты которые будут использованы для расчета карты нормалей. Melody может сам создавать текстурные развертки (Generate normal map texture coordinates ), этот способ вполне подходит для простых объектов, но в нашем случае лучше воспользоваться текстурной разверткой, которую мы создали в 3DS Max (см. пункт 3.1). Для этого выберите Use decal texture coordinates . Затем укажите размер требуемой текстуры width -x- height. Остальные настройки оставьте без изменений. Закрывайте это окно и в основном меню жмите кнопку Generate Normal map . Если все было сделано правильно, вы увидите на экране следующее:



А вот так выглядит полученная карта нормалей на 3д модели:


4.2. Diffuse map (текстура модели) или "шкура"(skin).

После того как получена карта нормалей, следующим шагом будет создание «шкуры». Поступаем следующим образом: Грузим фотошоп, в качестве шаблона берем карту нормалей и поверх нее рисуем «шкуру». ВНИМАНИЕ: При рисовании шкуры не злоупотребляйте рисованием теней, их можно только слегка обозначить. Готовая текстура должна быть освещена равномерно, функцию теней возьмет на себя карта нормалей.


Теперь остается совместить «шкуру» и карту нормалей.


5. Детальная обработка. Использование NormalMapFilter.

Модель головы с картой нормалей и шкурой готова, но вам хочется внести мелких деталей которое будут реагировать на освещение (шрамы, родинки и т.д.). Добавим нашей голове три страшных шрама на левой стороне лица. Для этого воспользуемся Фотошопом и специальным плагином - NormalMapFilter (NVIDIA). Этот плагин помогает без особых усилий создавать плоские карты нормалей. Он широко используется в формировании текстур для скал, древесины, ландшафта и т.п. Им то мы и воспользуемся. Вот как это работает в теории:


За основу (как и в случае рисовании «шкуры») берем карту нормалей. Чтобы сосредоточить внимание читателя на деталях, я рассмотрю этот момент на укрупненном фрагменте. Как я сказал выше, мы будем добавлять шрамы на левой стороне лица. Откройте в фотошопе «шкуру», выделите все, скопируйте и вставьте из буфера в файл с картой нормали. Затем добавляем слой (Layer 2) и заливаем его белым цветом, и (Layer 1) в нем рисуем маску шрама.


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


Следующий шаг: склеиваем все слои (перед этим отключить слой «шкуры» и карты нормали). У вас должна получиться черная маска шрама на белом фоне. Теперь можно применить плагин Normal map Filter. Варьируйте параметры height generation , чтобы получить требуемую интенсивность (высоту/глубину), тут можно экспериментировать, как вам нравится, можно сделать шрам выпуклым или наоборот вдавленным. Полученное изображение скопируйте и вставьте из буфера в файл с картой нормали. Затем удалите (можно использовать select color range, fuzziness ~ 60%) фиолетовый цвет (RGB 128.128.256). Теперь склейте слои. Вот что примерно должно получится:


А вот так это выглядит в итоговом варианте:


Заключение.

Вот, в общем-то, и все, как видите, чего-то суперсложного в этом нет. Если сразу не получится, пробуйте еще, начните с более простых моделей (например, со сферы или куба).

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

Теория

Но для начала немного теории с Википедии:

Normal mapping - техника, позволяющая изменять нормаль отображаемого пикселя основываясь на цветной карте нормалей, в которой эти отклонения хранятся в виде текселя, цветовые составляющие которого интерпретируются в оси вектора , на основе которого вычисляется нормаль, используемая для расчета освещенности пикселя. Благодаря тому, что в карте нормалей задействуются 3 канала текстуры, этот метод дает большую точность, чем Bump mapping, в котором используется только один канал и нормали, по сути, всего лишь интерпретируются в зависимости от «высоты».

Карты нормалей обычно бывают двух типов:

object-space - используется для не деформирующихся объектов, таких как стены, двери, оружие и т. п.

tangent-space - применяется для возможности деформировать объекты, например персонажей.

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


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

Ну как-то так, объяснил как мог, своими словами.

Практика

Ну и собственно сам метод избавления от плоскости и придание объёма текстуре. Нам понадобятся:

Графический редактор Paint.net (Неплохая программа, весит мало, всегда юзаю сам)

Итак-с начнём.

Нам нужна карта нормалей (normal map, нормал мап, фиолетовая текстура ) именно от той текстуры которую мы хотим улучшить. Обычно в файлах игры она называется точно так же как и обычная, но с окончанием "_nor", "_no", "_n". В некоторых играх она бывает практически прозрачной и,одновременно, радужно-разноцветной как в Battlefield 2. Открываем её в paint.net.

Делаем её чёрно-белой комбинацией клавиш Ctrl+Shift+G или же нажимаем вкладку Коррекция Сделать чёрно-белым

На этом этапе нам нужно осознать правильно ли придан объём. Если, к примеру, это карта нормалей от текстуры одежды, то можно обратить внимание на карманы, швы где одна часть одежды должна быть немного выше, а карманы выпуклыми. Зачастую приходится инвертировать цвета, но это не всегда и это надо "почувствовать нутром". Если вы, вдруг, прозевали с моментом то скорее всего текстура в конце проделанной работы станет светлее прежнего и модель будет выделяться на общем фоне. Инверсия цветов происходит комбинацией клавиш Ctrl+Shift+I или всё в той же вкладке Коррекция Инвертировать цвета .

Всё, мы подготовили само улучшение. Теперь нам нужно открыть улучшаемую текстуру (color map, колор мап, текстура ) и создать новый слой комбинацией клавиш Ctrl+Shift+N или через вкладку Слои Добавить новый слой . Внимание: нам хватит одного нового слоя. У нас должно быть только два слоя.

Теперь меняем свойства этого слоя. Клавишей F4 или через вкладку Слои Свойства слоя... В появившемcя окошке на нужен режим смешивания "Перекрытие " и нажимаем ОК .

Теперь переключаемся на подготовленное улучшение и копируем её последовательностью действий: Выбираем всё комбинацией клавиш Ctrl+A и, собственно, копируем комбинацией Ctrl+C . Переключаемся на улучшаемую текстуру, выбираем новый слой который мы подкорректировали (если вдруг по каким-то причинам он не выбран) и вставляем то, что скопировали, в этот слой комбинацией клавиш Ctrl+V . И мы сразу заметим улучшение.

Попробуйте почувствовать разницу:

Теперь объединяем наши слои комбинацией клавиш Ctrl+M или во вкладке Слои Объединить со следующим слоем. И сохраняем нажав иконку дискеты перезаписывая файл или же через вкладку Файл Сохранить как.. и задав новое имя файлу. Иначе вы сохраните его как незаконченный проект программы, а не в привычном нам формате PNG/BMP.

В принципе на этом всё. Если модель состоит нескольких подмоделей (например модель человека – из головы, ног и туловища), то придётся и их текстуры улучшить данным способом. После этого запихать/заменить текстуры в файле формата.txd через TXD Workshop или другой подобной программы и запихать её в игру.

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

Рассказать друзьям