Короткий ответ
Карты нормалей и нормали - это две разные вещи: нормали - это геометрическое свойство любой сетки / поверхности, ее использование не является исключительным для расчета затенения и освещения, но на самом деле имеет много других применений, например в физике. Карты нормалей - это текстуры, которые кодируют альтернативные векторы нормалей, используемые в компьютерной графике для имитации неровностей.
Длинный ответ
Нормалы в геометрии нормаль - это вектор или линия, перпендикулярная данному объекту (например, нормаль к плоскости, нормаль к вершине). Нормы в графике обычно используются для расчета освещенности, например, для расчета диффузного отражения на поверхности путем помещения точечного произведения между направлением света и нормалями поверхности. Нормалы обычно рассчитываются на основе геометрических свойств сетки (грани / вершины) путем взятия перекрестного произведения любых двух непараллельных ребер, лежащих на одной плоскости.
В OpenGL нормали задаются для каждой вершины (следовательно, они называются атрибутами вершин), даже если они могут быть рассчитаны только для каждой грани, в этом случае вам необходимо указать одну и ту же нормаль для каждой вершины грани. Нормы можно интерполировать с помощью OpenGL по каждой вершине грани (треугольника), чтобы вы могли рассчитать отраженный свет на пиксель, а не на вершину, что дает более точный результат.
Отображение нормалей: с другой стороны, это методика компьютерной графики, которая кодирует нормали в текстурной карте, поэтому каждый нормаль кодируется для каждого текселя. Он обычно используется для фальсификации освещения ударов и вмятин (например, картографирование выпуклостей, отображение параллакса).
Так как нормали рассчитываются на основе геометрических свойств сетки / поверхности, Карты нормалей предоставят вам альтернативные нормали, которые могут имитировать неровности, чтобы добавить детали к поверхности, не добавляя больше полигонов.
Карты нормалей обычно создаются с использованием гораздо более детальной трехмерной модели, а затем вычисляются нормали на основе этой модели и кодируются в карту нормалей.
Зачем нам оба?
Говоря только о рендеринге, нормали и карты нормалей обычно используются вместе для достижения окончательного эффекта освещения, хорошим примером может служить рельефный шейдер, где вам нужна нормаль карты нормалей для достижения эффекта рельефного освещения, и вам все равно понадобится геометрическая нормаль для расчета того, что называется касательным пространством . Касательное пространство обычно используется для повторного использования для карт нормалей.
Имейте в виду, что нормаль считается геометрическим атрибутом поверхности и имеет гораздо больше применений, чем только легкие вычисления. Карты нормалей, с другой стороны, обычно используются для поверхностных эффектов.
Расширяем ответ, чтобы объяснить, почему касательные пространства важны:
Краткий ответ:
касательные пространства используются для того, чтобы сделать карты нормалей независимыми от базовой геометрии.
[EDIT] Добавлено изображение для представления карты нормалей в касательном пространстве и карты нормалей в мировом пространстве.
Длинный ответ:
На приведенном ниже рисунке показана плоскость UV и нормаль, которая определяет касательное пространство, при создании карты нормалей мы уже будем знать, что используемое пространство всегда будет иметь направление Normal в направлении Z (поэтому карты нормалей выглядят голубоватыми) , это поможет нам игнорировать кривизну поверхности **,.
Касательное пространство дает нам преимущество в том, что наша кодировка карт нормалей не привязана к определенной сетке нормалей. Предположим, что мы кодируем нашу карту нормалей в мире или пространстве объектов, тогда каждая кодируемая нами нормаль будет иметь направление, основанное на том, как исходные нормали сетки изменяются в мировом пространстве, не говоря уже о том, что преобразования вашей модели будут влиять на вашу карту нормалей.
На двух приведенных выше рисунках довольно ясно, что пространство касательных делает карты нормалей (справа) независимыми от базовой геометрии, поскольку все нормали кодируются практически в одном и том же направлении с небольшими вариациями для имитации эффекта выпуклостей.
** кривизна поверхности определяется величиной, от которой геометрический объект отклоняется от плоской или прямой в случае линии, но это определяется по-разному в зависимости от контекста.