Фильтрация и MIP Mapping - Компьютерная графика и ее аппаратная реализация (обзор видеокарт)

При работе с текстурами существует немало проблем. У экрана есть свое разрешение и определенное количество пикселей, которые на нем можно отобразить в данной области экрана. Но в соответствующей области виртуального мира количество текселов (текстурных пикселов) может быть и больше, и меньше, чем на экране. Если текстура двумерная и параллельна поверхности экрана, то мудрить ни к чему: каждый тексел перенесется на экран "как есть". Но что делать, если на какую-то область экрана приходится текселов больше, чем возможных пикселов? Какой цвет назначить пикселу, на который в сцене приходится несколько разноцветных текселов? Еще хуже, если луч от пиксела на экране попадает между текселами на сцене, то есть текселов меньше, чем пикселов. Что тогда делать?

Задача формулируется так: как определить цвет конкретного пиксела на экране, если в сцене на него приходится меньше или больше текселов. На заре трехмерной графики эту задачу решали методом, который называется Point Sampling. От каждого пиксела на экране опускается луч вглубь сцены. Тексел, который ближе всех оказывается к этому лучу, и накладывается на экран. При этом неизбежно возникают ошибки. Если текселов на каждый пиксел слишком много, часть информации просто теряется. Если же на пиксел приходится меньше одного тексела (когда объект расположен близко к камере), пробелы восполняются несуществующими пикселами. На практике это выглядит так: когда игрок приближается к объекту, то с удивлением замечает, что виртуальные пикселы его текстуры становятся просто гигантских размеров. Да и само изображение распадается на пикселы, как будто на большом экране поставили маленькое разрешение.

Такой низкокачественный метод современного игрока не устраивает, поэтому существуют методы так называемой билинейной фильтрации (Bi-Linear Filtering). Билинейная фильтрация это техника устранения искажений изображения (фильтрация), таких, как "блочности" текстур при их увеличении. При медленном вращении или движении объекта (приближение/удаление) могут быть заметны "перескакивания" пикселов с одного места на другое, т. е. появляется блочность. Во избежании этого эффекта применяют билинейную фильтрацию, при использовании которой для определения цвета каждого пикселя берется взвешенное среднее значение цвета четырех смежных текселей и в результате определяется цвет накладываемой текстуры. Результирующий цвет пикселя определяется после осуществления трех операций смешивания: сначала смешиваются цвета двух пар текселей, а потом смешиваются два полученных цвета.

Поэтому вместо того чтобы определять цвет пиксела по одному текселу, его цвет получается в результате интерполяции (усреднения) цветов четырех соседних текселов. Если объект расположен далеко от камеры, его текстура почти не искажается. А когда объект недалеко от камеры, и текселов не хватает, интерполяция создает расплывчатое изображение этой области. Билинейная фильтрация хорошо работает только для полигонов, которые параллельны или почти параллельны экрану. Дело в том, что четыре соседних тексела, которые берутся для интерполяции, -- это почти круг. Если плоскость наклоняется, круг медленно, но неумолимо превращается в эллипс. Но интерполируются текселы по-прежнему по кругу. От этого постоянно накапливаются небольшие ошибки. После определенного угла наклона ошибки становятся уже заметными, текстура фильтруется геометрически неправильно, наблюдаются сильные искажения., называемых артефактами. Впрочем, существует целый класс артефактов визуализации, появляющихся в результате наложения текстур и известный под названием "depth aliasing" (депт-алиасинг, ошибки определения глубины сцены, другое название Z-aliasing), от которых билинейная фильтрация не избавляет и не может избавить. Ошибки "depth aliasing" возникают в результате того факта, что объекты более отдаленные от точки наблюдения, выглядят более маленькими на экране. Если объект двигается и удаляется от точки наблюдения, текстурное изображение, наложенное на уменьшившийся в размерах объект становится все более и более сжатым. В конечном счете, текстурное изображение, наложенное на объект, становится настолько сжатым, что появляются ошибки визуализации. Эти ошибки визуализации особенно нежелательны в анимации, где такие артефакты во время движения становятся причиной мерцания и эффекта медленного движения в той части изображения, которая должна быть неподвижной и стабильной.

Есть и еще одна проблема: если игрок видит текстуру намного дальше или намного ближе, чем предполагал разработчик, текстура очень сильно корежится фильтрацией. До поры до времени это не заметно, но со временем в рисунок текстуры закрадываются сильные искажения, своеобразные "помехи". Обе проблемы надо было решать, и решение быстро нашлось в симбиозе двух технологий: трилинейной фильтрации (Tri-Linear filtering) и мип-мэппинга (MIP Mapping).

Для избежания ошибок "depth aliasing" и имитации того факта, что объекты на расстоянии выглядят менее детализированными, чем те, что находятся ближе к точке наблюдения, используется техника, известная как mip-mapping. Если говорить кратко, то mip-mapping - наложение текстур, имеющих разную степень или уровень детализации, когда в зависимости от расстояния до точки наблюдения выбирается текстура с необходимой детализацией.

Mip-текстура (mip-map) состоит из набора заранее отфильтрованных и масштабированных изображений. В изображении, связанном с уровнем mip-map, пиксель представляется в виде среднего четырех пикселей из предыдущего уровня с более высоким разрешением. Отсюда, изображение связанное с каждым уровнем mip-текстуры в четыре раза меньше по размеру предыдущего. Данная версия текстуры называется мип-уровнем, а все мип-уровни вместе -- мип-каскадом. Когда игрок удаляется от текстуры, она сменяется на мип-уровень с меньшим разрешением, а когда приближается -- с большим. Плюсов у этой технологии много. Во-первых, текстура отображается без геометрических искажений. Во-вторых, далеко расположенные текстуры не используют лишние акселераторные ресурсы. Но есть и существенные недостатки. В памяти приходится хранить несколько копий одной и той же текстуры. Переходы между мип-уровнями выполняются резко. Еще год назад вы могли наблюдать в не очень качественных играх характерный артефакт -- полосы мип-мэппинга, выражающиеся в резких переходах между разными версиями одной текстуры.

По-настоящему востребованной оказалась технология, совмещающая MIP Mapping и билинейную фильтрацию и добавляющая в этот процесс несколько новых этапов. Речь идет о трилинейной фильтрации. Цвет конкретного пиксела на экране определяется в результате интерполяции цветов текселов двух соседних мип-уровней. При этом над каждым мип-уровнем предварительно проводится билинейная фильтрация, а для интерполяции берутся не 4, а 8 соседних текселов. За счет этого переход между мип-уровнями становится плавным и незаметным. Трилинейная фильтрация (trilinear filtering) представляет собой технику, которая удаляет артефакты "mip-banding", возникающие при использовании mip-текстурирования. При трилинейной фильтрации для определения цвета пикселя берется среднее значение цвета восьми текселей, по четыре из двух соседних текстур и в результате семи операций смешивания определяется цвет пикселя. При использовании трилинейной фильтрации возможен вывод на экран текстурированного объекта с плавно выполненными переходами от одного mip уровня к следующему, что достигается за счет определения LOD путем интерполяции двух соседних mip-map уровней. Таким образом решая большинство проблем, связанных с mip-текстурированием и ошибками из-за неправильного расчета глубины сцены ("depth aliasing").

С самого начала предполагалось, что разработчики сами должны озаботиться созданием текстур разной степени детализации для разных мип-уровней. Однако разработчики очень часто либо ленятся и добавляют в игру слишком мало мип-уровней, либо вообще не создают мип-уровней, оставляя одну базовую текстуру. Но и на таких недобросовестных разработчиков нашлась своя управа -- авто-мип-мэппинг. Итог: если в игре вам предложат выбрать между билинейной и трилинейной фильтрацией, выбирайте трилинейную, но не надейтесь на чудо.

Венцом эволюции стала анизотропная фильтрация (Anisotropic filtering) -- самая сложная и ресурсоемкая из всех. После всех предыдущих фильтраций и мип-мэппингов все еще остается одна проблема. Более или менее красиво эти алгоритмы работают для текстур, которые располагаются параллельно экрану. Если текстура сильно наклонена, фильтрация в одном направлении выполняется больше, чем надо, а в другом -- меньше. Поэтому и появилась анизотропная фильтрация. Анизотропная фильтрация представляет собой продвинутую технику, следствием применения которой, при корректной реализации, является появление лишь нескольких ошибок визуализации, по сравнению с использованием трилинейной фильтрации. Анизотропная фильтрация может быть реализована с помощью использования выборки по шаблонам (over-sampling или оверсемплинг), в качестве которых могут выступать тексели. Идея в том, что для наложении текстуры на пиксель используется больше текселей, причем количество используемых текселей зависит от применяемого алгоритма. Тем не менее, применение over-sampling серьезно влияет на производительность графического чипсета. Для примера, восьмикратный over-sampling (т. е. когда для наложения текстуры используется восемь текселей) может снизить частоту смены кадров в приложении в восемь раз или больше, по сравнению с тем, что было бы без использования over-sampling..

Во-первых, можно решить проблему "в лоб". Если восьми текселов на пиксел не хватает, почему бы не интерполировать 16, а то и 32? В результате текстура отображается красиво даже на сильно наклоненных поверхностях. Но даже сейчас очень мало акселераторов, которые могут справиться с такими объемами информации, ведь требуется гигантская ширина пропускания памяти. Во-вторых, некоторые разработчики пытаются решить проблему умом. Сцена рендерится не целиком, а "плитками", например, 32х32 пиксела. Для каждой плитки (тайла) применяются очень сложные алгоритмы, которые "делают нам красиво".В настоящее время поддержка трилинейной фильтрации стала стандартной функцией графических чипсетов, так как она обеспечивает вывод трехмерного изображения с высоким качеством при наличии известного количества артефактов визуализации. Более того, все больше и больше появляется графических чипсетов, реализующих трилинейную фильтрацию без ущерба общей производительност. В общем, очевидно, что графические чипсеты, которые поддерживают трилинейную фильтрацию наряду с высокой скоростью заполнения пикселями текстур, будут обеспечивать наивысшее качество визуализации трехмерной графики в ближайшем будущем

Итак, как мы выяснили, текстура прибавляет реалистичности изображению. Но все равно не может полностью заменить сложные полигональные поверхности, которые выглядят значительно лучше. Ведь для них просчитываются перспектива и тени. С другой стороны, и ресурсов эти поверхности требуют много.

Разработчики долгое время пытались найти компромисс между качеством и производительностью -- и придумали bumpmapping. Он позволяет создавать объекты с реалистичной рельефной поверхностью с помощью рельефных карт. Кроме самой текстуры, разработчик готовит карту высот (height map), которая описывает рельеф в виде высот, или же карту смещений нормалей (normal dispmap), описывающую рельеф с помощью нормалей.

Рельефные карты бывают двух видов: карты освещенности и карты смещений. Карта освещенности содержит светлые и темные пятнышки, которые символизируют неоднородность освещения из-за неоднородности рельефа. Карта смещений задает искажения для environment map Рельефные карты обоих типов накладываются на основную текстуру альфа-смещением. Игроку кажется, что поверхность действительно рельефна.

Похожие статьи




Фильтрация и MIP Mapping - Компьютерная графика и ее аппаратная реализация (обзор видеокарт)

Предыдущая | Следующая