Я пытаюсь понять концепцию нормального отображения, но меня смущают несколько вещей. Короче говоря, я не уверен, зависит ли карта нормалей от точки обзора или нет (т.е. получите ли вы другую карту нормалей того же объекта при вращении вокруг него). Во-вторых, я не понимаю, почему голубоватый цвет является преобладающим цветом на картах нормалей.
Как я думаю о нормалях и их отношении к цветам RGB, выглядит следующим образом. Единичная сфера представляет собой любую возможную единичную нормаль - другими словами, компоненты X, Y и Z единичного вектора нормали находятся в диапазоне от -1 до 1. Все компоненты цвета RGB находятся в диапазоне от 0 до 255. Поэтому имеет смысл для отображения -1 (нормальный компонент) в 0 (компонент цвета), от 0 до 127 или 128 и от 1 до 255. Любое значение между ними просто линейно интерполируется.
Применение этого сопоставления к нормали произвольного трехмерного объекта приводит к очень красочному изображению, а вовсе не синему. Например, при взятии куба все шесть граней будут иметь разный, но равномерный цвет. Например, лицо с нормой (1,0,0) будет (255,128,128), лицо с нормой (0,0, -1) будет (128,128,0) и так далее.
Однако по какой-то причине карты нормалей куба, которые я обнаружил, полностью голубоватые, то есть (128,128,255). Но ясно, что нормали не все в положительном направлении z, то есть (0,0,1). Как это работает?
[Редактировать]
Итак, описанный выше подход, по-видимому, называется картой нормалей пространства объектов или картой нормалей мирового пространства . Другой называется нормалью касательного пространства . Я понимаю, как такую карту нормалей касательного пространства можно использовать для изменения нормалей геометрии, но я все еще не до конца уверен, как она на самом деле рассчитывается (см. Мой комментарий в ответе Николь Болас).
[Редактировать 2]
Наверное, стоит упомянуть, что я работаю с кусочно-параметрическими поверхностями. Эти поверхности состоят из набора поверхностных фрагментов , где каждый фрагмент связан со своим параметрическим пространством (u, v) = [0,1] x [0,1]. В любой точке поверхности нормаль может быть точно рассчитана. По-видимому, векторы T ( касательная ) и B ( двух касательная ) - необходимые для охвата касательного пространства - не являются просто частными производными участка поверхности в направлении u и v ...
источник
Ответы:
Отображение текстуры - это отображение между точками на трехмерной поверхности и соответствующими им точками на текстурном изображении. Если у вас есть наложение текстуры 1: 1, то каждая точка на трехмерной поверхности отображается на определенную и уникальную точку на изображении текстуры (хотя обратное не обязательно должно быть истинным. Некоторые местоположения в текстуре не обязательно будут отображаться на местоположения на поверхности).
С таким отображением вы можете пройти через трехмерную поверхность и сохранить каждый отдельный нормаль в соответствующем месте текстуры.
Хорошо, хорошо, давайте сделаем это. Мы пройдем трехмерную поверхность и сгенерируем объектно-пространственные нормали для отображаемых местоположений, а затем вставим их в текстуру. Поэтому, когда мы хотим визуализировать, мы просто выбираем объектное пространство, нормальное из текстуры, и все готово. Правильно?
Ну да, это будет работать. Но это также означает, что нормали текстуры могут использоваться только с этим конкретным объектом. И это также означает, что нормали текстуры могут использоваться только с этим объектом и с этим конкретным отображением текстуры . Так что, если вы хотите каким-то образом повернуть наложение текстуры или изменить его с помощью какого-либо УФ-преобразования, вам не повезло.
В общем, люди используют карты нормалей, где нормали находятся в «касательном пространстве». Касательное пространство - это пространство относительно сопоставленной точки на трехмерной поверхности, где немодифицированная нормаль находится в направлении + Z, а оси X и Y указывают вдоль осей U и V относительно поверхности.
Касательное пространство существенно регуляризует нормали. В касательном пространстве нормаль (0, 0, 1) всегда означает «неизмененный»; это нормаль, которую вы получаете от интерполяции нормали вершины. Это приводит к ряду полезных вещей, которые вы можете сделать , одна из самых важных - хранить их в меньшем количестве данных.
Поскольку Z всегда будет положительным, вы можете вычислить его в своем шейдере из компонентов X и Y. Так как вам нужно только 2 значения, вы можете использовать (в номенклатуре формата изображения OpenGL )
GL_RG8
, формат 2 байта на пиксель, а неGL_RGBA8
4 байта на пиксель (по-GL_RGB8
прежнему будет 4 байта на пиксель) , поскольку графические процессоры дополняют каждый пиксель до 4 байтов). Более того, вы можете сжать эти два значения , что приведет к формату 1 байт на пиксель. Итак, вы уменьшили размер вашей текстуры до 75% от карты нормалей пространства объектов.Прежде чем вы сможете говорить о любой карте нормалей, вам необходимо сначала узнать, что она хранит. Это карта нормалей в пространстве объектов, карта нормалей в касательном пространстве или что-то еще?
источник
Карты нормалей отображаются с использованием так называемого касательного пространства, которое по сути является локальным пространством, основанным на текстурном пространстве модели. Это должно ответить на оба ваших вопроса.
Это не зависит от точки обзора, потому что это пространство не имеет ничего общего с камерой. На карте нормалей Z - это направление вверх. Если вы посмотрите на нормали модели, большинство векторов нормалей будут направлены прямо из сетки. Поверхность сетки - это пространство текстур, о котором я говорил, поэтому в этой локальной системе координат направление вверх - это «наружу».
источник
Прокрутить вниз на этой странице
Посмотрите на правый черно-белый чертеж под наборами данных - это (или, по крайней мере, раньше) известный как рисунок ежа, рендеринг поверхности с каждым нарисованным нормалью.
Итак, чтобы понять традиционную карту нормалей, подумайте о расстроенном еже, у которого торчат все шипы - каждый из этих шипиков нормален к поверхности ежа под ним -
Что касается вопроса о вашей сфере, если бы вы жили исключительно в параметрическом пространстве, как в случае с трассировщиками лучей, то бесконечный набор нормалей к сфере просто создал бы большую сферу - в тесселяционном пространстве, то есть в мире, который нас навязывает компьютер, если мы хотим в реальном времени, тогда у вас есть колючее приближение сферы.
Теперь этот пример сфокусирован на карте норм OBJECT - она определяет нормали по отношению к объекту, и это инвариантно при любом вращении, перемещении или масштабировании - объекта, камеры или чего-либо еще - как упоминалось ранее, это только один вид карты нормалей, но это самая распространенная
источник
Я думаю, у вас могут быть некоторые неправильные представления о том, что такое карты нормалей. По сути, это способ имитации внешнего вида чего-то неровного, когда на самом деле геометрия абсолютно плоская.
Цвета карты нормалей интерпретируются технологическим шейдером и обрабатываются на основе интенсивности и направления света, а также вида вашей камеры. Это означает, что у вас может быть, например, кирпичный пол, который является полностью плоским, с плоской текстурой, но поскольку у него есть карта нормалей с той же кирпичной формой, при осмотре вокруг него свет будет отражаться от стороны из кирпичей, которые делают его более трехмерным, чем он есть.
Это конечно иллюзия, но это намного дешевле, чем сложная геометрия. И нет, цвета карты нормалей не меняются. Они действительно просто представляют значения для сравнения в шейдере. Я уверен, что кто-то здесь сможет рассказать вам гораздо подробнее.
источник