Прямое MIP-текстурирование

Вайбер на компьютер 24.05.2019

Как видим, билинейная фильтрация выглядит несколько лучше, нежели Point Sampling. И всё же она очень далека от идеала.

Tri-Linear filtering

Tri-Linear filtering – трилинейная фильтрация, представляет собой симбиоз билинейной фильтрации и mip-текстурирования. Прежде чем говорить об алгоритме работы трилинейной фильтрации, давайте выясним, что такое МIP-текстурирование. MIP-текстурирование, или mip-mapping, – это метод уменьшения объёма вычислений, необходимых для точного наложения текстурного изображения на полигон. По сути, мипмеппинг выполняет те же задачи, что и Point Sampling, но делает это на порядок лучше. MIP-текстурирование призвано избавить нас от ухудшений изображений, когда несколько текселей накладываются на один пиксель.

Посмотрим на проблему глобальней и попробуем найти решение всему этому. Для того чтобы правильно вывести пиксель на экран, необходимо скомбинировать значения всех текселей, которые и будут накладываться на этот пиксель. Но пропускная способность памяти не бесконечна, а это огромнейший обьём работы, который неблагоприятно отразится на быстродействии вашей видеокарты. Mip-mapping способствует снижению объёмов этой работы. Метод MIP-текстурирования основан на генерации и хранении множества версий исходного текстурного изображения. Эти версии имеют большое количество разрешений, каждое из которых всё меньше и меньше исходного. Во время текстурирования пикселя вам достаточно выбрать версию текстурного изображения. В вашем распоряжении есть 4 близлежащих текселея из текстурного изображения, больших по размеру, чем пиксель, и столько же текселей, меньших по размеру, чем пиксель. По сути, mip-уровни представляют собой заранее рассчитанные, более маленькие версии исходной текстуры, из-за чего обеспечивается лучшая аппроксимация.

Итак, мы выяснили, что такое mip-mapping, теперь вернёмся к нашей трилинейной фильтрации. Как мы уже говорили, Tri-Linear filtering представляет собой симбиоз билинейной фильтрации и mip-текстурирования. По сути, билинейная фильтрация производится на двух mip-уровнях. А в итоге мы имеем 2 текселя, по одному для каждого mip-уровня. Цвет пикселя определяется при помощи интерполяции по цветам двух mip-текстур.

В итоге имеем несколько лучшее качество фильтрации, нежели у билинейной. Стоит отметить, что качество улучшается незначительно, а требования к ширине полосы пропускания памяти в сравнении с той же Bi-Linear Filtering удваиваются.

Anisotropic filtering

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

Вполне очевидно – для того чтобы добиться лучшего качества, необходимо использовать все пиксели светового пятна с усреднённым значением. Существуют техники фильтрации, которые применяют от 16 до 32 текселей для определения цвета пикселя. Мы также должны учитывать тот факт, что форма светового пятна изменяется вместе с изменением положения полигона относительно точки наблюдения. Собственно говоря, этим и предлагает пользоваться анизотропная фильтрация.

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

Помимо всего этого, Anisotropic filtering предлагает задействовать разнообразные фильтры для аппроксимации формы светового пятна. Эти фильтры имеют форму эллипса для нескольких возможных углов положения полигона.

В видеорешениях, использующих тайловую (тайл, говоря простым языком, – участок изображения опредёленного размера, как правило, 32х32 пикселя) архитектуру, благодаря применению тайлов, существенно экономятся ресурсы полосы пропускания памяти, что позволяет использовать анизотропную фильтрацию без значимых потерь быстродействия. При помощи анизотропной фильтрации можно получить лучшее качество изображения. Оно достигается за счёт более точного представления текстур и улучшенной глубины детализации.

Уровень анизотропной фильтрации определяется числом текселей, которые обрабатываются при вычислении конечного пикселя. Современные графические решения позволяют выставить уровень фильтрации в драйвере. Самыми распространёнными уровнями фильтрации являются 2x (16 текселей), 4x (32 текселя), 8x (64 текселя) и 16x (128 текселей). Очевидно, что при повышении уровня анизотропной фильтрации нагрузка на полосу пропускания памяти также увеличивается, а это неминуемо сказывается на производительности.

Оптимизации анизотропной и трилинейной фильтраций сегодня

Компании-разработчики графических чипов ATI и NVIDIA всё время стараются выжать дополнительную производительность из своих продуктов. Что, в общем-то, очевидно и оправдано – конкуренцию между двумя гигантами-производителями графических процессоров никто не отменял. Для достижения своих целей вендоры применяют различные оптимизации, которые позволяют увеличить производительность графических решений. Однако зачастую оптимизации повышают производительность, но снижают качество картинки. Увы, но поговорка «сделать быстрей – не значит сделать лучше» очень часто актуальна для ситуации с различными оптимизациями ATI и NVIDIA.

Разработчики пытаются играть на всё тех же особенностях зрения человека и стараются повысить производительность за счёт слабозаметного ухудшения качества изображения. Возьмём, к примеру, брилинейную фильтрацию. Нет-нет, мы не оговорились, именно брилинейная фильтрация. Так сказать, новый вид, который появился благодаря упорным стараниям вендоров. Брилинейная фильтрация представляет собой смешанный режим фильтрации между билинейной и трилинейной – область, в которой граничат соседние mip-уровни, и которая, собственно говоря, подвергается трилинейной фильтрации, была уменьшена. Вследствие этого удалось поднять производительность, что вполне ожидаемо, ведь мы фильтруем гораздо меньше. При этом качество изображения становится хуже, однако ухудшение качества в данном случае явно оправдано, если учесть значительный выигрыш в производительности. Это отчётливо видно, если сравнивать изображения, полученные с помощью полной трилинейной фильтрации. Брилинейную фильтрацию впервые применила NVIDIA на своих видеокартах GeForce FX 5xxx Новые видеокарты GeForce 6xxx также используют брилинейную фильтрацию, однако компания NVIDIA после критики и различных дискуссий в многочисленных конференциях добавила возможность отключения оптимизации.

В недалёком прошлом продукты компании ATI славились более высоким качеством картинки, нежели таковые от NVIDIA. Однако с выходом графического процессора Radeon 9600 всё изменилось – последний, как и более новое решение Radeon X800, также использует брилинейную фильтрацию. Однако, в отличие от NVIDIA, ATI не соизволила не только объяснить процедуру фильтрации, но и не признала сам факт использования оптимизаций.

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

Однако находчивые ребята с сайта Computerbase обнаружили, что в компьютерной игре «Call Of Duty» X800 даёт меньшую частоту кадров при использовании цветных mip-текстур. После чего обозреватели Computerbase провели сравнение качества изображения. Как оказалось, при применении обычных текстур Radeon X800 использует брилинейную фильтрацию. При употреблении цветных текстур в «Call Of Duty» (1600х1200) общий показатель FPS Radeon Х800 падает на 11-13 fps.

Самое интересное, что ATI заявляет об использовании полноценной трилинейной фильтрации и рекомендует тестировщикам отключать оптимизации у конкурентов для обеспечения честного сравнения.

В интервью популярному сайту Toms Hardware Guide компания ATI всячески уходила от конкретного ответа, утверждая, что X800 использует полноценную трилинейную фильтрацию. На этом оптимизации от компании ATI не заканчиваются. Так, продукты канадской фирмы ATI используют ещё один вид оптимизации, который называется «stage optimization» – оптимизацией ступени. Метод оптимизации основан на применении «трилинейной» (брилинейной) фильтрации только к первой ступени текстуры (0). Остальные ступени 1-7 фильтруются простым билинейным методом.

Стоит отметить, что во многих играх это не критично, поскольку верхние ступени текстур являются либо картами неровностей, либо картами освещения, для которых полноценная фильтрация не критична, поэтому ухудшения изображения вы попросту не заметите. Однако есть и исключения. Популярная компьютерная игра «Unreal Tournament» использует карты деталей с высоким разрешением на ступенях 1-7, поэтому потери в качестве неизбежны.

Также стоит оговориться, что эта оптимизация функционирует только при насильственном включении анизотропной фильтрации в драйверах вашей видеокарты. Если вы оставляете выбор приложению (by application), то обеспечивается полноценная «трилинейная» (брилинейная) фильтрация ко всем ступеням текстуры.

Компания NVIDIA также стала использовать эту оптимизацию, которая появилась в драйверах версии 51.xx для карт GeForce 5xxx.

Адаптивная анизотропная фильтрация – ещё одна вариация на тему оптимизаций. Её уже давно используют продукты компании ATI. NVIDIA также не отстаёт – в GeForce 6800 эта оптимизация частично реализована.

Алгоритм адаптивной анизотропной фильтрации заключается в том, что поверхности 3D-изображения получают различный уровень анизотропной фильтрации в точке наблюдения. Такой подход позволяет существенно экономить вычислительные ресурсы и тем самым значительно повышать общий fps.

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

Вы вряд ли заметите существенное ухудшение качества от использования адаптивной анизотропной фильтрации, однако в некоторых сценах этот алгоритм немного грешит, то есть можно заметить определённую потерю качества.

Напоследок хотелось бы отметить, что вендорам было бы неплохо реализовать возможность отключения адаптивной анизотропной фильтрации.

Последнее обновление: 1.11.2015

Функция gl.texImage2D

Данный метод загружает текстуру в GPU (графический процессор на видеокарте). Он имеет следующий синтаксис: texImage2D(target, level, internalformat, format, type, elem)

    target : указывает целевой объект для загрузки текстуры

    level : уровень множественного отображения текстуры

    internalformat и format : формат и внутренний формат. В WebGL должны иметь одно и то же значение. Так, формат gl.RGBA , к примеру, показывает, что для каждого текселя на текстуре должны быть установлены цветовые каналы для красного, зеленого и синего цветов, а также альфа-канал.

    type : тип данных, которых сохраняет все данные текселей текстуры. Например, gl.UNSIGNED_BYTE указывает, что для каждого цветового канала в gl.RGBA для сохранения данных выделяется один байт.

    elem : указывает на элемент, который содержит источник текстурирования. Это может быть элемент img или Image. Это также может быть элемент HTML5 video или canvas.

Все возможные сочетания форматов и типов:

gl.UNSIGNED_BYTE

gl.UNSIGNED_BYTE

gl.UNSIGNED_SHORT_4_4_4_4

gl.UNSIGNED_SHORT_5_5_5_1

gl.UNSIGNED_SHORT_5_6_5

gl.LUMINANCE_ALPHA

gl.UNSIGNED_BYTE

gl.UNSIGNED_BYTE

gl.UNSIGNED_BYTE

Я думаю, формат gl.RGBA понятен: каждый тексель текстуры имеет канал красного, зеленого и синего цветов, а также альфа-канал. Формат gl.RGB - то же самое, только без альфа-канала.

Формат gl.LUMINANCE_ALPHA имеет канал яркости и альфа-канал. И формат gl.LUMINANCE имеет только канал яркости, а формат gl.ALPHA - только альфа-канал.

Например, настройка gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE_ALPHA, gl.LUMINANCE_ALPHA, gl.UNSIGNED_BYTE, image); даст следующий эффект:

Касательно типов тоже все просто. Тип gl.UNSIGNED_BYTE предоставляет по одному байту на каждый канал.

Тип gl.UNSIGNED_SHORT_4_4_4_4 предоставляет для каждого канала в формате RGBA по четыре байта.

Тип gl.UNSIGNED_SHORT_5_5_5_1 предоставляет для каждого каналов красного, зеленого и синего цветов в формате RGBA по пять байт, а для альфа-канала - один байт.

И тип gl.UNSIGNED_SHORT_5_6_5 предоставляет для каналов красного и синего цветов по пять байт и для зеленого цвета - шесть байт в формате RGB.

Определение параметров текстуры

Метод gl.texParameteri() позволяет определить параметры текстуры. Он имеет следующий формальный синтаксис: texParameteri(target, pname, param) . Сочетания параметров бывают разными и могут влиять на используемые значения.

    target : в зависимости от направления текстурирования может принимать значения gl.TEXTURE_2D , либо gl.TEXTURE_CUBE_MAP

    pname : указывает на фильтр, который мы хотим установить. Может принимать следующие значения: gl.TEXTURE_MAG_FILTER , gl.TEXTURE_MIN_FILTER , gl.TEXTURE_WRAP_S и gl.TEXTURE_WRAP_T

    param : предоставляет значение для фильтра pname. То есть в выражении gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); фильтру текстуры gl.TEXTURE_MAG_FILTER устанавливается значение gl.NEAREST .

    Значения, передаваемые параметром param, разнообразны и позволяют создавать определенные эффекты, которые далее мы подробно разберем.

Зачем вообще нужна настройка этих параметров? В реальности текстуры имею определенные размеры, например, 128х128. Однако поверхность объекта, на которую накладывается текстура, может иметь как большие, так и меньшие размеры. Использование фильтра gl.TEXTURE_MAG_FILTER фактически помогает определить рендеринг текстуры, если она меньше размера объекта, то ее надо увеличить.

И фильтр gl.TEXTURE_MIN_FILTER , наоборот, указывает, каким образом надо проводить рендеринг, если размеры поверхности объекта меньше размеров текстуры.

gl.NEAREST

Данное значение позволяет семплеру взять из текстуры цвет того текселя, центр которого находится ближе всего к точке, с которой семплер берет цветовые значения.

gl.LINEAR

Данный фильтр возвращает средневзвешенное значение соседних четырех пикселей, центры которых находятся ближе всего к точке, с которой семплер берет цветовые значения. Это обеспечивает цветовую плавность, плавное смешивание цветов. В то же время, поскольку здесь для определения цвета нужны значения четырех пикселей, то и работать данный фильтр будет медленне, чем gl.NEAREST, но при этом более качественней.

Это значение может быть установлено как для фильтра gl.TEXTURE_MIN_FILTER, так и для фильтра gl.TEXTURE_MAG_FILTER.

Сравнение двух фильтров

Mip-текстурирование

Концепция mip-текстурирования предполагает использование нескольких копий одной текстуры, но с разной детализацией. Это позволяет увеличивать качество отображения, например, при удалении от объекта.

Mip-текстурирование в WebGL использует ряд фильтров. Подобные фильтры могут использоваться только в качестве значения для фильтра gl.TEXTURE_MIN_FILTER:

    gl.NEAREST_MIPMAP_NEAREST : фильтр использует одну копию текстуры, которая наиболее подходит под размеры текстуры на экране. Выборка семплером значений происходит по алгоритму NEAREST. Самый быстрый способ текстурирования, но при этом менее качественный

    gl.LINEAR_MIPMAP_NEAREST : фильтр использует одну копию текстуры, которая наиболее подходит под размеры текстуры на экране. Выборка семплером значений происходит по алгоритму LINEAR

    gl.NEAREST_MIPMAP_LINEAR : фильтр использует две копии текстуры, которые наиболее подходят под размеры текстуры на экране. Выборка семплером значений происходит по алгоритму NEAREST. Выборка цвета пикселя идет параллельно сразу из двух копий, а финальное значение цвета представляет средневзвешенное значение двух выборок

    gl.LINEAR_MIPMAP_LINEAR : фильтр использует две копии текстуры, которые наиболее подходят под размеры текстуры на экране. Выборка семплером значений происходит по алгоритму LINEAR. Выборка цвета пикселя идет параллельно сразу из двух копий, а финальное значение цвета представляет средневзвешенное значение двух выборок. Наиболее медленный способ, но при этом дающий наибольшее качество

Само использование этих значений для фильтров еще предполагает, что у нас будет использоваться mip-текстурирование. Перед этим нам надо сгенерировать мипмапы, то есть копии текстуры, с помощью метода gl.generateMipmap(gl.TEXTURE_2D); . Этот метод должен вызываться после метода gl.texImage2D(). То есть, возьмем из ранее использованный примеров текстурирования функцию handleTextureLoaded и изменим ее так, чтобы использовались мипмапы:

Function handleTextureLoaded(image, texture) { gl.bindTexture(gl.TEXTURE_2D, texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); gl.generateMipmap(gl.TEXTURE_2D); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR); }

Это даст нам следующий результат:

Надо отметить, что мип-текстурирование имеет некоторые ограничения: используемые изображения должны иметь размеры, которые равны степени двойки. Например, 16px, 32px, 64px, 128px и т.д. При этом необязательно, чтобы высота и ширина были равные, главное, чтобы их значения были равны степени двойки.

Texture wrapping

Еще один способ текстурирования называется texture wrapping . Этот термин можно перевести как обертывание текстурой. То есть данный способ определяет поведение семплера при отборе цветов пикселей с текстуры, если заданные координаты текстуры находятся вне диапазона .

В данном случае нам потребуется установить значения для фильтров gl.TEXTURE_WRAP_S и gl.TEXTURE_WRAP_T , которые отвечают за рендеринг текстуры вдоль осей s и t.

Например, у нас определены следующие координаты текстуры в буфере координат текстуры:

// Координаты текстуры var textureCoords = [ 0.0, 0.0, 0.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 2.0, 2.0, 2.0, 2.0, 0.0 ];

А функция handleTextureLoaded выглядела бы следующим образом:

Function handleTextureLoaded(image, texture) { gl.bindTexture(gl.TEXTURE_2D, texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); gl.generateMipmap(gl.TEXTURE_2D); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); }

То мы можем получить следующий результат:

Для параметров мы можем использовать следующие значения:

    gl.CLAMP_TO_EDGE : все координаты текстуры, которые больше 1 и меньше 0, сжимаются до диапазона

    gl.REPEAT : происходит повторение текстуры после выхода вне диапазона

    gl.MIRRORED_REPEAT : повторение текстуры с зеркальным отображением

Можно комбинировать данные значения, как в вышеприведенном примере, где одновременно используются gl.REPEAT и gl.CLAMP_TO_EDGE.

Описание алгоритмов текстурирования: фильтрация текстур

Фильтрация текстур

В последнее время компании, занимающиеся разработкой компьютерной 3D графики, постоянно стремятся увеличить детальность и качество изображения в компьютерной прорисовке. Новые технологии и архитектуры 3D прорисовки безостановочно разрабатываются, улучшаются и модернизируются алгоритмы сжатия для увеличения пропускной способности памяти, претерпевает изменения и архитектура памяти. К сожалению, отрыв передовых идей в 3D графике от обычных ПК довольно велик: реалистичность в современных играх и т.п. сделана с помощью технологий, разработанных 1-2 года назад. Кроме того, мощность обычных ПК очень ограничена, именно поэтому для игр используются довольно простые алгоритмы, о которых мы и расскажем в этой статье: это текстурирование, и более подробно - фильтрация текстур.

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

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

Есть еще одно понятие в текстурировании, о котором следует рассказать. При наложении 2D изображения, оно разбивается на множество цветных фрагментов. Это сделано для масштабирования объекта - текстура 2-х мерная, а 3-х мерный объект при приближении или удалении должен меняться. Текстура для сохранения реалистичности и качества также должна меняться. Итак, текстура разбивается на множество цветных фрагментов, которые называются тексели (texels - texture elements). В дальнейшем, к примеру, при приближении к объекту, нет необходимости заново загружать новую текстуру: берутся тексели из оригинальной текстуры и увеличиваются. Конечно же, качество теряется, но оно остается на достаточно высоком уровне, кроме того, при таком подходе значительно разгружается графический процессор и память.

Mip-Mapping (мип-маппинг)

Движение - это характеристика всех отображаемых объектов; даже если сам объект неподвижен, он все равно меняется при изменении угла зрения персонажа вследствии его движения. Поэтому текстура, помещенная на объект, также должна двигаться - это влечет за собой некоторые осложнения и дополнительную обработку. А что если мы смотрим на объект под каким-то углом, к примеру, на пол? Пол может занимать большую площадь, и для сохранения реалистичности, чем дальше он от нас, тем меньше его составляющие (к примеру, плитка). Для обеспечения этого, текстура должна определенным образом уменьшаться. К сожалению, простое изменение разрешения текстур, может повлечь за собой довольно неприятный эффект, когда одна текстура визуально как бы сливается с другой. Другой неприятный эффект может возникнуть, если тексель больше размером, чем требуемое количество пикселей. Это происходит, когда смотришь на текстуру, находящуюся на очень большом расстоянии. Обе ситуации возникают при применении традиционного сглаживания. А вот и реальные примеры этих случаев: в данном реферате нету

Для смягчения таких ситуаций и был создан mip-mapping (мип-маппинг). Эта технология работает очень просто: оригинальная текстура генерируется в различных ситуациях таким образом, чтобы корректно отображать текстуру на разных расстояниях и при разных углах зрения. При приближении к объекту показывается текстура с более высоким разрешением, а при отдалении - с низким. Таким образом, mip-mapping улучшает качество изображения и уменьшает неровности. Ниже представлены те же картинки, только со включенным mip-mapping: в данном реферате картинок нету.

Заметили улучшение качества? Оно особенно заметно на второй картинке с желто-красным рисунком. Обратите внимание: улучшилось качество не только дальних текстур: ближние также выглядят гораздо лучше. В целом изображение с mip-mapping смотрится гораздо лучше, чем без него: отсутствуют многочисленные искажения и искривления, заметные при обычном отображении.

Фильтрация

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

Билинейная фильтрация (Bilineat Filtration)

Другой метод текстурирования - это билинейная фильтрация. Принцип действия этого метода текстурирования очень похож на точечный метод, но в отличие от него для выбора цвета пикселей используется не полное изображение, а блок из 4 текселей. Таким образом, повышается аккуратность при выборе цвета пикселя и достигается лучшая прорисовка отдельных мелких деталей изображения.

На этой картинке пример прорисовки изображения, используя билинейную фильтрацию и mip-mapping.

Трилинейная фильтрация

Второе рождение билинейная фильтрация получила в виде трилинейной фильтрации, принцип действия которой точно такой же, но используется улучшенный алгоритм расчета, который увеличивает точность прорисовки. Трилиниейная фильтрация, как и билинейная, использует блоки из 4 текселей, также как и в билинейной фильтрации, нормализуется изображение, затем нормализуется изображение из граничного блока из 4 текселей. Последним этапом производится анализ границы обоих блоков, в результате которого исправляются возможные ошибки и несоответствия на границе этих 2 блоков. В билинейной фильтрации достаточно часто можно увидеть линии, возникающие на границах блоков, которые исчезают при использовании трилинейной фильтрации. Кроме того, при использовании трилинейной фильтрации лучше убираются искажения и неровности при движении и при изменении угла зрения. Ниже показана схема использования трилинейной фильтрации, и она в действии.

Следует обратить внимание, что некоторые дефекты на приличной дистанции возникают даже при использовании трилинейной фильтрации. Это происходит оттого, что она изначально разрабатывалась для уменьшения искажений между mip-map уровнями.

Изображение получается очень качественно только при более прямых углах зрения, при реальной же прорисовке, геометрические формы объекта могут быть нарушены. Посмотрите на картинку от SGI:

Анизотропная фильтрация (Anisotropic filtering)

Форма текстурированных объектов как при билинейной, так и при трилинейной фильтрации может искажаться, т.к. обе эти фильтрации являются изотропными - изображение фильтруется в определенной форме - в форме квадрата. Большинство же формируемых объектов не подходят под эту определенную и неизменную форму: для их качественной обработки необходимо использовать другой тип фильтрации - анизотропный. Анизотропия состоит из нескольких слов на латыни и означает буквально "Ани" - не, "изо" - определенная форма и "тропия" - модель - т.е. модели неопределенной формы. Название этой технологии отражает ее техническую реализацию. Анизотропная фильтрация обычно оперирует не менее чем 8 текселями, во все стороны mip-map уровней, при этом используется модель неопределенной заранее формы. В результате убираются шумы и искажения объектов, а изображение в целом получается более качественным.

Сравните две картинки: на одной использовалась анизотропная фильтрация 16-текселей, с помощью которой исчезли искажения между mip-map уровнями и шум изображения, на второй картинке анизотропная фильтрация была выключена.

Обратите внимание на дальние дистанции изображения: различия между анизотропной и изотропной фильтрацией очевидны. Качество текстуры при анизотропной фильтрации даже на дальних дистанциях остается схожей с оригинальным; при изотропной фильтрации же видна тенденция в "сглаживанию" изображения, в результате теряется качество. Анизотропная фильтрация, как и трилинейная, уменьшает неровность текстур. Но при использовании анизотропной фильтрации качество получается все равно лучшим, т.к. для используется гораздо большее количество блоков для сравнения. Вот еще один пример, показывающий анизотропную фильтрацию в действии:

Долгое время графические платы потребительского уровня не показывали то качество изображения, которое возможно при использовании анизотропной фильтрации. С появлением таких графических чипов, как NVIDIA GeForce2 и ATI Radeon, стало возможным использование анизотропной фильтрации, которая аппаратно анализирует блоки из 16 текселей. Видеокарты GeForce3 и Radeon 8500 используют уже 32 тексельную анизотропную фильтрацию. Картинка ниже показывает изображение, прближенное к тому, которое будет получено с помощью профессиональной 64 тексельной анизотропной фильтрации:

Будущее…

В ближайшем будущем анизотропная фильтрация будет применяться все чаще и чаще. Для графических чипов следующего поколения уже разрабатываются новые технологии устранения неровностей и угловатостей объектов. В скором будущем мы увидим изображение, обрабатываемое используя мультитексельные блоки. Появятся видеокарты, способные аппаратно поддерживать анизотропную фильтрацию, использующую 128 тексельные блоки. Качество изображения при этом намного улучшится, а производительность - увеличится.

Дополнительно:

Антиалиасинг и анизотропная фильтрация сегодня: что, где и почём? Часть первая

На самом деле, статью с таким заголовком можно было бы начать с какой-либо банальности, вроде «каждый пользователь компьютера когда-либо мог наблюдать работу таких техник улучшения трехмёрного изображения, как антиалиасинг или анизотропная фильтрация». Либо такой: «пока наши корабли бороздят космические просторы, программисты NVIDIA и ATI ищут способы, чтобы улучшить работу известных техник улучшений изображения». Вторая банальность имеет куда больше шансов на жизнь в том плане, что она уже интригует неким подобием того, что мы будем заниматься расследованием вопроса о том, кто и каким образом «наоптимизировал» в своих драйверах.

Однако мы, пожалуй, обойдёмся вовсе без банальностей. Потому что куда более интересно порассуждать на тему того, насколько же стали доступны сейчас техники улучшения изображения для простого пользователя или, правильнее будет сказать, для простого геймера. Именно геймеры на сегодняшний день являются наиболее активными потребителями всех новых технологий и нововведений в 3D. По большому счёту, мощный 3D-акселератор на сегодняшний день нужен исключительно для игры в последние компьютерные игры с мощными 3D-движками, оперирующие сложными шейдерами различных версий. Сейчас никого уже не удивишь игрой с пиксельными шейдерами версии 2.0 – в игровом мире такие забавы потихоньку становятся повседневным явлением. Большинство игр по-прежнему выпускается на основе шейдерной модели 1.1 ввиду того, что для разработчиков игр наиболее важно добиться, чтобы их игра сносно работала на железе, которое стоит у подавляющего большинства игроков. Делать супернавороченный движок сейчас – это большое расточительство и даже риск. Судите сами: разработка движка класса «Doom 3» или «Half-Life 2» (ну и приплюсуем сюда первопроходца шейдеров 2.0 во всей красе, детище Crytek – «FarCry», чтобы получилась истинная вездесущая троица) занимает огромное количество времени, что привносит в разработку дополнительные трудности – необходимо разработать движок в такие сроки, чтобы нововведения и оригинальные наработки не устарели во время создания движка.

Если вы сомневаетесь в том, что такое может быть, то совершенно зря – в случае с «Half-Life 2» всё именно так и было (да и «Doom 3» разрабатывался с оглядкой на GeForce 3, а вышел тогда, когда вовсю продавались GeForce FX). Также разработка движков подобного класса сопряжена с большими затратами на разработку: талантливые программисты стоят сегодня недёшево. А ещё в последнее время много внимания (даже больше, чем нужно) уделяется, если можно так выразиться, «политике» в отношении игровых движителей.

Да-да, именно так, вы не ослышались, в сфере 3D уже давно есть своя политика, основанная, естественно, на интересах двух грандов строения графических процессоров: ATI и NVIDIA. Суровая Канада уже давно ведет борьбу против солнечной Калифорнии, и пока конца этому противостоянию не видно, что нам, простым потребителям, конечно, только на руку. Теперь разработать классный движок мало – чтобы иметь успех, нужно заручиться поддержкой либо калифорнийской дивы NVIDIA, либо канадской ATI, благо, теперь и у первой, и у второй есть свои партнёрские программы для разработчиков игр. У NVIDIA такая программа называется «The way it"s meant to be played», а у ATI – «Get it in the game». Всё достаточно красноречиво и понятно: NVIDIA говорит, что «играть нужно так», а совсем не эдак, а ATI уверяет, что всё, что мы только ни пожелаем, мы обязательно получим в самой игре. Достаточно заманчиво, не правда ли? Движки же класса «Doom 3» и «Half-Life 2» (в случае последней движок называется Source, однако для простоты восприятия мы будем называть его именно «Half-Life 2», чтобы сохранить правильную ассоциацию) и вовсе изначально разрабатываются в тесном сотрудничестве с инженерами производителей графических чипов, чтобы игры лучше работали именно на GPU какого-то одного производителя.

Поэтому, как мы можем видеть, революции в области новых графических 3D-движков делать весьма проблематично, и поэтому случаются эти самые перевороты в мире игровых движков не так уж и часто. Однако улучшать качество изображения каким-то образом нужно. Если просто увеличивать количество полигонов в кадре, тем самым получая визуально более красивую для восприятия картинку, то в итоге мы придём к тому, что акселератор не сможет обрабатывать сцену с приемлемым уровнем частоты кадров, но в картинке всё равно будет чего-то не хватать. Лесенки из пикселей всё равно останутся, да и качество текстур не улучшится. Остаются менее явные способы по улучшению качества трёхмерной картинки на мониторе – это анизотропная фильтрация и антиалиасинг. Непосредственно к самому 3D-движку эти техники улучшения изображения не имеют никакого отношения, и сделать сам движок более красивым они, естественно, не могут, однако они могут работать с текстурами и изображением таким образом, что на выходе, то есть на мониторе, мы можем видеть визуально более красивую и мягкую картинку.

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

Что такое антиалиасинг и с чем его едят?

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

Итак, антиалиасинг – что же это такое и зачем он нужен. В первую очередь, в слове «антиалиасинг» необходимо выделить часть его – «анти». Предельно ясно, что это часть слова подразумевает то, что само явление «антиалиасинга» направлено на борьбу с чем-то. Как несложно догадаться, в нашем случае – с «алиасингом». Поэтому для нас на данный момент важно чётко разобраться в том, что же представляет из себя пресловутый «алиасинг».

Для начала нужно чётко понимать, что изображение, которое мы с вами можем ежедневно наблюдать на экранах наших с вами мониторов, состоит из так называемых мелких частичек, которые принято называть пикселями. Хорошей аналогией в этом смысле может послужить пример с бумагой в клеточку. Изображение на мониторе – это та же бумага в клеточку, только они в данном случае очень и очень мелкие. Если говорят, что разрешение экрана составляет 1024х768 при 32-битном цвете, то это означает, что по горизонтали на мониторе умещается 1024 точек, а по вертикали – 768. При этом каждая точка может быть закрашена одним цветом из доступных в 32-битной палитре. На данный момент 32-битный цвет – это предел того, чего мы можем добиться на экране компьютера. Лучшие умы человечества (тот же Кармак) уже поговаривают о необходимости перехода на 64-битный цвет и указывают на явные минусы 32-битной палитры. В своё время при переходе с 16-битного на 32-битный цвет данная необходимость была достаточно чётко обоснована и виделись реальные причины, по которым стоило бы перейти на 32 бит. Переход же на 64-битный цвет на сегодняшний день – это скорее излишество. Так же как и в случае с 16 и 32 битами, в своё время придётся достаточно долго ждать, когда акселераторы всех уровней смогут с приемлемой скоростью обрабатывать 64-битный цвет.

Подавляющее большинство статей, в которых затрагиваются тем или иным образом принципы построения изображений в 3D и где ведётся разговор об антиалиасинге, изобилуют простым, но вместе с тем наиболее действенным примером, на котором можно достаточно хорошо понять, что же такое антиалиасинг. Посмотрите на увеличенную надпись «Апгрейд», сделанную в Word’e, а затем просто увеличенную в фотошопе. Не очень хорошо выглядит, не правда ли? По бокам букв видна так называемая гребёнка или, как её ещё называют, «лесенка». В сущности, эта самая «гребёнка» или «лесенка» и есть алиасинг. Можно представить и другой пример в виде геометрического объекта, например, пирамиды. По её краям также хорошо видна всё та же «гребёнка». А теперь посмотрите на другое изображение той же пирамиды, но с увеличенным вдвое разрешением. Выглядит уже значительно лучше, и «гребёнка» практически незаметна. Как уже было сказано выше, данный эффект, сглаживающий «гребёнку», был достигнут за счёт того, что мы увеличили разрешение в 2 раза.

Что это означает? Предположим, у нас была отрендерена пирамида с разрешением 200х200 пикселей (выше мы уже подробно прояснили вопрос о том, что такое пиксели и зачем они нужны). Мы увеличили количество точек по вертикали и по горизонтали ровно в 2 раза, то есть получили изображение с разрешением 400 точек по вертикали и 400 точек по горизонтали. Это также означает, что количество точек на нашем объекте, который находился на сцене, увеличилось вдвое. Что это дало применительно к нашему эффекту алиасинга? Очевидно, что он стал минимален, то есть сгладился – ведь количество точек по краям объекта также возросло вдвое. Именно слово «сгладился» является здесь ключевым. Ведь антиалиасинг по-иному называют сглаживанием, что отражает самую суть технологии, которая сглаживает ту самую «лесенку» по краям трёхмерных объектов.

На самом деле, после увеличения разрешения «лесенка» с края пирамиды никуда не делась – она остаётся там по-прежнему. Однако за счёт того, что мы увеличили разрешение (что означает увеличение точек, которые расходуются на отображение пирамиды), эффект «лесенки» сгладился благодаря особенностям человеческого зрения, которое уже менее чётко видит пиксели на крае объекта. Абсолютно понятно, что если увеличивать разрешение ещё и ещё, то эффект алиасинга будет наблюдаться всё в меньшей и меньшей степени. Точнее, человеческий глаз станет замечать его всё в меньшей и меньшей степени, поскольку сам эффект алиасинга никуда не денется. Но так же абсолютно понятно и то, что до бесконечности увеличивать разрешение не получится, ведь мониторы, пусть даже и самые современные, имеют конечные разрешения, причём не такие уж и большие, что не позволит нам постоянно увеличивать количество точек. Проще говоря, простейшего эффекта антиалиасинга можно добиться, всего лишь увеличив разрешение экрана, однако разрешение не может расти до бесконечности. Казалось бы, выхода нет? Однако в действительности он был найден, и основан он всё на той же особенности зрения человека.

Этого удалось достичь благодаря плавным переходам цветов на изображении. Фактически визуальное улучшение изображения производится не за счёт физического увеличения разрешения, а за счёт, если можно так выразиться, цветового увеличения разрешения. В данной статье мы не будем описывать алгоритмы вычисления этих точек и не будем вдаваться в глубины математических вычислений, а расскажем лишь о принципе работы такого антиалиасинга. Лесенка на границах объектов видна лишь потому, что чаще всего края трёхмерных объектов довольно сильно выделяются по цвету от остальной картинки и представляют собой тонкие линии в один пиксель. Это можно компенсировать, поставив некоторое количество точек с цветами, вычисляемыми по формуле из значений цвета самого края и точек рядом с этим краем. То есть, если край объекта чёрный, а фон белый, то дополнительная точка рядом с чёрной линией края станет серой. Чем больше этих дополнительных точек около края любого 3D-объекта, тем более гладко выглядят его края и тем меньше заметна лесенка. Данный способ называется краевым антиалиасингом. Качество антиалиасинга, задаваемое в драйвере видеокарты, как то: 2x, 4x, 6x, 8x означает количество проставляемых дополнительных пикселей вокруг линии, нуждающейся в сглаживании.

Анизотропная фильтрация: мини-ликбез для начинающих

Для того чтобы понять, что такое фильтрация, необходимо обладать некоторыми основными знаниями. Мы уже выяснили, что изображение на экране состоит из множества пикселей, количество которых определяется разрешением. Для вывода цветного изображения ваша видеокарта должна определять цвет каждого пикселя. Определяется его цвет посредством наложения текстурных изображений на полигоны, которые расположены в трёхмерном пространстве. Текстурные изображения состоят из пикселей, вернее, текселей, то есть тексель – это пиксель двухмерного изображения, наложенного на 3D-поверхность. Главная дилемма заключается в следующем: какой тексель или тексели определяют цвет пикселя на экране. Для представления проблемы фильтрации давайте представим одну картину. Допустим, что ваш экран – это плита с множеством круглых отверстий, каждое из которых является пикселем. Для того чтобы определить, какой цвет имеет пиксель относительно трёхмерной сцены, расположенной за плитой, достаточно просто посмотреть в одно из отверстий.

А теперь представим луч света, который проходит через одно из отверстий и попадает на наш текстурированный полигон. Если последний расположен параллельно относительно отверстия, через которое проходит световой луч, то световое пятно будет иметь форму окружности. В противном случае, если полигон расположен не параллельно к отверстию, световое пятно искажается и имеет эллиптическую форму. Мы думаем, что многие читатели в это время задаются одним вопросом: «как связаны все эти плиты, отверстие, луч света с проблемой определения цвета пикселя?» Внимание! Ключевая фраза: все полигоны, расположенные в световом пятне, определяют цвет пикселя. Всё вышеизложенное и есть те необходимые базовые знания, которые нужны для того, чтобы понять различные алгоритмы фильтрации.

А теперь, чтобы вы лучше поняли, для чего нужна фильтрация, рассмотрим происходящие процессы на примере легендарной «Quake 3 Arena». Представьте какой какой-нибудь коридор с множеством квадратов и различных орнаментов (благо, в «Quake 3 Arena» этого хватает). Орнамент в начале коридора сильно детализирован, а ближе к концу коридора (горизонту) элементы орнамента становятся всё меньше и меньше, т.е. они отображаются меньшим числом пикселей. В результате теряются детали типа швов между элементами орнамента, что, соответственно, приводит к ухудшению качества изображения.

Проблема заключается в том, что драйвер графической карты не знает, какие детали в текстуре являются важными.

Point Sampling

Point Sampling (поточечная выборка) – самый простой способ определения цвета пикселя. Этот алгоритм основан на текстурном изображении: выбирается всего один тексель, который ближе всех расположен к центру светового пятна, и по нему происходит определение цвета пикселя. Нетрудно догадаться, что это совершенно не верно. Во-первых, цвет пикселя определяется несколькими текселями, а мы выбрали только один. Во-вторых, форма светового пятна может измениться, а алгоритм не принимает это во внимание. А зря!

Главным недостатком поточной выборки является тот факт, что когда полигон расположен близко к экрану, количество пикселей будет значительно выше, чем текселей, из-за чего качество изображения очень сильно пострадает. Так называемый эффект блочности, как мы полагаем, многие могли наблюдать в старых компьютерных играх, например, в том же легендарном «Doom».

У Point Sampling есть преимущество. Из-за того, что определение цвета пикселя осуществляется всего по одному текселю, данный метод не критичен к пропускной способности памяти, а это автоматически даёт данному способу фильтрации колоссальные диведенды в том плане, что на фильтрацию по данной схеме затрачивается очень мало ресурсов 3D-акселератора.

Bi-Linear Filtering

Bi-Linear Filtering – билинейная фильтрация, основанная на методе использования интерполяционной техники. Для определения нужных текселей используется основная форма светового пятна, то есть круг. В нашем примере с кругом последний аппроксимируется 4 текселями. Как видим, здесь дела обстоят несколько лучше, чем с Point Sampling. Билинейная фильтрация использует уже 4 текселя.

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

Расплывчатость – отнюдь не самая главная проблема билинейной фильтрации. Дело в том, что аппроксимация выполняется корректно лишь для объектов, расположенных параллельно экрану или точке наблюдения, в то время как 99% объектов в любой компьютерной игре расположены непараллельно к точке наблюдения. Отсюда можно сделать вывод, что 99% объектов будут аппроксимироваться неправильно. Возьмём, к примеру, наш круг – полигон расположен непараллельно относительно точки наблюдения, стало быть, мы должны аппроксимировать эллипс, а мы аппроксимируем круг, что крайне неверно. Ко всему прочему билинейная фильтрация значительно требовательней к пропускной полосе данных памяти, что, в общем-то, более чем логично, учитывая то, что билинейная фильтрация использует уже 4 текселя для определения цвета пикселя.

multum in parvo - «много в малом».

Назначение

Изображение лучше всего выглядит, когда детализация текстуры близка к разрешению экрана. Если разрешение экрана высокое (текстура слишком маленькая/объект очень близко), получается размытое изображение. Если же разрешение текстуры слишком высокое (текстура слишком велика/объект очень далеко), получаем случайные пиксели - а значит, потерю мелких деталей, муар , мерцание и большой процент кэш-промахов . Получается, что лучше иметь несколько текстур разной детализации и накладывать на объект ту, которая наиболее подходит в данной ситуации.

В компьютерных играх главной целью MIP-текстурирования является не улучшение качества, а повышение скорости отрисовки объектов. Технология заключается в том, что удаленные объекты обтягиваются уменьшенными текстурами, и соответственно, уменьшается время отрисовки каждого полигона. В отдельных случаях прирост в скорости текстурирования может увеличиваться в тысячи, а скорость вывода всей сцены на экран - в десятки раз.

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

Принцип действия

Создаётся так называемая MIP-пирамида - последовательность текстур с разрешением от максимального до 1×1. Например: 1×1, 2×2, 4×4, 8×8, 16×16, 32×32, 64×64, 128×128, 256×256, 512×512 и 1024×1024. Каждая из этих текстур называется MIP-уровнем (англ. MIP level ) или уровнем детализации (англ. level of detail ).

На всех этих текстурах находится одно и то же изображение. Таким образом, MIP-текстурирование увеличивает расход видеопамяти на треть:

\sum_{i=0}^\infty \left(\frac 1 4 \right)^i = 1 \frac 1 3.

При наложении текстур вычисляется расстояние до объекта и номер текстуры находится по формуле:

{miplevel} = \log_2 \left(\frac Шаблон:Dist {{texelsize} \cdot {resolution}} \right) + {mipbias},

где resolution - разрешение виртуальной камеры (количество пикселей, которое будет в объекте размером в 1 ед., расположенном в 1 ед. от камеры), texelsize - размер текселя в единицах трёхмерного мира, dist - расстояние до объекта в тех же единицах, mip bias - число, позволяющее выбирать более или менее детальную текстуру, чем даёт формула.

Эта цифра округляется до целого, и текстура с соответствующим номером (нулевая - самая детальная, первая - вдвое меньшая и т. д.) накладывается на объект.

Недостатки, способы решения

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

  1. Установить в видеодрайвере наиболее комфортное значение mip bias - числа́, которое отвечает за выбор номера текстуры в пирамиде. Если оно отрицательное, видеоплата берёт более детальные текстуры, если положительное - менее детальные.
  2. Многие игры сами устанавливают подходящий mip bias для разных типов объектов. Например, в Live for Speed mip bias устанавливается пользователем отдельно для автомобилей, препятствий и дороги.
  3. Воспользоваться анизотропной фильтрацией - методом текстурирования, который направлен именно на решение этой проблемы.

Наконец, видна чёткая граница между MIP-уровнями. Это решается трилинейной фильтрацией .

Альтернативы

В рендерерах высокого качества может применяться таблица частичных сумм . Это даёт высшее качество изображения (за четыре обращения к таблице можно усреднить цвет по любому прямоугольнику), но для хранения сумм нужны более широкие типы. Соответственно, таблица частичных сумм больше не на треть, а как минимум вдвое. Проблем с кэш-промахами таблица частичных сумм не решает.

Напишите отзыв о статье "MIP-текстурирование"

Ссылки

  • Михаил Хабров. . GameDev.ru (29 мая 2002 года). Проверено 12 июля 2009. .
  • (1983) (англ.)

Отрывок, характеризующий MIP-текстурирование

И она, как всегда говоря о Пьере, стала рассказывать анекдоты о его рассеянности, анекдоты, которые даже выдумывали на него.
– Вы знаете, я поверил ему нашу тайну, – сказал князь Андрей. – Я знаю его с детства. Это золотое сердце. Я вас прошу, Натали, – сказал он вдруг серьезно; – я уеду, Бог знает, что может случиться. Вы можете разлю… Ну, знаю, что я не должен говорить об этом. Одно, – чтобы ни случилось с вами, когда меня не будет…
– Что ж случится?…
– Какое бы горе ни было, – продолжал князь Андрей, – я вас прошу, m lle Sophie, что бы ни случилось, обратитесь к нему одному за советом и помощью. Это самый рассеянный и смешной человек, но самое золотое сердце.
Ни отец и мать, ни Соня, ни сам князь Андрей не могли предвидеть того, как подействует на Наташу расставанье с ее женихом. Красная и взволнованная, с сухими глазами, она ходила этот день по дому, занимаясь самыми ничтожными делами, как будто не понимая того, что ожидает ее. Она не плакала и в ту минуту, как он, прощаясь, последний раз поцеловал ее руку. – Не уезжайте! – только проговорила она ему таким голосом, который заставил его задуматься о том, не нужно ли ему действительно остаться и который он долго помнил после этого. Когда он уехал, она тоже не плакала; но несколько дней она не плача сидела в своей комнате, не интересовалась ничем и только говорила иногда: – Ах, зачем он уехал!
Но через две недели после его отъезда, она так же неожиданно для окружающих ее, очнулась от своей нравственной болезни, стала такая же как прежде, но только с измененной нравственной физиогномией, как дети с другим лицом встают с постели после продолжительной болезни.

Здоровье и характер князя Николая Андреича Болконского, в этот последний год после отъезда сына, очень ослабели. Он сделался еще более раздражителен, чем прежде, и все вспышки его беспричинного гнева большей частью обрушивались на княжне Марье. Он как будто старательно изыскивал все больные места ее, чтобы как можно жесточе нравственно мучить ее. У княжны Марьи были две страсти и потому две радости: племянник Николушка и религия, и обе были любимыми темами нападений и насмешек князя. О чем бы ни заговорили, он сводил разговор на суеверия старых девок или на баловство и порчу детей. – «Тебе хочется его (Николеньку) сделать такой же старой девкой, как ты сама; напрасно: князю Андрею нужно сына, а не девку», говорил он. Или, обращаясь к mademoiselle Bourime, он спрашивал ее при княжне Марье, как ей нравятся наши попы и образа, и шутил…
Он беспрестанно больно оскорблял княжну Марью, но дочь даже не делала усилий над собой, чтобы прощать его. Разве мог он быть виноват перед нею, и разве мог отец ее, который, она всё таки знала это, любил ее, быть несправедливым? Да и что такое справедливость? Княжна никогда не думала об этом гордом слове: «справедливость». Все сложные законы человечества сосредоточивались для нее в одном простом и ясном законе – в законе любви и самоотвержения, преподанном нам Тем, Который с любовью страдал за человечество, когда сам он – Бог. Что ей было за дело до справедливости или несправедливости других людей? Ей надо было самой страдать и любить, и это она делала.
Зимой в Лысые Горы приезжал князь Андрей, был весел, кроток и нежен, каким его давно не видала княжна Марья. Она предчувствовала, что с ним что то случилось, но он не сказал ничего княжне Марье о своей любви. Перед отъездом князь Андрей долго беседовал о чем то с отцом и княжна Марья заметила, что перед отъездом оба были недовольны друг другом.
Вскоре после отъезда князя Андрея, княжна Марья писала из Лысых Гор в Петербург своему другу Жюли Карагиной, которую княжна Марья мечтала, как мечтают всегда девушки, выдать за своего брата, и которая в это время была в трауре по случаю смерти своего брата, убитого в Турции.
«Горести, видно, общий удел наш, милый и нежный друг Julieie».
«Ваша потеря так ужасна, что я иначе не могу себе объяснить ее, как особенную милость Бога, Который хочет испытать – любя вас – вас и вашу превосходную мать. Ах, мой друг, религия, и только одна религия, может нас, уже не говорю утешить, но избавить от отчаяния; одна религия может объяснить нам то, чего без ее помощи не может понять человек: для чего, зачем существа добрые, возвышенные, умеющие находить счастие в жизни, никому не только не вредящие, но необходимые для счастия других – призываются к Богу, а остаются жить злые, бесполезные, вредные, или такие, которые в тягость себе и другим. Первая смерть, которую я видела и которую никогда не забуду – смерть моей милой невестки, произвела на меня такое впечатление. Точно так же как вы спрашиваете судьбу, для чего было умирать вашему прекрасному брату, точно так же спрашивала я, для чего было умирать этому ангелу Лизе, которая не только не сделала какого нибудь зла человеку, но никогда кроме добрых мыслей не имела в своей душе. И что ж, мой друг, вот прошло с тех пор пять лет, и я, с своим ничтожным умом, уже начинаю ясно понимать, для чего ей нужно было умереть, и каким образом эта смерть была только выражением бесконечной благости Творца, все действия Которого, хотя мы их большею частью не понимаем, суть только проявления Его бесконечной любви к Своему творению. Может быть, я часто думаю, она была слишком ангельски невинна для того, чтобы иметь силу перенести все обязанности матери. Она была безупречна, как молодая жена; может быть, она не могла бы быть такою матерью. Теперь, мало того, что она оставила нам, и в особенности князю Андрею, самое чистое сожаление и воспоминание, она там вероятно получит то место, которого я не смею надеяться для себя. Но, не говоря уже о ней одной, эта ранняя и страшная смерть имела самое благотворное влияние, несмотря на всю печаль, на меня и на брата. Тогда, в минуту потери, эти мысли не могли притти мне; тогда я с ужасом отогнала бы их, но теперь это так ясно и несомненно. Пишу всё это вам, мой друг, только для того, чтобы убедить вас в евангельской истине, сделавшейся для меня жизненным правилом: ни один волос с головы не упадет без Его воли. А воля Его руководствуется только одною беспредельною любовью к нам, и потому всё, что ни случается с нами, всё для нашего блага. Вы спрашиваете, проведем ли мы следующую зиму в Москве? Несмотря на всё желание вас видеть, не думаю и не желаю этого. И вы удивитесь, что причиною тому Буонапарте. И вот почему: здоровье отца моего заметно слабеет: он не может переносить противоречий и делается раздражителен. Раздражительность эта, как вы знаете, обращена преимущественно на политические дела. Он не может перенести мысли о том, что Буонапарте ведет дело как с равными, со всеми государями Европы и в особенности с нашим, внуком Великой Екатерины! Как вы знаете, я совершенно равнодушна к политическим делам, но из слов моего отца и разговоров его с Михаилом Ивановичем, я знаю всё, что делается в мире, и в особенности все почести, воздаваемые Буонапарте, которого, как кажется, еще только в Лысых Горах на всем земном шаре не признают ни великим человеком, ни еще менее французским императором. И мой отец не может переносить этого. Мне кажется, что мой отец, преимущественно вследствие своего взгляда на политические дела и предвидя столкновения, которые у него будут, вследствие его манеры, не стесняясь ни с кем, высказывать свои мнения, неохотно говорит о поездке в Москву. Всё, что он выиграет от лечения, он потеряет вследствие споров о Буонапарте, которые неминуемы. Во всяком случае это решится очень скоро. Семейная жизнь наша идет по старому, за исключением присутствия брата Андрея. Он, как я уже писала вам, очень изменился последнее время. После его горя, он теперь только, в нынешнем году, совершенно нравственно ожил. Он стал таким, каким я его знала ребенком: добрым, нежным, с тем золотым сердцем, которому я не знаю равного. Он понял, как мне кажется, что жизнь для него не кончена. Но вместе с этой нравственной переменой, он физически очень ослабел. Он стал худее чем прежде, нервнее. Я боюсь за него и рада, что он предпринял эту поездку за границу, которую доктора уже давно предписывали ему. Я надеюсь, что это поправит его. Вы мне пишете, что в Петербурге о нем говорят, как об одном из самых деятельных, образованных и умных молодых людей. Простите за самолюбие родства – я никогда в этом не сомневалась. Нельзя счесть добро, которое он здесь сделал всем, начиная с своих мужиков и до дворян. Приехав в Петербург, он взял только то, что ему следовало. Удивляюсь, каким образом вообще доходят слухи из Петербурга в Москву и особенно такие неверные, как тот, о котором вы мне пишете, – слух о мнимой женитьбе брата на маленькой Ростовой. Я не думаю, чтобы Андрей когда нибудь женился на ком бы то ни было и в особенности на ней. И вот почему: во первых я знаю, что хотя он и редко говорит о покойной жене, но печаль этой потери слишком глубоко вкоренилась в его сердце, чтобы когда нибудь он решился дать ей преемницу и мачеху нашему маленькому ангелу. Во вторых потому, что, сколько я знаю, эта девушка не из того разряда женщин, которые могут нравиться князю Андрею. Не думаю, чтобы князь Андрей выбрал ее своею женою, и откровенно скажу: я не желаю этого. Но я заболталась, кончаю свой второй листок. Прощайте, мой милый друг; да сохранит вас Бог под Своим святым и могучим покровом. Моя милая подруга, mademoiselle Bourienne, целует вас.

Mipmapping

Mipmapping (mip-mapping, mip-текстурирование или мипмеппинг) это метод уменьшения объема вычислений необходимых для точного наложения текстурного изображения на полигон. Простейший метод наложения текстур называется point-sampling (single point-sampling или поточечная выборка). Суть его в том, что для каждого пикселя, составляющего полигон, вы выбираете один тексель из текстурного изображения.

Этот метод очень неточен и результатом его применения является появление неровностей (aliasing - качество изображения ухудшается). А именно, всякий раз, когда пиксели больше по размеру, чем тексели, наблюдается эффект мерцания. Этот эффект имеет место, если часть полигона достаточно удалена от точки наблюдения, так, что сразу много текселей накладываются на пространство, занимаемое одним пикселем.

Заметим, что если полигон расположен очень близко к точкем наблюдения и тексели больше по размеру, чем пиксели, мы можем наблюдать другой тип ухудшения качества изображения (aliasing - алиасинг). В данном случае, изображение начинает выглядеть блочным. Этот эффект имеет место, когда текстура может быть достаточно большой, но ограничение в виде доступного разрешения экрана не дает возможности правильно представить исходое изображение.

На самом деле, mipmapping не может предотвратить такого рода эффекты ухудшения качества изображения; ничто не может помочь в этом случае, за исключением использования больших по размеру (т.е. имеющих более высокое разрешение) текстурных изображений или использование специальной техники, называемой "detail textures" (детализированные текстуры). Метод mipmapping разработан с целью помочь избавиться от первого типа ухудшений изображений или алиасинга, когда несколько текселей накладываются на один пиксель. Проблема тут в том, что если вам требуется правильным образом вывести на экран пиксель, вам необходимо скомбинировать значения ВСЕХ текселей, которые накладываются на пиксель. Разумеется, вы не можете сделать этого, если выбираете лишь один тексель. При этом, вам не хочется делать выборку по ВСЕМ текселям, потому что это слишком большой объем работы для правильного вывода на экран всего одного пикселя.

Метод mipmapping снижает объемы работы за счет генерирования и хранения множество версий исходного текстурного изображения, каждая из версий которого имеет все меньшее и меньшее разрешение (таким образом эффективнее используя "большие" тексели). Когда происходит текстурирование пикселя, вам нужно выбрать версию текстурного изображения, которая имеет необходимый размер текселей (относительно размера пикселя).

Теперь у вас есть много альтернатив -- какие тексели следует использовать, исходя из 8 хороших вариантов:
· у вас есть 4 близлежащих (nearest) текселей из текстурного изображения, причем эти тексели лишь слегка больше по размеру чем писксель.
· у вас есть 4 близлежащих текселей из текстурного изображения, причем эти тексели лишь слегка меньше по размеру чем писксель.

Если вы создаете неподвижное изображение, вы можете просто выбрать один ближайший тексель и использовать его. Однако, если вы создаете анимацию или движущееся изображение, результатом такого выбора будет серьезное ухудшение качества изображения (снова мерцание), в следствии того, что при медленном движении тексель выбранный для пикселя может "перескакивать" с одного места на другое при смене кадров.
Чтобы результат был лучше, вы должны выбрать несколько текселей и взять их среднее значение для определения пикселя. Т.е. вы должны выбрать способ фильтрации:
· линейный (linear) мипмеппинг: выбирается два текселя один побольше, а другой поменьше
· билинейный (bilinear) мипмеппинг: выбираются 4 текселя из ближайшего уровня
· трилинейный (trilinear) мипмеппинг: выбираются все 8 текселей

Кстати, такое усреднение отнюдь не является простым, а скорее наоборот сложным: чем ближе тексель находится по отношению к пикселю, тем большее влияние на конечное значение усреднения он оказывает (и наоборот).

Получается, что трилинейный мипмеппинг это лучшее, что может быть?

Нет конечно. Видно, что проблема не только в соотношении размеров пикселя и текселя, но также и в форме каждого из них (или, что бы быть более точными, в соотношениях форм).

Метод mip-текстурирования лучше всего работает для полигонов расположенных прямо "лицом к лицу" к точке наблюдения. Объясняется это тем, что каждая версия mip-текстуры получается в результате сокращения в четыре раза набора текселей, составляющих текстуру с более высоким разрешением, для получения текстуры с более низким разрешением.

Однако, полигоны, косонаправленные по отношению к точке наблюдения искривляют накладываемую текстуру так, что на пикселы могут накладываться различного вида и квадратичные по форме области текстурного изображения. Метод mip-текстурирования не принимает это во внимание и в результате наблюдается эффект слишком сильного размытия текстурного изображения, так, будто использованы неправильно выбранные тексели. Для решения этой проблемы вы должны делать выборку из большего количества текселей, составляющих текстуру, и выбирать эти тексели следует принимая во внимание "отображенную" форму пикселя в текстурном пространстве. Эта техника называется "anisotropic filtering" (анизотропная фильтрация). Обычное mip-текстурирование называется "isotropic" (изотропное или однородное), потому что мы всегда фильтруем вместе квадратные области, состоящие из текселей. Анизотропная фильтрация означает, что форма области из текселей, которую мы используем меняется в зависимости от обстоятельств. Anisotropic: "an" = not (не); "iso" = uniform (постоянная); "tropic" = shape (форма).

Кстати, архитектура Talisman от Microsoft может в некоторой степени осуществлять анизотропную фильтрацию, таким образом обеспечивая несколько лучшее качество текстурированного изображения. Имеено эта архитектура легла в основу графического чипсета от Fujitsu -- Marqius 2000.

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



Рекомендуем почитать

Наверх