Как нормальное картирование действительно работает?

10

Я пытаюсь понять концепцию нормального отображения, но меня смущают несколько вещей. Короче говоря, я не уверен, зависит ли карта нормалей от точки обзора или нет (т.е. получите ли вы другую карту нормалей того же объекта при вращении вокруг него). Во-вторых, я не понимаю, почему голубоватый цвет является преобладающим цветом на картах нормалей.

Как я думаю о нормалях и их отношении к цветам 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 ...

Ailurus
источник
Вы когда-нибудь пытались реализовать фонг или хотя бы диффузное затенение? Знаете ли вы основные формулы, такие как точка (a, b) = cos (угол (a, b)) для единичных векторов a, b? Несколько часов внедрения сэкономят вам годы борьбы.
Иван Кукир
@Ailurus: см. Мой комментарий / ответ о том, как подходить к той же проблеме для объектов ландшафта / полей высоты. Это немного усложняет другие объекты, но понятия не должны отличаться.
Теодрон
Частный случай нормального отображения местности: gamedev.stackexchange.com/questions/43894/…
teodron

Ответы:

14

Отображение текстуры - это отображение между точками на трехмерной поверхности и соответствующими им точками на текстурном изображении. Если у вас есть наложение текстуры 1: 1, то каждая точка на трехмерной поверхности отображается на определенную и уникальную точку на изображении текстуры (хотя обратное не обязательно должно быть истинным. Некоторые местоположения в текстуре не обязательно будут отображаться на местоположения на поверхности).

С таким отображением вы можете пройти через трехмерную поверхность и сохранить каждый отдельный нормаль в соответствующем месте текстуры.

Хорошо, хорошо, давайте сделаем это. Мы пройдем трехмерную поверхность и сгенерируем объектно-пространственные нормали для отображаемых местоположений, а затем вставим их в текстуру. Поэтому, когда мы хотим визуализировать, мы просто выбираем объектное пространство, нормальное из текстуры, и все готово. Правильно?

Ну да, это будет работать. Но это также означает, что нормали текстуры могут использоваться только с этим конкретным объектом. И это также означает, что нормали текстуры могут использоваться только с этим объектом и с этим конкретным отображением текстуры . Так что, если вы хотите каким-то образом повернуть наложение текстуры или изменить его с помощью какого-либо УФ-преобразования, вам не повезло.

В общем, люди используют карты нормалей, где нормали находятся в «касательном пространстве». Касательное пространство - это пространство относительно сопоставленной точки на трехмерной поверхности, где немодифицированная нормаль находится в направлении + Z, а оси X и Y указывают вдоль осей U и V относительно поверхности.

Касательное пространство существенно регуляризует нормали. В касательном пространстве нормаль (0, 0, 1) всегда означает «неизмененный»; это нормаль, которую вы получаете от интерполяции нормали вершины. Это приводит к ряду полезных вещей, которые вы можете сделать , одна из самых важных - хранить их в меньшем количестве данных.

Поскольку Z всегда будет положительным, вы можете вычислить его в своем шейдере из компонентов X и Y. Так как вам нужно только 2 значения, вы можете использовать (в номенклатуре формата изображения OpenGL ) GL_RG8, формат 2 байта на пиксель, а не GL_RGBA84 байта на пиксель (по- GL_RGB8прежнему будет 4 байта на пиксель) , поскольку графические процессоры дополняют каждый пиксель до 4 байтов). Более того, вы можете сжать эти два значения , что приведет к формату 1 байт на пиксель. Итак, вы уменьшили размер вашей текстуры до 75% от карты нормалей пространства объектов.

Прежде чем вы сможете говорить о любой карте нормалей, вам необходимо сначала узнать, что она хранит. Это карта нормалей в пространстве объектов, карта нормалей в касательном пространстве или что-то еще?

Николь Болас
источник
Итак, первый тип карты, который вы описываете, это карта нормалей объектного пространства , верно? Это более красочный, потому что он хранит реальные компоненты X, Y и Z нормали. Второй тип, карта нормалей касательного пространства , кажется, хранит что-то вроде возмущений для нормалей, а не самих нормалей. Я прочитаю концепцию касательного пространства и вернусь позже.
Ailurus
Итак, касательное пространство точки на поверхности - это просто пространство всех касательных векторов этой точки. Тем не менее, в этом случае я не вижу, как нормаль, как видно из касательного пространства, может быть чем - то еще, чем (0,0,1)? Другими словами, я бы всегда ожидал, что карта нормалей будет синего цвета (128,128,255). Тем не менее, пример, показанный на странице википедии ( en.wikipedia.org/wiki/Normal_mapping#How_it_works ), содержит другие цвета. Я понимаю, как эту карту можно использовать для изменения нормалей, но не то, как она на самом деле рассчитывается.
Ailurus
@Ailurus: « Хорошо, значит, касательное пространство точки на поверхности - это просто пространство всех касательных векторов этой точки. » Нет, это не так. Это пространство, определяемое (неизмененной) нормалью и направлением координат текстуры в этой точке на поверхности. Он нормализовал нормали, сохраненные в текстуре, как относящиеся к текстурному наложению и текущему нормали до модификаций.
Никол Болас
Вероятно, наиболее сложной частью карты нормалей является само отображение (включая способ вычисления касательных векторов). Разве вычисление касательных векторов неразрывно связано с УФ-отображением / наложением диффузной текстуры И с геометрией объекта в целом? Другими словами: у вас есть две разные карты нормалей для объекта, но вычисляется только одно касательное (и нормальное) поле. Вы можете обнаружить, что не можете использовать касательное поле согласованно с двумя разными нормальными текстурами (хотя геометрически вы можете найти подходящие uv-отображения, что не является тривиальной задачей).
Теодрон
@NicolBolas Ах, я запутался, потому что некоторые источники утверждают, что векторы T, B и N образуют ортонормированный базис, в то время как другие упоминают, что это не обязательно верно.
Ailurus
3

Карты нормалей отображаются с использованием так называемого касательного пространства, которое по сути является локальным пространством, основанным на текстурном пространстве модели. Это должно ответить на оба ваших вопроса.

Это не зависит от точки обзора, потому что это пространство не имеет ничего общего с камерой. На карте нормалей Z - это направление вверх. Если вы посмотрите на нормали модели, большинство векторов нормалей будут направлены прямо из сетки. Поверхность сетки - это пространство текстур, о котором я говорил, поэтому в этой локальной системе координат направление вверх - это «наружу».

кувалда
источник
Спасибо за разъяснение этого! Однако я не использую полигональную сетку в качестве поверхности, а кусочно гладкую параметрическую поверхность . Следовательно, все нормали будут сохранены как указывающие в направлении (0,0,1), верно?
Ailurus
1

Прокрутить вниз на этой странице

Посмотрите на правый черно-белый чертеж под наборами данных - это (или, по крайней мере, раньше) известный как рисунок ежа, рендеринг поверхности с каждым нарисованным нормалью.

Итак, чтобы понять традиционную карту нормалей, подумайте о расстроенном еже, у которого торчат все шипы - каждый из этих шипиков нормален к поверхности ежа под ним -

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

Теперь этот пример сфокусирован на карте норм OBJECT - она ​​определяет нормали по отношению к объекту, и это инвариантно при любом вращении, перемещении или масштабировании - объекта, камеры или чего-либо еще - как упоминалось ранее, это только один вид карты нормалей, но это самая распространенная

Марк Маллин
источник
0

Я думаю, у вас могут быть некоторые неправильные представления о том, что такое карты нормалей. По сути, это способ имитации внешнего вида чего-то неровного, когда на самом деле геометрия абсолютно плоская.

Цвета карты нормалей интерпретируются технологическим шейдером и обрабатываются на основе интенсивности и направления света, а также вида вашей камеры. Это означает, что у вас может быть, например, кирпичный пол, который является полностью плоским, с плоской текстурой, но поскольку у него есть карта нормалей с той же кирпичной формой, при осмотре вокруг него свет будет отражаться от стороны из кирпичей, которые делают его более трехмерным, чем он есть.

Это конечно иллюзия, но это намного дешевле, чем сложная геометрия. И нет, цвета карты нормалей не меняются. Они действительно просто представляют значения для сравнения в шейдере. Я уверен, что кто-то здесь сможет рассказать вам гораздо подробнее.

SirYakalot
источник
Я знаю, но все равно спасибо за ваш ответ :)
Ailurus