On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru


lawebar.ru





 

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

Dave Barron Перевод и дополнение Иван "Reg" Пешалов

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

В последнее время компании, занимающиеся разработкой компьютерной 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 тексельные блоки. Качество изображения при этом намного улучшится, а производительность - увеличится.



Языки программирования: разное