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


11

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

Ответы:


12

Поскольку карта нормалей покрывает векторы от -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?
Абхинай Сингх Неги

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, поскольку мы знаем, что это единичный вектор. Это позволяет поддерживать более высокую точность с большим количеством бит без увеличения размера файла.


Касательные пространства не являются однозначно параметризованными, но я нахожу много изображений сетки + нормаль-карта-в-касательном. Есть ли традиционный способ определения базиса касательного пространства?
Алек Якобсон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.