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

11

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

По определению касательное пространство перпендикулярно поверхности. В любой точке нормаль должна всегда указывать в Z (синее направление) без X (красное направление) или Y (зеленое направление). Таким образом, карта нормалей (поскольку это «карта нормалей») должна иметь цвет нормалей, который просто синий (R = x = 0, G = y = 0, B = z = 1) без промежуточных оттенков.

Но карты нормалей не такие, и в них есть градиенты оттенков. Почему это так?

конек
источник

Ответы:

19

Касательное пространство перпендикулярно геометрическим нормалям - интерполированным вершинам нормалей многоугольников. Карта нормалей обеспечивает нормали затенения относительно касательного пространства, определенного геометрическими нормалями. Когда нормали затенения не совпадают с геометрическими, т. Е. Поскольку у вас есть детальная текстура поверхности с элементами, которые не смоделированы в геометрии, карта нормалей отклоняется от «плоского синего» (RGB 128, 128, 255).

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

Натан Рид
источник
1
Чтобы уточнить, карты нормалей обычно делаются в касательном пространстве, поскольку это остается точным, когда сетка анимирована, в то время как, например, карты нормалей в пространстве модели требуют анимации карт нормалей в тандеме с любой анимацией, которая у вас может быть (что было бы особенно сложно с скелеты и произвольные тряпичные куклы, например). Что касается статической геометрии, то нет технической причины, по которой вы не могли бы иметь пространство модели, а не карту синего цвета, которая немного упрощает ваш пиксельный шейдер (за счет согласованности, требует большего количества шейдеров и, в свою очередь, требует большего количества шейдеров). изменения выбора).
MaulingMonkey
1
(также данные карты нормалей, как правило, не могут быть повторно использованы в нескольких местах сетки, если они
находятся
+1; последний пункт является ключевым в вопросе - если поверхность, на которой они находились, должна быть абсолютно плоской, то она будет синей. Если поверхность должна была иметь некоторую шероховатость, карта нормалей моделирует эту шероховатость без необходимости указывать дополнительную геометрию.
Максимус Минимус
2

Ответ прост: из-за смещения диапазона.

Нормалы имеют диапазон от -1,0 до 1,0 для каждого компонента (x, y, z). С другой стороны, карта нормалей, сохраненная как 24-битное RGB-изображение, имеет диапазон от 0 до 255 для каждого компонента.

Это означает, что любые компоненты, которые были нулевыми, становятся 127,5 (точная середина) на карте нормалей (округляется до 128).

Нормальный вектор (0,0,1) становится (128,128,255) на изображении карты нормалей, который является пурпурным цветом, а не чистым синим (0,0,255).

GraphixGuy
источник