История Bump Mapping

Имитация рельефа на поверхностях – достаточно старая техника и очень распространенная. Наверное, это одна из самых важных техник рендеринга вообще – ведь если бы не «бамп», анимация и игры выглядели бы намного менее реалистично. Представляем вам краткую историю возникновения и развития методов, относящихся к bump mapping.

Mappings

1978 – Первые исследования

Джеймс Блинн предложил метод, получивший название «bump mapping», для симуляции рельефа на поверхности без необходимости усложнять поверхность геометрически. В каждый точке поверхности вектор нормали меняется в зависимости от данных из текстуры, соответствующих этой точке. Эта измененная нормаль затем используется для расчета освещения. Основная идея метода не изменилась со времен Блинна, меняются только его реализации и различные расширения – так, изначально для расчета нормали использовалась карта высот (heightmap), которая задавала вертикальное смещение рельефа относительно поверхности. Нормаль вычислялась из высоты методом конечных разностей. В строгом инженерском понимании, термин «bump mapping» обозначает именно этот изначальный вариант реализации, хотя сегодня этим термином обычно обозначают сам эффект имитации рельефа – без уточнения, как именно он реализован.

1996 – Normal mapping

В современной 3D-графике, и в особенности графике реального времени, вместо оригинальной техники, предложенной Блинном, обычно используется «normal mapping» – проецирование или отображение нормалей. Нормали все так же задаются в каждой точке поверхности, но вместо вычисления из карты высот они просто считываются из текстуры напрямую. Преимуществом такого подхода является то, что можно сгенерировать карту нормалей из высокополигонального варианта модели, созданной в программах скульптурного моделирования – получается очень удобный воркфлоу, оптимизированный как под художников, так и под разработчиков. Эта идея впервые была озвучена в работе «Fitting Smooth Surfaces to Dense Polygon Meshes» (В. Кришнамурти, М. Левой, SIGGRAPH 1996).

2000 – Tangent space normal mapping

В простейшем виде normal mapping предполагает хранение нормалей в модельном пространстве, что не очень удобно для переиспользования карт нормалей по тому же принципу, что и переиспользование цветовых текстур. Например, модель куба может иметь всего одну цветовую текстуру для всех граней, но с картой нормалей в модельном пространстве так не получится – ведь каждая грань имеет собственную ориентацию. Это приводит к тому, что нужно либо дублировать цветовые данные для каждой грани, либо хранить два набора текстурных координат. Для решения этой проблемы было предложено еще одно расширение метода, ставшее де-факто стандартом – проецирование нормалей в касательном пространстве («A Practical and Robust Bump-mapping Technique for Today's GPUs», M. Киглард, NVIDIA, 2000).

Поскольку вектор нормали в точке всегда положительный в проекции на перпендикуляр к поверхности, его можно хранить в пространстве, где ось Z соответствует перпендикуляру, а X и Y – взаимно перпендикулярным касательным к поверхности. При таком подходе закодированная нормаль инвариантна относительно ориентации поверхности, как и цвет – в результате для карты нормалей можно использовать те же самые текстурные координаты. Нормаль переводится из касательного пространства в видовое в пиксельном шейдере при помощи матрицы, составленной из трех векторов (перпедикуляра и двух касательных, которые называют тангенсом и бинормалью). Эту матрицу называют TBN-матрицей или котангенс-фреймом. Единственный существенный недостаток метода – необходимость предварительно вычислять и хранить тангенс-векторы для вершин (бинормаль вычисляется векторным произведением нормали и тангенса). Эту проблему отчасти решили в 2013 году (см. далее).

2001-2003 – Normal mapping в играх

Разумеется, во времена публикации первых теоретических статей normal mapping еще не мог быть полноценно реализован в реальном времени, так как видеоускорители находились в зачаточном состоянии и не могли выполнять произвольные попиксельные операции. Одной их первых машин, на которых это стало возможно, была PixelFlow, разработанная в Университете Северной Каролины (США), затем среди инженеров популярность получили рабочие станции SGI, которые могли выполнять параллельный многопроходный рендеринг. Первыми игровыми консолями, в которых normal mapping был реализован аппаратно, были Sega Dreamcast и Xbox (2001), а в играх для ПК эта техника начала применяться около 2003 года – так, одной из самых популярных игр с использованием проецирования нормалей стала Doom 3 (2004). Толчок развитию техники дало появление программируемого конвейера и пиксельных шейдеров.

2001 – Parallax mapping

Сам по себе псевдорельеф с использованием проецирования нормалей не учитывает изменение изображения в зависимости от угла, под которым зритель видит поверхность – более близкие к зрителю детали поверхности должны перекрывать дальние. Этот эффект может быть достигнут при помощи техники parallax mapping (параллакс-отображение). Идея состоит в том, чтобы получать текстурные координаты той точки, где видовой вектор пересекает поверхность в рассматриваемой «виртуальной точке», смещенной с учетом рельефа. В идеале для этого нужна трассировка лучей карты высот, но если поверхность не имеет слишком сильно изменяющихся значений, то можно обойтись аппроксимацией без использования трассировки. Техника была предложена в статье «Detailed Shape Representation with Parallax Mapping» (Т. Канеко и др., 2001).

2004-2005 – Parallax occlusion mapping

Усовершенствованный вариант parallax mapping'а. Оригинальный parallax mapping дает заметные артефакты при увеличении максимальной высоты рельефа. Parallax occlusion mapping использует raymarching (итеративную трассировку лучей) карты высот для уточнения точки пересечения видового вектора с поверхностью – в результате иллюзия рельефности становится значительно более убедительной. Недостатком метода является сравнительно высокая вычислительная нагрузка. Изобретателем техники является американский графический инженер Наталия Татарчук. Презентация была проведена на SIGGRAPH 2005, затем техника использовалась компанией ATI в демонстрации «Toy Shop Demo» для демонстрации возможностей Shader Model 3.0 на видеокартах Radeon X1800.

2009-2014 - Аппаратная тесселяция и displacement mapping

Тесселяция – это процесс повышения детализации полигональной сетки. Аппаратная тесселяция дебютировала в 2005 году в графическом процессоре Xbox 360, затем ATI интегрировали похожий блок тесселяции и в десктопные видеокарты серии HD2000. Широкое распространение в играх она начала получать с выходом Direct3D 11 (2009) и OpenGL 4.0 (2010) – в конце нулевых появились первые демки техники displacement mapping (смещающего отображения) в реальном времени на геометрических шейдерах. Основная идея метода: 3D-поверхность разбивается на более мелкие полигоны, которые смещаются вертикально по карте высот, либо вертикально и горизонтально по карте смещений (displacement map). Результатом становится не просто иллюзия рельефа на плоскости, но уже настоящий 3D-рельеф – правда, ценой увеличения вычислительной нагрузки для рендеринга высокополигональной сетки. К сожалению, отсутствие поддержки геометрических шейдеров в OpenGL ES долгое время ограничивало применение этой техники на всех платформах – ситуация изменилась лишь с выходом OpenGL ES 3.1 в 2014 году.

2013 – Normal mapping без предрассчитанных векторов касательных

Вычислять и хранить дополнительный вершинный атрибут для касательных – довольно накладно и не очень удобно. Повышение вычислительной мощности видеокарт позволили получать котангенс-фрейм в реальном времени в шейдере путем частного дифференцирования позиции и текстурных координат. Этот метод был описан в статье «Normal Mapping Without Precomputed Tangents» (Р. Баслер, 2013). Статья включает не только теоретическое описание метода, но и реализацию на языке GLSL (функцию cotangent_frame), которая с тех пор широко используется в 3D-движках. Недостатком метода являются заметные швы в местах разрыва текстуры (что математически эквивалентно разрывам функции – точкам, в которых функция недифференцируема), поэтому лучше всего этот метод себя показывает на угловатых моделях с текстурными разрывами в местах сгиба.


Copyright © 2008-2023 Тимур Гафаров и соавторы. Доступно по СС BY-NC-SA 3.0.