Тангенциальные карты нормалей для Blender

Материал из Blender3D.

Перейти к: навигация, поиск

Содержание

Введение

Карты нормалей стали популярными последние несколько лет. Оказав значительное улучшение графики в индустрии не только игровой, но также традиционной CG и киноиндустрии, хотя это и менее очевидно. Появились уже новые приложения, имеющие функционал скульптурного моделирования с невероятной детализацией моделей (такие как Zbrush, Mudbox и наш любимый Blender с его знаменитым Sculpt Mode).

Однако такой способ улучшения поверхности модели, как использование карт нормалей освещается, так или иначе, не слишком широко. Blender обладает функцией запекания карт нормалей из пространства камеры с высокополигональных моделей и нанесения этих карт на низкополигональные. (Спасибо UV – текстурированию и Мультиразрешающим поверхностям Multi-resolution meshes.) Однако одна из последних фишек, которая вывела бы Blender на уровень самых высоких стандартов всё ещё не полностью реализована. Эта фишка – Тангенциальные карты нормалей. Если Blender теперь и поддерживает этот тип карт, то запекать их по-прежнему не способен.

Карты нормалей (Normal Maps) против карт неровностей (Bump Maps)

Различные инструменты для различных задач. Нельзя сказать, что один лучше другого. Иногда они даже могут быть объединены или смешаны для достижения лучших результатов. Оба они основаны на НОРМАЛЯХ объекта и это первая вещь к которой мы обратимся.

Что такое нормали?

Нормаль – вектор, перпендикулярный поверхности в заданной точке этой поверхности.

В полигональном моделировании любая сложная поверхность представлена как составная конструкция из простых плоских элементов – фейсов. Поэтому поверхность имеет не одну нормаль, а каждый фейс имеет собственную нормаль. В Blender это легко увидеть если выбрать объект (поверхность), перейти в режим редактирования [Tab] . На панели редактирования (F9) на закладке Mesh Tools 1 отображением нормали «заведуют» 2 параметра. Прежде всего кнопка Draw Normals (Отображать нормали) , которая включает отображение нормалей в виде светло голубых линий , а также слайдер Nsize, который управляет видимой величиной вектора нормали для улучшения просмотра.

image:BA_normals-tools.png

Карты неровностей Bump Maps

Карты неровностей представляют собой не цветные изображения (в градациях серого), которые хранят информацию о величине смещения пикселя изображения при рендеринге вдоль нормали в данной точке. При этом градации цвета карты задают масштаб смещения. Так участки поверхности, соотв. на карте средне-серому (50% серого цвета) не получают смещения и как бы остаются лежащими на базовой поверхности, соответственно максимально чёрные участки получают максимальное смещение вдоль нормали над поверхностью, а светлые – под поверхность. Таким образом карты неровности используются для задания рельефности 3D-поверхности на основе 2D-изображения, моделируя виртуальные неровности и соотв. игру светотени.

image:BA_bump_render.png Справа - чёрно-белое изображение карты бампа, слева - эффект применения

Для задания эффекта неровности нужно присвоить материалу серую карту бампа (это может быть также процедурная текстура, либо цветная, где информация о неровности будет браться на основании канала яркости) в пустой текстурный слот, а затем активировать кнопку Nor в закладке Мар То на панели материала (F5). Слайдер Nor на той же панели служит для управления величиной эффекта.

Кнопка Nor имеет три положения:

  • выкл – данный эффект не просчитывается при рендеринге;
  • вкл (подсвечено белым) – эффект включён для просчёта при рендеринге;
  • вкл (подсвечено желтым) – эффект включён для просчёта, но направление смещения инвертируется (проще говоря на

рендере выпуклости становятся впадинами)

image:BA_mapto_tab_nor.png Панель Мар То с расположенными на ней кнопкой Nor и слайдером.


'А как насчёт карт смещения (Displacement Maps)?

По принципу действия Карты смещения очень похожи на карты бампа. Также используя в основе чёрно-белые карты, они задают смещение вдоль нормали, но просчитывают реальное смещение полигонов, как будто это было смоделировано. Это хороший способ для финальных, хорошо подразделённых мешей. Вы можете помучить модификатор Displace, чтобы понять его получше, но это – вне обзора данной статьи. Ведь карты Бампа и карты нормалей – фактически обманные приёмы для улучшения простых поверхностей, в то время как карты смещения требуют очень подробно смоделированных поверхностей, чтобы быть эффективными вообще.

image:BA_displ_mod.png

Карты нормалей

В случае карт нормалей все векторы нормалей нормализованы (например они имеют одинаковую длину, равную 1 единице) а используемый цвет изображения, говорит о том, как сориентирована нормаль поверхности в данном пикселе изображения. Фактически карта нормали задаёт геометрию поверхности виртуальным вращением направления нормали в данном пикселе. В отличие от карт неровностей эффект карт нормалей хорошо виден даже на не очень- или вообще не блестящих материалах. Чтобы получить эффект карты нормалей нужно присвоить материалу цветную текстуру особого типа, (поскольку требуется специальный инструментарий для генерации Карт Нормалей) в пустой текстурный слот, также как у карт неровностей активировать кнопку Nor в закладке Мар То на панели материала (F5), но кроме того – активировать кнопку Normal Map в закладке Map Image на панели текстур (F6).

image:BA_map_image.png Закладка Map Image панели текстур с активированной опцией Normal Map.


Запекание Карт Нормалей из пространства Камеры в Блендере

С версии 2.43 Blender имеет такую фичу – запекание карт нормалей из пространства камеры в текстуру объекта. Это – только один шаг к правильному использованию карт нормалей в Blender, потому, что пространство камеры имеет ряд ограничений: при запекании фиксируется размер/положение/вращение объекта, относительно вращения/положения/диафрагмы камеры. Поэтому стоит, изменить параметры камеры или анимировать её - нормали получат неверное значение.

Существуют другие типы карт нормалей. Как быть с этим?

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

Запекание же карт нормалей из пространства камеры довольно легко решено. Выберите объект, для которого вы хотите выполнить запекание и сделайте его UV-развёртку в UV-редакторе. Добавьте новое изображение (Меню Image >> Add...) Затем следуйте в меню сцены (F10) . Здесь в закладке Bake выбрать кнопку Normal и нажать кнопку BAKE. Не забудьте сохранить сгенерированную карту нормалей в какой-нибудь графический формат на ваш выбор (по умолчанию .tga, очень удобен .png)


image:BA_baking_tab.png Закладка baking

Конечно, запекание нормалей меша и создание карты для использования с тем же самым мешем бессмысленно. Гораздо полезнее использовать их с мультиразрешающими поверхностями. Например, начинаем с низкополигональной модели. Делаем UV-развёртку, как упоминалось выше. В панели редактирования (F9) находим панель мультиразрешения Multires, Нажимаем Add Multires, Добавляем уровень – Add Level и начинаем скульптурить нашу модель. Когда модель отскульптурена с достаточным уровнем деталей устанавливаем максимальный уровень рендера в закладке Rendering той же панели и выполняем запекание карты нормалей, как описано выше.

image:BA_normal_map.png Пример карты нормалей сгенерированной в Blender опцией Bake по модели с высоким разрешением.

image:BA_normal_map-render.png Пример итогового рендера. Слева направо: Низкополигональная простая модель куба; Высокополигональная модель куба со смоделированными деталями; Низкополигональная модель куба с применённой картой нормалей от высокополигональной модели.


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


Анимация – хорошая иллюстрация того, что карты нормалей, построенные в пространстве камеры непригодны для объектов смещённых или повёрнутых относительно местоположения камеры, так как при генерации карты в ней учитывается положение камеры. К сожалению карты нормалей пространства камеры – единственный тип карт нормалей генерируемый на данный момент Blender.

Карты нормалей пространства объекта более подошли бы для анимированных твёрдотельных объектов. И, наконец только Тангенциальные карты нормалей подходят для любых, в том числе анимированных деформируемых объектов.

Последняя часть статьи – о том как генерировать такие карты с помощью внешних приложений и как пользоваться ими в Blender.

Использование программы DnormGen для получения Тангенциальных карт нормалей

Существует множество бесплатных программ для генерации такого рода карт, многие из них доступны сразу для нескольких ОС. Среди них выделим программу Drag[en]gine Normal Map Generator (DnormGen),обладающий прекрасной поддержкой Blender, доступный для пользователей Windows, Linux и MacOS, и выпускаемый под лицензией GPL v2.0. Ссылка:

http://epsylon.rptd.ch/denormgen.php


Скачиваем нужный дистрибутив. Для Unix и MacOs потребуются доп. библиотеки (libfox1.4, libfox1.4-dev, libpng3, libtiff4, libxmu-dev - несколько примеров), и, возможно зависимости libtiff.so.3 связать с libtiff.so.4 (sudo ln -s libtiff.so.4 libtiff.so.3)

Извлекаем архив и видим исполнительный файл-программу dnormgen и файл скрипта dragengine_dim_export.py. Скрипт помещаем в директорию scripts/ Blender. Много полезной информации можно почерпнуть из прилагаемого файла README.

Скрипт будет работать с двумя моделями. Низкополигональной, которая должна быть названа *.low (в поле ОВ: объекта) и высокополигональной - .hi ( * - оригинальное имя объекта). Эти имена – обязательны для работы скрипта и должны быть заданы в панели редактирования (F9) в закладке Link and Materials. Скрипт будет экспортировать две модели в формат .dim, специфичный для генератора и использовать для получения карт нормалей.

1-й шаг: в Blender

В Blender необходимо до запуска скрипта сделать ряд действий – это переименовать объекты, подразделение высокополигональной поверхности и экспорт двух объектов.

Суть действий такова:

  • 1. Выбираем наш низкополигональный объект и в поле имени ОВ: добавляем ему расширение .low; Присваиваем ему материал, наносим текстуру, выполняем UV-развёртку и добавляем новую текстуру в UV/Image Editor (Image >> New...) Которую нужно сохранить (Image >> Save или Image >> Save As)
  • 2. Выбираем высокополигональный объект и в поле имени ОВ: добавляем ему расширение .hi;
  • 3. Применяем модификатор подразделения поверхности Subsurf к нашему высокополигональному объекту(минимальный уровень подразлеления -1(Если вы не хотите менять форму объекта выберите из списка метод простого подразделения Simple Subdiv , взамен сглаживающего Catmull-Klark).
  • 4. Выберите два объекта – один низко- и один высокополигональный.
  • 5. Перейдите в одном из окон в режим текстового редактора Text Editor. Откройте файл скрипта dragengine_dim_export.py в редакторе (File >> Open).
  • 6. Запустите скрипт, поместив курсор мыши в текстовом окне и нажав Alt – P. Задайте имя для экспортируемого .dim-файла или оставьте по умолчанию.

Это действия,которые необходимо проделать в Blender. Теперь у нас есть .dim-файл с которым можно работать уже в программе DnormGen.

2-й шаг: В DnormGen

Запускаем DnormGen и видим два разных окна:

  1. DE Normal Map Generator: Это окно позволяет просматривать 3D модели и конфигурировать необходимые типы карт (Карта смещения, карта нормалей, тангенциальная карт нормалей, объектная карта нормалей и т. д.)
  2. Texture preview : окно, в котором отобразятся сгенерированные карты.


Итак в первое окно загружаем наш экспортированный скриптом .dim-файл. (File >> Open) В окне появится низкополигональная модель. Вы можете её просматривать, перемещать, вращать мышью, или приближать-удалять, зажав Shift.

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

Следующий шаг – меню Texture maps. Сначала задаём выходной размер изображения в Set Texture Dimension (по умолчанию 256х256).

image:BA_set_texture_dimensions.png


Далее продолжаем в меню Texture maps выбираем GenerateNormal/Displacement Maps и обратим внимание на появляющееся окно.

image:BA_generate_texture_maps.png

Сначала ставим флажок на опции Smooth Hi-Res Mesh Normals если объект необходимо сгладить.

Затем отмечаем желаемый тип карты нормалей Тангенциальная или Карта нормалей пространства объекта (Tangent-space или Object-space). Всё, теперь жмём Accept, генерируется карта нормалей и окно просмотра текстуры автоматически обновляется.

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

Теперь в меню Texture maps выбираем Save Normal Map и задаём имя и путь. По умолчанию будет normal.tga.

image:BA_denormgen_in_action.png

У меня проблемы, помогите!

Искажения на границах карты нормалей? Вызовите Set Hi-Res Mesh Options и чуть-чуть увеличьте значение Vertex Offset. Использование карты чуть большего размера тоже может помочь.
Рельефность, воспроизводимая картой нормалей недостаточно сильная? В меню Texture maps вызовите Apply Detail Normal Map и поэкспериментируйте со значением Strength (сила). Прибавьте величину силы (по умолчанию 50) но постепенно, иначе результат может быть непредсказуем.

Я где то читал, что зелёный канал моей карты нормалей должен быть инвертирован. Это правда?

Это было правдой. Раньше масштаб вектора Z отличался и поэтому зелёный канал карты нормалей инвертировался в растровом редакторе типа GIMP. Однако с версии 2.43 Blender полностью совместим с картами, генерируемыми DnormGen и в этом нет необходимости.

Шаг 3-й : Снова в Blender

Выбираем низкополигональный объект, для которого была ваполнена UV-развёртка. Переходим в режим UV Face Select. В UV/Image Editor удаляем любые промежуточные добавленные карты. Теперь добавляем нашу, сгенерированную в DnormGen карту нормалей normal.tga (Image >> Open...). Теперь переходим на панель материалов (F5) и в закладке Shading активировать кнопку NMap TS.


Далее в закладке Map Input отметить тип текстурирования -UV, в закладке Map To активировать канал Nor. Ну и в панели текстур (F6), наконец, активировать кнопку Normal Map и не забыть назначить нашу карту в пустой текстурный слот.

Сохраняем проект. Всё, мы получили низкополигональную модель с Тангенциальной картой нормалей

Olivier Saraja

Личные инструменты