В данной статье объясняется, почему на определенном уровне визуализации
появляются ошибки или артефакты, вызванные процессом наложения текстур на
трехмерные объекты, а так же представляются концепции использования
текстур с различными уровнями детализации (mip-mapping) и с применением
трилинейной фильтрации (trilinear filtering), как панацеи от возникновения
ошибок (артефактов) при визуализации. В статье также кратко рассказывается
о существующем положении вещей в индустрии компьютерной графики с точки
зрения поддержки мип-маппинга и трилинейной фильтрации, а так же
оцениваются некоторые предлагаемые альтернативные решения.
Применяемая повсеместно в индустрии 3D графики, технология наложения текстур, используется для визуализации трехмерных сцен с высокой степенью детализации и имеет относительно невысокую стоимость для конечного пользователя. Технология заключается в проецировании изображения на трехмерную поверхность, таким образом, обеспечивается дополнительная детализация 3D объекта без усложнения его геометрии. Впрочем, когда изображение используется в качестве текстуры, накладываемой на 3D примитив, проявляется множество разнообразных ошибок визуализации, называемых артефактами. На протяжении нескольких лет было разработано множество различных технологий, которые уменьшают количество подобных артефактов визуализации, а самая распространенная из используемых сегодня технологий -- это билинейная фильтрация (bilinear filtering).
Билинейная фильтрация это техника устранения искажений изображения (фильтрация), таких, как "блочности" текстур при их увеличении. При медленном вращении или движении объекта (приближение/удаление) могут быть заметны "перескакивания" пикселов с одного места на другое, т.е. появляется блочность. Во избежании этого эффекта применяют билинейную фильтрацию, при использовании которой для определения цвета каждого пикселя берется взвешенное среднее значение цвета четырех смежных текселей и в результате определяется цвет накладываемой текстуры. Результирующий цвет пикселя определяется после осуществления трех операций смешивания: сначала смешиваются цвета двух пар текселей, а потом смешиваются два полученных цвета.
Впрочем, существует целый класс артефактов визуализации, появляющихся в
результате наложения текстур и известный под названием "depth aliasing"
(депт-алиасинг, ошибки определения глубины сцены, другое название
Z-aliasing), от которых билинейная фильтрация не избавляет и не может
избавить.
Треугольник формируется путем наложения текстурного изображения на трехмерную поверхность.
Ошибки "depth aliasing" возникаю в результате того факта, что объекты более отдаленные от точки наблюдения, выглядят более маленькими на экране. Если объект двигается и удаляется от точки наблюдения, текстурное изображение, наложенное на уменьшившийся в размерах объект становится все более и более сжатым. В конечном счете, текстурное изображение, наложенное на объект, становится настолько сжатым, что появляются ошибки визуализации. Эти ошибки визуализации особенно нежелательны в анимации, где такие артефакты во время движения становятся причиной мерцания и эффекта медленного движения в той части изображения, которая должна быть неподвижной и стабильной.
В качестве иллюстрации к описанному эффекту могут служить следующие
прямоугольники с билинейным текстурированием:
Рис. 2A (Левый сверху): Прямоугольник состоит из двух
треугольников, текстурированных изображением шахматной доски. Обратите
внимание на то, как ширина и высота каждого квадрата уменьшается при
движении от ближайшей стороны прямоугольника, которая ближе к точке
наблюдения, до дальней стороны прямоугольника.
Рис. 2B (Правый сверху): На увеличенном изображении, сразу напротив
серой стрелки, можно заметить, что состоящая из нескольких пикселов
сторона квадратов по вертикали (высоты) уменьшаются и в итоге состоят
всего лишь из одного или двух пикселей. Как только вертикальная сторона
квадрата (высота) сокращается по длине до двух пикселей, напротив голубой
стрелки, обратите внимание на появление артефактов "depth-aliasing"
выражающихся в том, что несколько квадратов сливаются в один.
Для избежания ошибок "depth aliasing" и имитации того факта, что объекты на расстоянии выглядят менее детализированными, чем те, что находятся ближе к точке наблюдения, используется техника, известная как mip-mapping. Если говорить кратко, то mip-mapping - наложение текстур, имеющих разную степень или уровень детализации, когда в зависимости от расстояния до точки наблюдения выбирается текстура с необходимой детализацией.
Mip-текстура (mip-map) состоит из набора заранее отфильтрованных и масштабированных изображений. В изображении, связанном с уровнем mip-map, пиксель представляется в виде среднего четырех пикселей из предыдущего уровня с более высоким разрешением. Отсюда, изображение связанное с каждым уровнем mip-текстуры в четыре раза меньше по размеру предыдущего mip-map уровня.
Изображения, связанные с каждым mip-map уровнем волнообразной текстуры показаны ниже.
Степень или уровень детализации - Level of Detail или просто LOD, используются для определения, какой mip-map уровень (или какую степень детализации) следует выбрать для наложения текстуры на объект. LOD должен соответствовать числу текселей накладываемых на пиксель (т.е. какое количество элементов текстуры должно быть наложено на элемент выводимого на экран изображения). Например, если текстурирование происходит с соотношением близким к 1:1, то LOD будет 0, а значит и будет использоваться mip-map уровень с самым высоким разрешением. Если 4 текселя накладываются на один пиксель, то LOD будет 1 и будет использоваться следующий mip уровень с меньшим разрешением. Обычно, при удалении от точки наблюдения, объект, заслуживающий наибольшего внимания имеет более высокое значение LOD.
Ниже представлен прямоугольник, использовавшийся в первом примере,
только теперь наложение текстур произведено с использованием техники
mip-mapping. Обратите внимание, что ошибки визуализации "depth aliasing"
исчезли и на расстоянии стороны прямоугольника выглядят размытыми, как и
должно быть.
Рис. 4A (Левый сверху): Прямоугольник из первого примера. Обратите
внимание отсутствие ошибок "depth aliasing".
Рис. 4B (Правый сверху): При увеличении удаленной части прямоугольника,
хорошо заметна размытость.
Если для каждого пикселя в треугольнике вычисляется значение LOD для определения того, какая mip-текстура имеет нужный уровень фильтрации, то в результате предотвращается появление ошибок визуализации и излишней размытости. LOD должен вычисляться для каждого пикселя в треугольнике с целью избежания разрывов по краям треугольников. Этот метод называется per-pixel mip-mapping (попиксельное mip-текстурирование).
Если же LOD вычисляется всего лишь раз для всего треугольника, то
следствием использование этого значения для всех пикселей треугольника
становится появление странного эффекта растрескивания, когда некоторые
треугольники, из которых состоит анимированный объект, вдруг внезапно
становятся чрезмерно размытыми или с неровностями. Этот дешевый, менее
эффективный метод mip-текстурирования известен как "per-polygon
mip-mapping" (т.е. mip-текстурирование по каждому полигону).
В то время, как mip-текстурирование решает проблему ошибок "depth-aliasing", его использование может стать причиной появления других артефактов. Для борьбы с этими артефактами используются различные техники фильтрации. При удалении объекта все дальше от точки наблюдения, происходит переход от низкого mip-map уровня (соответствующего изображению с высокой детализацией) к высокому mip-map уровню (соответствующего изображению с высокой степенью фильтрации и низкой детализацией). В момент нахождения объекта в переходном состоянии от одного mip-map уровня к другому, появляется особый тип ошибок визуализации, известных под названием "mip-banding" (мип-бендинг) -- полосатость или слоеность, т.е. явно различимые границы перехода от одного mip-map уровня к другому.
"Mip-banding" имеет место, когда значение LOD округляется до целого и только один соответствующий уровень mip-текстуры используется для генерации пикселя. После перехода LOD к более высокому уровню состоящему из треугольников, соседние пиксели будут генериться с различными mip уровнями и будут иметь совершенно различное количество примененных к ним фильтров. Результатом является появление линии или нескольких линий проходящих через треугольник в местах, где происходит внезапный переход между mip уровнями. Это один из недостатков использования только билинейного или по-точечного mip-текстурирования.
Эта проблема проиллюстрирована на картинках ниже. Обратите внимание,
что это тот же прямоугольник из предыдущего примера, но теперь
текстурированный волнообразным изображением с использованием
mip-текстурирования. Обратите внимание, как проявляется "mip-banding" в
местах, обозначенных красными стрелками. На увеличенном изображении легко
заметить, что эти ошибки визуализации проявляются как раз в тех местах,
где происходит переход от одного уровня детализации к следующему.
Рис. 5A (левый сверху): Прямоугольная лента состоит из двух
треугольников, текстурированных волнообразным изображением. Обратите
внимание на "mip-banding" артефакты, обозначенные красными стрелками.
Рис. 5B (правый сверху): Увеличенная часть изображения в местах
проявления ошибок "mip-banding".
Особенно остро проблема наличия ошибок "mip-banding" стоит в анимации,
за счет того, что человеческий глаз очень чувствителен к смещениям и может
легко заметить место резкого перехода между уровнями фильтрации при
движении вокруг объекта.
Трилинейная фильтрация (trilinear filtering) представляет собой технику, которая удаляет артефакты "mip-banding", возникающие при использовании mip-текстурирования. При трилинейной фильтрации для определения цвета пикселя берется среднее значение цвета восьми текселей, по четыре из двух соседних текстур и в результате семи операций смешивания определяется цвет пикселя. При использовании трилинейной фильтрации возможен вывод на экран текстурированного объекта с плавно выполненными переходами от одного mip уровня к следующему, что достигается за счет определения LOD путем интерполяции двух соседних mip-map уровней. Таким образом решая большинство проблем, связанных с mip-текстурированием и ошибками из-за неправильного расчета глубины сцены ("depth aliasing").
Пример использования трилинейной фильтрации приведен ниже. Здесь опять
используется все тот же прямоугольник, текстурированный волнообразным
изображением, но с плавными переходами от одного mip уровня к следующему
за счет использования трилинейной фильтрации. Обратите внимание на
отсутствие каких-либо заметных ошибок визуализации.
Рис. 6A (левый сверху): Прямоугольник текстурированный
волнообразным изображением, выведен на экран с использованием
mip-текстурирования и трилинейной фильтрации.
Рис. 6B (правый сверху): Увеличим полученное изображение; обратите
внимание на отсутствие артефактов визуализации.
Далее вы сможете посмотреть на другой пример, показывающий преимущества
от использования трилинейной фильтрации. В качестве источника был взят
тестовый пакет от Ziff-Davis. В первом случае трилинейная фильтрация не
применялась и нетрудно заметить "mip-banding" там, где желтая разметка
дороги достигает изгиба шоссе (см. рис. ниже). Заметим, что проблема
встает более остро при анимационном изображении.
Во втором случае применялась трилинейная фильтрация; нетрудно заметить,
что желтая разметка дороги постепенно и плавно исчезает в месте изгиба
шоссе (см. рис. ниже). Кликнув на левое изображение вы сможете увидеть
увеличенный проблемный участок. Заметим, что при анимации проблем с
изображением тоже не будет.
С момента появления, mip-текстурирование стало широко распространенным стандартом в области трехмерной графики. Графические чипсеты, поддерживающие mip-текстурирование, сегодня делают большинство производителей. Однако, широкое применение хорошо реализованной трилинейной фильтрации началось только в чипсетах, выпущенных на рынок в этом году. Несмотря на то, что некоторые производители заявляют о поддержке трилинейной фильтрации, зачастую это реализуется за счет двухпроходного рендеринга -- кстати очень эффективного способа снижения значений fill rate почти в два раза, из-за того, что графический чипсет вынужден обрабатывать каждый пиксель дважды. Заметим, что вывод изображения в два приема означает, что при втором наложении текстуры должно происходить смешивание с уже наложенной текстурой за первый проход. В дополнение к сказанному, стоит заметить, что в некоторых чипсетах, реализациях трилинейной фильтрации выполнена так, что она не используется в комбинации с некоторыми другими трехмерными функциями.
Другой способ относительно корректной трилинейной фильтрации это размытие (dither) переменной LOD так, что только один mip уровень используется для отображения каждого пикселя. Не смотря на то, что до некоторой степени это снижает проблему ошибок "mip banding", этот способ имеет нежелательный эффект, выражающийся в появлении уродливо размытых узоров при использования некоторых mip-текстур.
Для снижения стоимости и сложности аппаратной части, связанной с корректной реализацией трилинейной фильтрации и вычислений LOD для каждого пикселя, некоторые производители графических чипсетов предлагают использовать дешевую альтернативу, известную под именем "per polygon mip-mapping" (mip-текстурирование каждого многоугольника). В этом решении используется одно значение LOD для всех пикселенй в каждом полигоне (обычно в качестве полигонов используются треугольники), что позволяет избавиться от ошибок "mip-banding" внутри полигона. Однако, это решение не избавляет от "mip-banding". Артефакты, вместо проявления внутри каждого полигона, теперь проявляются на границах полигонов. Следствием использования "per polygon mip-mapping" является появление странного эффекта растрескивания, когда некоторые полигоны, из которых состоит объект, при анимации неожиданно становятся расплывчатыми или ступенчатыми.
Другая проблема при использовании "per-polygon mip-mapping" состоит в том, что mip уровень некоторых полигонов может отличаться от нескольких уровней внутри самого полигона. Совершенно невозможно выбрать только один mip уровень для полигона, который бы сразу избавил от эффектов неровностей (aliasing) для всех пикселей внутри полигона без появления расплывчатости некоторых других пикселей. "Per-polygon mip-mapping" требует больше вычислений, но при этом результат получается далеким от идеального, так как данная техника не избавляет от обоих указанных проблем.
Следующие ниже примеры иллюстрируют недостатки "per-polygon
mip-mapping". Изображение "А" иллюстрирует ситуацию, когда mip-map уровень
в треугольниках слишком высок и очень много деталей теряются в области
прямоугольной ленты ближней к точке наблюдения. Изображение "В"
иллюстрирует ситуацию, когда mip-map уровень в треугольниках ниже, чем в
предыдущем примере, что должно снизить расплывчатость и восстановить
некоторые детали, однако появился другой отрицательный эффект - "depth
aliasing", который можно заметить на дальней от точки наблюдения стороне
прямоугольной ленты. В завершении, как компромисс, вы можете посмотреть на
два треугольника (которые формируют прямоугольную ленту), имеющие
различные mip-map уровни, на изображении "С". Теперь присутствует
"mip-banding" артефакт, имеющий место на границе двух треугольников. Более
того, на изображении "С" проблемы ошибки вычисления глубины сцены
("depth-aliasing") и потеря деталей все еще вполне очевидны.
Рис. 7A (левый верхний): Прямоугольник текстурированный
изображением шахматной доски под воздействием "per-polygon mip-map" уровня
фильтрации. "Per-polygon mip-map" уровень слишком высокий и произошла
потеря деталей на ближней стороне прямоугольника.
Рис. 7B (правый верхний): Прямоугольник текстурированный изображением
шахматной доски под воздействием "per-polygon mip-map" уровня фильтрации.
В этом случае "per-polygon mip-map" уровень слишком низкий и сразу
появляются ошибки вычисления глубины сцены -- "depth-aliasing".
Рис. 7C (нижний): Прямоуголник текстурированный изображением шахматной
доски под воздействием "per-polygon mip-map" уровня фильтрации. В этом
случае "per-polygon mip-map" уровень выбран компромиссным между
применявшимися в примерах "А" и "В" -- а именно, один треугольник имеет
высокий mip-map уровень, в то время как другой треугольник имеет низкий
mip-map уровень. В этом случае проявляется "mip-banding" на границе между
двумя треугольниками. Более того, все еще ясно различимо присутствие
"depth-aliasing" и потеря деталей.
В лучшем случае, техника "per-polygon mip-mapping" представляет собой низкокачественную замену для попиксельного mip-текстурирования. В худшем случае, следствием применения "per-polygon mip-mapping" является появление нового набора ошибок визуализации без избавления при этом от проблем, присущих наложению текстур. Без аппаратной реализации поддержки вычислений LOD для каждого пикселя, не существует способа предотвратить появление "mip banding" используя трилинейную фильтрацию.
Одной из альтернатив трилинейной фильтрации является анизотропная
фильтрация (anisotropic filtering). Анизотропная фильтрация представляет
собой продвинутую технику, следствием применения которой, при корректной
реализации, является появление лишь нескольких ошибок визуализации, по
сравнению с использованием трилинейной фильтрации. Анизотропная фильтрация
может быть реализована с помощью использования выборки по шаблонам
(over-sampling или оверсемплинг), в качестве которых могут выступать
тексели. Идея в том, что для наложении текстуры на пиксель используется
больше текселей, причем количество используемых текселей зависит от
применяемого алгоритма. Тем не менее, применение over-sampling серьезно
влияет на производительность графического чипсета. Для примера,
восьмикратный over-sampling (т.е. когда для наложения текстуры
используется восемь текселей) может снизить частоту смены кадров в
приложении в восемь раз или больше, по сравнению с тем, что было бы без
использования over-sampling. Как следствие, пока не существует решения
пригодного для использования анизотропной фильтрации в режиме реального
времени. Тем не менее, этот тип фильтрации будет со временем
использоваться в приложениях, таких, как например интерфейсы GDI2000 и
Chrome от Microsoft. Но, скорее всего, случится это не раньше 2000, так
как пока нет приложений, которые могут использовать преимущества
анизотропной фильтрации.
Пока быстрая, корректно реализованная трилинейная фильтрация была недоступна до недавнего времени, большинство приложений должны были использовать билинейную фильтрацию для обеспечения минимального качества изображения. Хорошая реализация попиксельного mip-текстурироваания тоже встречалась нечасто до недавнего времени. По этим причинам, использование трилинейного mip-текстурирования было довольно редким, но зато запоминающимся, явлением, благодаря легкости в использовании и стабильному изображению получавшегося в результате.
В настоящее время поддержка трилинейной фильтрации стала стандартной функцией графических чипсетов, так как она обеспечивает вывод трехмерного изображения с высоким качеством при наличии известного количества артефактов визуализации. Более того, все больше и больше появляется графических чипсетов, реализующих трилинейную фильтрацию без ущерба общей производительности, т.е. показатель fill rate не снижается. В общем, очевидно, что графические чипсеты, которые поддерживают трилинейную фильтрацию наряду с высокой скоростью заполнения пикселями текстур, будут обеспечивать наивысшее качество визуализации трехмерной графики в ближайшем будущем.