Имитируя объём: как карты нормалей помогают заменить высокополигональные объекты

Что такое карты нормалей, и как происходит их запекание для низкополигональных моделей.

3D-художник Карлос Лемос опубликовал на сайте 80 LEVEL туториал, в котором подробно рассказал о принципах, на основе которых работают карты нормалей, а также поэтапно описал процесс запекания. А мы выбрали из него ключевую информацию, которая поможет новичкам разобраться в этой теме.

Как работают карты нормалей

Чтобы понятнее объяснить принципы работы карт нормалей, Лемос обратился к истории 3D-моделирования. Первые 3D-модели выглядели примерно так.

Главная проблема таких моделей в ярко выраженных полигонах
Главная проблема таких моделей в ярко выраженных полигонах

Первое очевидное решение этой проблемы состояло в увеличении количества полигонов — это сделало поверхность более ровной и гладкой.

Имитируя объём: как карты нормалей помогают заменить высокополигональные объекты

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

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

Когда свет попадает на полигон, угол светового луча сравнивается с нормалью. При отражении используется тот же угол относительно нормали
Когда свет попадает на полигон, угол светового луча сравнивается с нормалью. При отражении используется тот же угол относительно нормали

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

По умолчанию все полигоны отражают световые лучи перпендикулярно своей поверхности (как в реальности), потому что нормали полигона по умолчанию перпендикулярны поверхности полигона.

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

Благодаря этому поверхность воспринимается гладкой — результат можно сравнить с моделью, состоящей из огромного количества полигонов. Именно по этому принципу работают группы сглаживания в 3ds Max, Blender и устанавливается рёбра как hard или smooth в Modo, Maya.

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

Чтобы не получалось таких странных объектов, существует угол сглаживания — если угол, под которым соединяются полигоны, выше угла сглаживания, то переход будет мягким, если ниже, то жёстким.

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

Каждая вершина может иметь одну или несколько связанных нормалей. Если у неё есть одна нормаль, то она называется усреднённой нормалью вершины (averaged vertex normal), а если несколько, то разделённой (split vertex normal).

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

У средней вершины есть одна нормаль, чьё направление равно среднему показателю между другими связанными нормалями вершин
У средней вершины есть одна нормаль, чьё направление равно среднему показателю между другими связанными нормалями вершин

Если переход жёсткий, то каждая вершина имеет несколько нормалей — так появляется пробел, который визуально разделяет две плоскости. Это и называется разделённой нормалью вершины.

У разделённой вершины есть несколько нормалей — по одной параллельной для каждой связанной вершины
У разделённой вершины есть несколько нормалей — по одной параллельной для каждой связанной вершины

Чтобы воссоздать отражающие свойства высокополигональной модели на низкополигональной модели, как раз и применяются карты нормалей — она запекается в виде текстуры и накладываются на нужный объект. Вся информация о том, как модель должна отражать свет, хранится в текстуре. Это и называется картой нормалей.

Запекание карты нормалей

Чтобы объяснить принцип запекания карты нормалей, начнём с примера.

Допустим, у нас есть такая низкополигональная модель с четырьмя вершинами
Допустим, у нас есть такая низкополигональная модель с четырьмя вершинами
А это высокополигональная модель, на основе которой нужно сделать карту нормалей для предыдущей плоскости 
А это высокополигональная модель, на основе которой нужно сделать карту нормалей для предыдущей плоскости 

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

Обратите внимание на третий этап — программа для запекания смотрит на то, в каком направлении находятся нормали хайполи-модели. На следующем шаге она придаёт такое же направление нормалям на лоуполи-модели
Обратите внимание на третий этап — программа для запекания смотрит на то, в каком направлении находятся нормали хайполи-модели. На следующем шаге она придаёт такое же направление нормалям на лоуполи-модели
Результат запекания
Результат запекания

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

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

Красный канал показывает, как модель должна выглядеть при освещении справа, зелёный — сверху или снизу, а синий — спереди
Красный канал показывает, как модель должна выглядеть при освещении справа, зелёный — сверху или снизу, а синий — спереди

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

Также нормали можно применять для создания низкополигональной модели, которая сможет отражать свет так же, как высокополигональная модель. Эта информация хранится в трёх отдельных каналах изображения, и 3D-редактор считывает её, чтобы понять, в каком направлении должен падать свет.

177177
38 комментариев

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

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

44

плюсую, должно быть так

63

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

8

но в целом оно так и работает... но на скриншоте он явно наврал, дыа)

2

Сразу тригернуло на это. Для примера работы КН сфера или цилиндры вообще подходят

после любой статьи Семыкина

19

чет чувак даже объяснить не смог чем вертекс от поинта отличается.

устанавливается жёсткость и гладкость рёбер в Modo, Maya.  - шо я сейчас прочитал? каких ребер в модо гладкость?))   Ну зачем вы постите статьи «а как какать?», да еще так плохо написанные.

13