Я учусь о нормальном картографировании. Я понял, что значения RGB конвертируются в XYZ, но у меня вопрос, как он конвертируется и почему карта нормалей синего и фиолетового цвета?
11
Поскольку карта нормалей покрывает векторы от -1 до 1, имеет смысл растянуть этот диапазон до 0-> 1, чтобы все это можно было уместить в пределах диапазона RGB.
Поэтому обычно мы применяем преобразование к нормали, чтобы преобразовать его во что-то, что мы можем видеть.
vec3 colour = vec3(0.5) + normal * 0.5;
Синий цвет объясняется тем, что карты нормалей предполагается использовать относительно нормали примитива (треугольник / и т. Д.) С направлением по умолчанию (0,0,1), чтобы указать отсутствие отклонения от нормали треугольника. Обычно фрагментный шейдер должен повернуть этот нормальный элемент относительно текущего нормального значения на пиксель во время выполнения.
vec3 colour = vec3(0.5) + normal * 0.5;
конвертирует RGB в XYZ?vec3 normal = (colour - vec3(0.5)) * 2.0;
Только карты нормалей касательного пространства в основном синие. Это связано с тем, что синий цвет представляет собой нормаль (0,0,1), которая была бы неизменной нормалью, когда треугольник лежит в плоскости x и y, то есть перпендикулярно поверхности. Тангенс, х и би-тангенс, у (также называемый би-нормалью) кодируются в красном и зеленом каналах, и они образуют нормаль касательного пространства для точки на поверхности треугольника.
Если бы карта нормалей касательного пространства должна была кодировать цвет только красным (1,0, 0,0, 0,0), это сгенерировало бы нормаль касательного пространства, параллельную поверхности треугольника. Этого никогда не видно, потому что это будет означать, что треугольник будет светиться только на 90 градусов от поверхности и смотреть вектор, в котором вы все равно не сможете увидеть треугольник.
Карты нормалей мирового пространства кодируют единицу нормали по сфере, поэтому в основном это могут быть разные цвета, однажды закодированные от [-1, 1] до [0, 1] на канал.
Сравнение можно увидеть здесь:
На практике карты нормалей обычно кодируются в двухканальном формате, таком как BC5, который на самом деле хранит только x и y с восстановлением z, поскольку мы знаем, что это единичный вектор. Это позволяет поддерживать более высокую точность с большим количеством бит без увеличения размера файла.
источник