Почему карты нормалей преимущественно синие?

44

Почему карты нормалей преимущественно синего цвета, а не случайного цвета?

Я предполагаю, что нормальные векторы трехмерного объекта могут указывать в любом направлении, например:

(1.0, 0.1, 0.5), (0.1, -0.5, 0.3), (-0.51, 0.46, -1.0) ... 

введите описание изображения здесь

Джинбом Хо
источник

Ответы:

71

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

Пример карты нормалей пространства-модели

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

Карты нормалей касательного пространства обычно светло-голубые. Этот тип карты определяет нормали в координатном пространстве, уникальном для позиции каждого пикселя на поверхности сетки. Он использует (интерполированную) нормаль к вершине в качестве оси Z и два других ортогональных вектора, называемых касательной и битовой, в качестве осей X и Y. По сути, вы можете думать о нормали на карте как о «смещении» от нормали для этого пикселя, вычисленной путем интерполяции нормали вершины. Касательные и битангентные векторы также интерполируются из данных вершин и определяют, какое направление на сетке соответствует «вверх» и «влево» на карте нормалей. Изображение, представленное в вопросе, представляет собой прекрасный пример того, как выглядит типичная карта нормалей касательного пространства, поэтому я не буду приводить здесь другой пример.

Компоненты нормального обычно (без каламбура) варьируются от [-1, 1]. Но компоненты цвета в изображении варьируются от [0, 1](или [0, 255]обычно они нормализованы до [0, 1]). Таким образом, нормали масштабируются и смещаются так, что нормаль (0, 0, 1)становится цветом (0.5, 0.5, 1). Это светло-синий цвет, который вы видите на картах нормалей, и он указывает на отсутствие отклонения от интерполированной нормали вершины при использовании нормалей касательного пространства.

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

bcrist
источник
6
Люблю это объяснение - краткое, включает в себя математику, подробно описывает различные типы, используемые для карт нормалей, и почему они используются.
Том Блю Пиддок
Спасибо за то, что получили различие между bitangentи binormalправильно.
Ималлетт
2
@imallett Да, поверхности имеют нормаль, касательную и разрядную, в то время как кривые имеют касательную, нормальную и бинормальную. По крайней мере, это мое понимание.
bcrist
8

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

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

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

Шон Миддледич
источник
3
Чтобы пояснить это немного дальше, карта нормалей НЕ содержит вектор нормали с вашей точки зрения, но содержит вектор нормали с точки зрения граней, поэтому после того, как вы получили нормаль от лица, вы смешиваете это с нормалей-normalvector. А поскольку он в основном синий, то есть (0, 0, 1), это означает, что нормальный вектор, который вы уже получили, не изменяется. (Подумайте об этом, как будто вы бы положили каждую грань на пол перед тем, как нарисовать ее, а затем использовали вектор нормалей из карты нормалей, в основном это будет вверх, если справа или слева что-то не так с вашей сеткой).
tkausl