Введение

Техника текстурного отображения

В 3D компьютерной графике, нормальное отображение, или Dot3 bump mapping, — это техника текстурного отображения, используемая для имитации освещения неровностей и вмятин – реализация bump mapping. Она применяется для добавления деталей без увеличения количества полигонов. Распространенное применение этой техники – значительное улучшение внешнего вида и детализации модели с низким количеством полигонов путем генерации карты нормалей из модели с высоким количеством полигонов или карты высот. Карты нормалей обычно хранятся в виде стандартных RGB-изображений, где компоненты RGB соответствуют координатам X, Y и Z, соответственно, нормали поверхности.

История

В 1978 году Джим Блинн описал, как можно возмущать нормали поверхности, чтобы геометрически плоские грани выглядели детализированными. Идея получения геометрических деталей из модели с высоким количеством полигонов была представлена в работе Кришнамурти и Левоя "Адаптация гладких поверхностей к плотным многоугольным сетям", Proc. SIGGRAPH 1996, где этот подход использовался для создания карт смещения поверхностей NURBS. В 1998 году были опубликованы две статьи, содержащие ключевые идеи для переноса деталей с использованием карт нормалей с моделей с высоким количеством полигонов на модели с низким количеством полигонов: "Упрощение с сохранением внешнего вида" Коэна и др., SIGGRAPH 1998, и "Общий метод сохранения значений атрибутов на упрощенных сетях" Чиньони и др., IEEE Visualization '98. В первой статье была предложена идея хранения нормалей поверхности непосредственно в текстуре, а не смещений, хотя это требовало генерации модели с низкой детализацией с использованием конкретного алгоритма упрощения с ограничениями. Во второй статье был представлен более простой подход, который разделяет высоко- и низкополигональные сетки и позволяет воссоздать любые атрибуты модели с высокой детализацией (цвет, координаты текстур, смещения и т.д.) независимо от способа создания модели с низкой детализацией. Комбинация хранения нормалей в текстуре и более общего процесса создания по-прежнему используется большинством современных инструментов.

Расчет тангентного пространства

Нормали используются в компьютерной графике главным образом для освещения. Нормаль — это вектор, указывающий направление, в котором повёрнута поверхность. Чтобы определить, как должна быть освещена поверхность, программному обеспечению необходимо знать её ориентацию, поскольку ориентация поверхности существенно влияет на то, как от неё отражается свет. Нормали могут быть заданы в различных системах координат. В компьютерной графике полезно вычислять нормали относительно тангенциальной плоскости поверхности. Это полезно, потому что поверхности в видеоиграх и других приложениях подвергаются множеству преобразований перед окончательной отрисовкой, поэтому требуется система координат, привязанная к ориентации поверхности. Ярким примером этого является скелетная анимация детализированного персонажа. Если рука персонажа согнута, карты нормалей должны отражать новую ориентацию без дорогостоящих с вычислительной точки зрения обновлений данных текстур при преобразовании. Для определения отклонения нормали необходимо правильно рассчитать тангенциальное пространство. Чаще всего нормаль изменяется во фрагментном шейдере после применения матриц модели и вида. Обычно геометрия предоставляет нормаль и тангенс. Тангенс является частью тангенциальной плоскости и может быть преобразован просто с помощью линейной части матрицы (верхние 3x3). Однако нормаль необходимо преобразовывать с помощью обратной транспонированной матрицы. В большинстве приложений желательно, чтобы битангенс соответствовал преобразованной геометрии (и связанным с ней UV-координатам). Поэтому вместо того, чтобы принудительно делать битангенс перпендикулярным тангенсу, обычно предпочтительнее преобразовывать битангенс так же, как и тангенс. Пусть t — тангенс, b — битангенс, n — нормаль, M3x3 — линейная часть матрицы модели, а V3x3 — линейная часть матрицы вида.

Обычное отображение в видеоиграх

Интерактивный рендеринг карт нормалей изначально был возможен только на PixelFlow, параллельной машине для рендеринга, разработанной в Университете Северной Каролины в Чапел-Хилл. Позже стало возможным выполнять отображение карт нормалей на высокопроизводительных рабочих станциях SGI, используя многопроходный рендеринг и операции с буфером кадров, или на маломощном ПК с некоторыми ухищрениями, применяя палитрованные текстуры. Однако с появлением шейдеров на персональных компьютерах и игровых консолях, отображение карт нормалей стало широко распространенным в начале 2000-х годов, и одними из первых игр, реализовавших его, были Evolva (2000), Giants: Citizen Kabuto и Virtua Fighter 4 (2001). Популярность отображения карт нормалей для рендеринга в реальном времени обусловлена хорошим соотношением качества к требованиям к производительности по сравнению с другими методами создания подобных эффектов. Большая часть этой эффективности достигается благодаря масштабированию детализации с учетом расстояния – технике, которая выборочно уменьшает детализацию карты нормалей данной текстуры (см. mipmapping), что означает, что более удаленные поверхности требуют менее сложного моделирования освещения. Многие производственные конвейеры используют модели высокого разрешения, которые "запекаются" в модели низкого/среднего разрешения для игровых моделей, дополненных картами нормалей. Базовое отображение карт нормалей может быть реализовано на любом оборудовании, поддерживающем палитрованные текстуры. Первой игровой консолью, получившей специализированное аппаратное обеспечение для отображения карт нормалей, была Sega Dreamcast. Однако Xbox от Microsoft стала первой консолью, широко использовавшей этот эффект в коммерческих играх. Среди консолей шестого поколения только графический процессор PlayStation 2 не имеет встроенной поддержки отображения карт нормалей, хотя его можно эмулировать, используя векторные блоки оборудования PlayStation 2. Игры для Xbox 360 и PlayStation 3 в значительной степени полагаются на отображение карт нормалей и были первым поколением игровых консолей, которые использовали параллаксное отображение. Поддержка отображения карт нормалей была продемонстрирована и на Nintendo 3DS, как это видно в Resident Evil: Revelations и Metal Gear Solid 3: Snake Eater.