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

11

Я учусь о нормальном картографировании. Я понял, что значения RGB конвертируются в XYZ, но у меня вопрос, как он конвертируется и почему карта нормалей синего и фиолетового цвета?

Абхинай Сингх Неги
источник

Ответы:

12

Поскольку карта нормалей покрывает векторы от -1 до 1, имеет смысл растянуть этот диапазон до 0-> 1, чтобы все это можно было уместить в пределах диапазона RGB.

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

vec3 colour = vec3(0.5) + normal * 0.5;

Синий цвет объясняется тем, что карты нормалей предполагается использовать относительно нормали примитива (треугольник / и т. Д.) С направлением по умолчанию (0,0,1), чтобы указать отсутствие отклонения от нормали треугольника. Обычно фрагментный шейдер должен повернуть этот нормальный элемент относительно текущего нормального значения на пиксель во время выполнения.

PaulHK
источник
Этот код vec3 colour = vec3(0.5) + normal * 0.5;конвертирует RGB в XYZ?
Абхинай Сингх Неги
1
@AbhinaySInghNegi нет, цвет - это RGB, а нормальный - это XYZ, так что это конвертирует XYZ в RGB. Если вы хотите использовать RGB в XYZvec3 normal = (colour - vec3(0.5)) * 2.0;
bram0101
20

Только карты нормалей касательного пространства в основном синие. Это связано с тем, что синий цвет представляет собой нормаль (0,0,1), которая была бы неизменной нормалью, когда треугольник лежит в плоскости x и y, то есть перпендикулярно поверхности. Тангенс, х и би-тангенс, у (также называемый би-нормалью) кодируются в красном и зеленом каналах, и они образуют нормаль касательного пространства для точки на поверхности треугольника.

Если бы карта нормалей касательного пространства должна была кодировать цвет только красным (1,0, 0,0, 0,0), это сгенерировало бы нормаль касательного пространства, параллельную поверхности треугольника. Этого никогда не видно, потому что это будет означать, что треугольник будет светиться только на 90 градусов от поверхности и смотреть вектор, в котором вы все равно не сможете увидеть треугольник.

Карты нормалей мирового пространства кодируют единицу нормали по сфере, поэтому в основном это могут быть разные цвета, однажды закодированные от [-1, 1] до [0, 1] на канал.

Сравнение можно увидеть здесь:

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

На практике карты нормалей обычно кодируются в двухканальном формате, таком как BC5, который на самом деле хранит только x и y с восстановлением z, поскольку мы знаем, что это единичный вектор. Это позволяет поддерживать более высокую точность с большим количеством бит без увеличения размера файла.

Syntac_
источник
Касательные пространства не являются однозначно параметризованными, но я нахожу много изображений сетки + нормаль-карта-в-касательном. Есть ли традиционный способ определения базиса касательного пространства?
Алек Якобсон