Использование карт нормалей

Normal mapping – по-русски техника создания карты нормалей или как называет ее Вики – рельефное текстурирование. Многие indie-разработчики ей пренебрегают, и зря, это очень мощный инструмент, благодаря которому можно на порядок улучшить графику в игре и существенно сэкономить на полигонах. Еще чаще Normal mapping-ом, просто неправильно пользуются.

Сама карта нормалей — это изображение, которое в цвете пикселей хранит информацию о нормалях модели. Я не буду вдаваться в теорию, сразу перейду к практике, кому интересно ссылка на Википедию.

Допустим, мы имеем такую модель:

1

Красиво, правда? Но, давайте глянем на полигонаж:

3

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

Итак, моделька после ретопологии:

4 5

Она стала немного угловатой, это моя вина, как всегда, слишком уж сэкономил на полигонах. Было около 2500, стало 250. Главное то, что пропали все узорчики, так ее красящие. Вот как раз их мы и будем делать при помощи карты нормалей. Я предпочитаю программу TopoGun, как для ретопологии, так и для запекания карт, поэтому буду отталкиваться от нее. Итак, открываем TopoGun, жмем “Load Ref” и загружаем высокополигональную модель. Затем “Load Scene” и загружаем низкополигональную соответственно. Видим что-то вроде:

6

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

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

Но я отвлекся, продолжим. В верхнем меню жмем “Bake -> Generate maps”. В открывшемся окне ставим галочку у Normal Map Generate, выбираем файл, куда сохранять и жмем внизу кнопку “Generate”. Открываем в графическом редакторе карту и проверяем ее.

normalmap

У меня здесь все в порядке, вся карта в оттенках голубого. Но бывает, что в некоторых местах карты будут пятна другого цвета. Значит возвращаемся в TopoGun и пробуем поднимать параметры Cage Dist / Search Dist в окне генерации текстур. На сложных моделях может случаться так, что при разном значении этих параметров артефакты будут пропадать в одном месте, но появляться в другом. В этом случае берем по кусочку оттуда и отсюда и в Photoshop или другом граф. редакторе собираем карту нормалей вручную из нескольких картинок.

Ну и наша моделька с наложенной на нее картой нормалей:

7

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

Теперь о том, чего делать не стоит:

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

Не делайте карту нормалей на основе текстуры. Например, игровой движок Unity позволяет любую текстуру сделать картой нормалей буквально в два клика. И я даже видел на YouTube пару уроков, где показано, как это делается. Не рекомендую этого делать. Такой способ может подойти, если вы просто хотите сделать какую-то невнятную шероховатость на камне и у вас есть похожая текстура. Но и здесь, это способ “для лентяя”, лучше загнать этот камень, например, в ZBrush и сделать как положено.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *