В 3D компьютерной графике нормальное отображение или Dot3 bump mapping — это метод текстурного отображения , используемый для имитации освещения выпуклостей и вмятин — реализация bump mapping . Он используется для добавления деталей без использования большего количества полигонов . [1] Обычно этот метод используется для значительного улучшения внешнего вида и детализации низкополигональной модели путем создания карты нормалей из высокополигональной модели или карты высот .
Карты нормалей обычно хранятся в виде обычных изображений RGB , где компоненты RGB соответствуют координатам X, Y и Z нормали поверхности .
В 1978 году Джим Блинн описал, как нормали поверхности могут быть нарушены, чтобы геометрически плоские грани имели детальный вид. [2] Идея взятия геометрических деталей из высокополигональной модели была представлена в "Fitting Smooth Surfaces to Dense Polygon Meshes" Кришнамурти и Левоя, Proc. SIGGRAPH 1996, [3] , где этот подход использовался для создания карт смещения по NURBS . В 1998 году были представлены две статьи с ключевыми идеями для переноса деталей с помощью карт нормалей из высокополигональных в низкополигональные сетки: "Appearance Preserving Simplification" Коэна и др. SIGGRAPH 1998, [4] и "A general method for conservation attribute values on simplifying meshes" Чигнони и др. IEEE Visualization '98. [5] Первый ввел идею хранения нормалей поверхности непосредственно в текстуре, а не смещений, хотя это требовало, чтобы модель с низкой степенью детализации была сгенерирована определенным алгоритмом ограниченного упрощения. Последний представил более простой подход, который разделяет высоко- и низкополигональную сетку и позволяет воссоздавать любые атрибуты модели с высокой степенью детализации (цвет, координаты текстуры , смещения и т. д.) способом, который не зависит от того, как была создана модель с низкой степенью детализации. Сочетание хранения нормалей в текстуре с более общим процессом создания все еще используется большинством доступных в настоящее время инструментов.
Ориентация осей координат различается в зависимости от пространства, в котором была закодирована карта нормалей. Простая реализация кодирует нормали в пространстве объектов так, что красный, зеленый и синий компоненты напрямую соответствуют координатам X, Y и Z. В пространстве объектов система координат постоянна.
Однако карты нормалей объектного пространства не могут быть легко повторно использованы на нескольких моделях, поскольку ориентация поверхностей различается. Поскольку карты цветных текстур можно свободно повторно использовать, а карты нормалей, как правило, соответствуют определенной карте текстур, для художников желательно, чтобы карты нормалей имели то же свойство.
Повторное использование карты нормалей стало возможным благодаря кодированию карт в касательном пространстве . Касательное пространство — это векторное пространство , касательное к поверхности модели. Система координат плавно изменяется (на основе производных положения по отношению к координатам текстуры) по всей поверхности.
Нормальные карты касательного пространства можно определить по их доминирующему фиолетовому цвету, соответствующему вектору, направленному прямо от поверхности. См. Расчет.
Нормали поверхности используются в компьютерной графике в первую очередь для освещения, имитируя явление, называемое зеркальным отражением . Поскольку видимое изображение объекта — это свет, отражающийся от его поверхности, информация о свете, полученная от каждой точки поверхности, может быть вычислена в ее касательном пространстве в этой точке.
Для каждого касательного пространства поверхности в трехмерном пространстве существует два вектора, которые перпендикулярны каждому вектору касательного пространства. Эти векторы называются нормальными векторами , и выбор между этими двумя векторами дает описание того, как поверхность ориентирована в этой точке, поскольку световая информация зависит от угла падения между лучом и нормальным вектором , и свет будет виден только если . В таком случае отражение луча с направлением вдоль нормального вектора задается как
Интуитивно это просто означает, что вы можете видеть только внешнюю сторону объекта, если смотрите снаружи, и только внутреннюю сторону, если смотрите изнутри. Обратите внимание, что световая информация локальна, и поэтому поверхность не обязательно должна быть ориентируемой как целое. Вот почему, хотя такие пространства, как лента Мёбиуса и бутылка Клейна , неориентируемы, их все равно можно визуализировать.
Нормали могут быть заданы с помощью различных систем координат. В компьютерной графике полезно вычислять нормали относительно касательной плоскости поверхности. Это полезно, поскольку поверхности в приложениях подвергаются различным преобразованиям, например, в процессе рендеринга или в скелетной анимации, и поэтому важно, чтобы информация о векторе нормали сохранялась при этих преобразованиях. Примерами таких преобразований являются преобразование, вращение, сдвиг и масштабирование, перспективная проекция [6] или скелетная анимация на мелко детализированном персонаже.
Для целей компьютерной графики наиболее распространенным представлением поверхности является триангуляция , и в результате касательная плоскость в точке может быть получена путем интерполяции между плоскостями, содержащими треугольники, каждый из которых пересекает эту точку. Аналогично, для параметрических поверхностей с касательными пространствами параметризация даст частные производные, и эти производные могут быть использованы в качестве основы касательных пространств в каждой точке .
Чтобы найти возмущение в нормали, необходимо правильно рассчитать касательное пространство. [7] Чаще всего нормаль возмущается во фрагментном шейдере после применения матриц модели и вида [ требуется ссылка ] . Обычно геометрия предоставляет нормаль и касательную. Касательная является частью касательной плоскости и может быть преобразована просто с помощью линейной части матрицы (верхней 3x3). Однако нормаль необходимо преобразовать с помощью обратного транспонирования . Большинство приложений хотят, чтобы касательная к двум точкам соответствовала преобразованной геометрии (и связанным UV). Поэтому вместо того, чтобы принудительно заставлять касательную к двум точкам быть перпендикулярной касательной, обычно предпочтительнее преобразовывать касательную к двум точкам так же, как и касательную. Пусть t будет касательной, b будет касательной к двум точкам, n будет нормалью, M 3x3 будет линейной частью матрицы модели, а V 3x3 будет линейной частью матрицы вида.
Чтобы вычислить ламбертовское (диффузное) освещение поверхности, единичный вектор от точки затенения до источника света усеивается единичным вектором нормали к этой поверхности, и результатом является интенсивность света на этой поверхности. Представьте себе полигональную модель сферы — вы можете только приблизительно определить форму поверхности. Используя 3-канальное растровое изображение, текстурированное по всей модели, можно закодировать более подробную информацию о векторе нормали. Каждый канал в растровом изображении соответствует пространственному измерению (X, Y и Z). Эти пространственные измерения относятся к постоянной системе координат для карт нормалей объектного пространства или к плавно изменяющейся системе координат (основанной на производных положения относительно координат текстуры) в случае карт нормалей касательного пространства. Это добавляет гораздо больше деталей к поверхности модели, особенно в сочетании с передовыми методами освещения.
Векторы единичной нормали, соответствующие координатам текстуры u,v, отображаются на картах нормалей. Присутствуют только векторы, направленные к наблюдателю (z: от 0 до -1 для левосторонней ориентации ), поскольку векторы на геометриях, направленные от наблюдателя, никогда не отображаются. Отображение выглядит следующим образом:
X: от -1 до +1 : Красный: от 0 до 255 Y: от -1 до +1 : Зеленый: от 0 до 255 Z: от 0 до -1 : Синий: от 128 до 255
светло-зеленый светло-желтый темно-голубой светло-синий светло-красный темно-синий темно-пурпурный
Поскольку при вычислении скалярного произведения для вычисления рассеянного освещения будет использоваться нормаль , мы видим, что {0, 0, –1} будут переотображены в значения {128, 128, 255}, что даст тот вид небесно-голубого цвета, который можно увидеть на картах нормалей (синяя координата (z) является координатой перспективы (глубины) и плоскими координатами RG-xy на экране). {0.3, 0.4, –0.866} будут переотображены в значения ({0.3, 0.4, –0.866}/2+{0.5, 0.5, 0.5})*255={0.15+0.5, 0.2+0.5, -0.433+0.5}*255={0.65, 0.7, 0.067}*255={166, 179, 17} ( ). Знак z-координаты (синий канал) должен быть перевернут, чтобы сопоставить нормальный вектор карты нормалей с нормальным вектором глаза (точки обзора или камеры) или вектором света. Поскольку отрицательные значения z означают, что вершина находится перед камерой (а не за камерой), эта конвенция гарантирует, что поверхность будет светиться с максимальной силой именно тогда, когда вектор света и вектор нормали совпадают. [8]
Интерактивный рендеринг карты нормалей изначально был возможен только на PixelFlow, параллельной машине рендеринга , созданной в Университете Северной Каролины в Чапел-Хилл . [ требуется ссылка ] Позднее стало возможным выполнять отображение нормалей на высокопроизводительных рабочих станциях SGI с использованием многопроходного рендеринга и операций с буфером кадров [9] или на низкопроизводительном оборудовании ПК с некоторыми трюками, использующими палитровые текстуры. Однако с появлением шейдеров на персональных компьютерах и игровых консолях отображение нормалей стало широко распространенным в начале 2000-х годов, и одними из первых игр, в которых оно было реализовано, были Evolva (2000), Giants: Citizen Kabuto и Virtua Fighter 4 (2001). [10] [11] Популярность отображения нормалей для рендеринга в реальном времени обусловлена его хорошим соотношением качества и требований к обработке по сравнению с другими методами создания подобных эффектов. Большая часть этой эффективности стала возможной благодаря масштабированию деталей с индексацией расстояния , технике, которая выборочно уменьшает детализацию карты нормалей заданной текстуры (ср. mipmapping ), что означает, что более удаленные поверхности требуют менее сложной имитации освещения. Многие авторские конвейеры используют модели высокого разрешения, запеченные в игровых моделях низкого/среднего разрешения, дополненных картами нормалей.
Базовое отображение нормалей может быть реализовано на любом оборудовании, поддерживающем палитровые текстуры. Первой игровой консолью, имеющей специализированное оборудование для отображения нормалей, была Sega Dreamcast . Однако Xbox от Microsoft стала первой консолью, широко использовавшей этот эффект в розничных играх. Из консолей шестого поколения [ требуется ссылка ] только графический процессор PlayStation 2 не имеет встроенной поддержки отображения нормалей, хотя его можно смоделировать с помощью векторных единиц оборудования PlayStation 2. Игры для Xbox 360 и PlayStation 3 в значительной степени полагаются на отображение нормалей и были первым поколением игровых консолей, использующих отображение параллакса . Было показано, что Nintendo 3DS поддерживает отображение нормалей, как это продемонстрировано в Resident Evil: Revelations и Metal Gear Solid 3: Snake Eater .