Оригинал материала: https://3dnews.ru./173183

Современные технологии сглаживания изображений

 Современные технологии сглаживания изображений
Автор: Евгений Пугач

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

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

Любой человек, хоть раз запускавший 3D-приложение, знаком с таким явлением, как "лестничный эффект" - ступенчатость наклонных линий. В английском компьютерном жаргоне это явление называют "jaggies", а сухим языком науки - aliasing. Для того, чтобы устранить этот эффект и улучшить качество картинки, используется методика, получившая незамысловатое общее название antialiasing. На литературный русский язык это слово переводится как "сглаживание". Итак, прежде чем перейти к самому рассмотрению проблемы и методов ее решения, введем несколько понятий.

  • Aliasing=jaggies="лестничный эффект" - эффект ступенчатости изображения на границе двух трехмерных объектов. В дальнейшем будем использовать "родной" термин aliasing.
  • Antialiasing - совокупное название методов сглаживания изображения, устраняющих "лестничный эффект".
  • Пиксель - точка изображения на экране.
  • Тексель - точка трехмерного объекта с наложенной на нее текстурой.
  • Текстура - изображение фиксированного формата, используемое для придания пикселю цвета и рисунка. Накладывается ядром видеокарты на "голый" трехмерный объект перед выводом на экран.
  • Сэмпл - конкретно выбранный участок картинки, содержащий 1, 4, 16 и т.д. пикселей, используемый для обработки объекта и сглаживания.

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

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

Для наших же нужд такие методы не годятся. Поэтому разработчики трехмерных приложений (движков игр, тестовых приложений и т.п.) стремятся к тому, чтобы при наименьшем количестве полигонов и текстур получить наилучшее изображение. Явление aliasing объясняется довольно просто. Видеоядро может без искажений вывести на экран горизонтальные и вертикальные линии. А вот с наклонными дело обстоит намного хуже. Фактически, видеоадаптер создает лестницу, которая внешне напоминает наклонную прямую, но таковой не является. Чем выше разрешение, в котором просчитывается и выводится картинка, тем больше точек-пикселей приходится на один и тот же отрезок прямой, и в какой-то момент человеческий глаз перестает замечать "ступеньки". Однако для этого разрешение должно быть действительно большим, что не так уж удобно для повседневной работы, да и не каждая видеокарта сможет его обеспечить. Вот для борьбы с этим явлением и создан antialiasing.

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

Суперсэмплинг - это способ "грубой силы". Чтобы продемонстрировать, как он работает, возьмем какой-нибудь растровый графический редактор, например, Adobe Photoshop. Создадим в нем картинку в разрешении 800х600, состоящую из одной-единственной наклонной линии, расположенной под углом 45°. Зальем одну половину синим цветом. Сохраним и посмотрим результат. Как видим, ступеньки налицо. Теперь ту же линию создадим при разрешении 1024х768. Результат - ступенек больше, но они меньше, субъективно эта линия "более прямая", чем предыдущая. Повторяя этот эксперимент с все более высоким разрешением, мы В итоге, получим картинку, на которой невооруженным глазом (читай, без приближения) невозможно заметить неровности.


 Суперсэмплинг

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

Копнем чуть глубже. Если в разрешении 640х480 на экране находятся 307200 пикселей, то в 1280х960 - уже 1228800. Т.е. вместо одного пикселя адаптер каждый раз просчитывает 4, а значение цвета усредняет. При этом сглаживаются не только "ступеньки", улучшается и цвет всех текстур, переходы становятся более плавными.

Впрочем, идеалов в мире не бывает. За суперсэмплинг мы платим чудовищным падением производительности: минимум в 4 раза. Значит, нужно использовать более интеллектуальную методику, а не поигрывать "мышцами" видеопроцессора, которых не так уж и много. Этой методикой стал мультисэмплинг. Впервые эту технологию предложила небезызвестная компания 3DFx в 2000 году. Смысл мультисэмплинга состоит в том, что не нужно обрабатывать все до единого пиксели на экране, ведь подавляющее большинство из них находится внутри полигона, а не на границе между двумя. Конечно, отказ от сглаживания всей картинки ухудшает качество вывода текстур, но с этой проблемой призвана бороться билинейная, трилинейная и анизотропная фильтрация. Как говорится, каждый должен заниматься своей работой.

Технически мультисэмплинг происходит так. Видеопроцессор находит пиксели, расположенные на границе полигонов. Эти пиксели мы будем называть сэмплами. В зависимости от уровня мультисэмплинга процессор делит пиксель на 2, 4, 8 и т.д. субпикселей, и усредняет цвета каждого из них. В итоге, мы получаем не такое сильное падение производительности, как при грубом суперсэмплинге, по двум причинам:
  • во-первых, процессор сэмплирует только те участки картинки, где есть грани между полигонами;
  • во-вторых, он использует не новую текстуру для каждого субпикселя, а одну и ту же.

Особенность реализации мультисэмплинга у каждого из производителей видеокарт состоит в том, как именно процессор разбивает пиксели на субпиксели. Пойдем по порядку.

Поскольку основными игроками на рынке видеоадаптеров являются NVidia и ATi, их методики мы и опишем.

Начнем с NVidia. Компания использует прямую решетку для выбора субпикселей. Это значит, что пиксель делится на субпиксели по линиям, расположенным вертикально и горизонтально.


 Пиксели

Пиксели на картинке, расположенные рядами и столбцами в сетке

 Один пиксель

Один пиксель

 Четыре пикселя

Четыре пикселя, между которыми под углом 45 градусов проходит граница полигонов. Как видим, получаются ступеньки

Мультисэмлинг 2х

При мультисэмплинге 2х каждый пиксель делится на 2, при этом центром субпикселя становится вертикальный центр поделенной на 2 области (см. иллюстрацию)


 Мультисэмлинг 2х

Два субпикселя, образованные из одного пикселя при мультисэмплинге 2x

 Мультисэмлинг 2х

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


 Мультисэмлинг 2х

Мультисэмплинг 4х

При мультисэмплинге 4х пиксель делится на 4 равные части.


 Мультисэмплинг 4х

Четыре субпикселя, образованных из одного пикселя при мультисэмплинге 4х

 Мультисэмплинг 4х

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


 Мультисэмплинг 4х

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


 Мультисэмплинг 4х

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


 Мультисэмплинг 4х

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


 Мультисэмплинг 4х

Особых преимуществ при переходе на режим 4х мы тоже не получаем, только размер перехода между ступеньками становится чуть меньше.

Режим сглаживания 8х аналогичен режиму 4х, мы просто получаем на порядок больше субпикселей. Это немного улучшает картину, но приводит к значительному снижению производительности.

С появлением на рынке видеоадаптеров GeForce 3, а следом и GeForce 4, компания NVidia представила специфическую методику сглаживания. Она вошла в состав комплекса улучшения качества изображения Accuview. В этот комплекс входит и методика фильтрации текстур, но нас сейчас интересуют режимы сглаживания 4xs и Quincunx. Для GeForce 4 она доступна из настроек драйверов, а в GeForce 3 скрыта, но ее можно активировать, например, с помощью RivaTuner. Также подчеркнем, что под GeForce 4 тут понимаются модели GF Ti 4200/4400/4600, а не MX440, поскольку последняя - это доработанный GeForce 2 MX, а не принципиально новое ядро.

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


 Один пиксель, мультисэмплинг 2х и режим Quincunx

Один пиксель, мультисэмплинг 2х и режим Quincunx

Технология Accuview предусматривает смещение субпикселов на равное расстояние.


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

Режим 4XS отличается еще большей изощренностью при просчете картинки. Для этого пиксель делится сначала на 2 части по средней горизонтальной оси , и вычисляется цвет этих половин. Параллельно по вертикали он делится еще на 2 части, которые также сравниваются. В результате, мы получаем все тот же мультисэмплинг по 4 точкам, но один и тот же сэмпл используется не 4 раза, а 2. В итоге, мы получаем более качественное сглаживание и, что приятно - никакого падения производительности. Для простоты можно считать, что 4XS - это "2x, а потом еще раз 2x". Сегодня также доступен режим 8XS, фактически - двойной 4x. Вот какую иллюстрацию дает NVidia для демонстрации 4XS:


 4XS

Компания ATi пошла другим путем. Вместо того, чтобы бороться с некачественным сглаживанием путем наращивания количества сэмплов, она решила исказить решетку, по которой размещаются субпиксели. Исходно это решение использовала как раз 3dfx, назвав его Rotated Grid Super Sampling (RGSA).

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


 Выбор сэмплов при режиме 2х и 4х  Выбор сэмплов при режиме 2х и 4х

Выбор сэмплов при режиме 2х и 4х

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

Компания ATi применяет сглаживание в режиме 2х таким же способом, как и предложила 3dfx. А вот в режимах 4х и выше, канадцы пошли намного дальше, предложив псевдослучайный отбор местоположения сэмпла. Технология получила название SmoothVision.

Ядро для каждого пикселя может выбрать любую комбинацию из заложенных 8 положений субпикселей:


 8 положений субпикселей

В результате, в режиме 4х мы можем получить такие комбинации:


 режим 4х

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

Режим 6х, доступный видеокартам ATi, аналогичен режиму 4х, однако оцениваются 6 сэмплов, расположенных, как и раньше, псевдослучайно, например:


 Режим 6х

На сегодняшний день видеокарты, представленные на рынке, имеют режимы:

  • NVidia: 2x, 4x, 4XS, 6x, 8x, 8XS
  • ATi: 2x, 4x, 6x

С представлением технологий параллельной обработки видеоданных NVidia SLI и ATi Crossfire мы увидели новые режимы сглаживания. Впрочем, при более пристальном рассмотрении оказывается, что ничего нового в них нет. В режимах, предусматривающих разделение экрана пополам и обработку каждой половины отдельной видеокартой, ядро все так же традиционным образом применяет сглаживание для своей половины картинки. При этом ядра используют разные расположения субпикселей. А вот потом, при выводе на экран, у нас получается, что у нас есть две половины картинки, пиксели на каждой из которых сглажены по n сэмплов (2, 4, 6, 8XS). Маркетологи компаний, недолго думая, взяли, да и назвали эти режимы по принципу 2n Antialiasing. Например, в Crossfire мы можем понаблюдать 4x, 8x и 12x AA.


 Crossfire

Но с пришествием в мир технологий SLI и Crossfire к нам вернулся и старый знакомый - суперсэмплинг. Теперь у обоих производителей доступны режимы, в которых традиционный сегодня мультисэмплинг комбинирован с простым суперсэмплингом 2х, который позволяет улучшить качество текстур и сгладить изображения не только на гранях полигонов, но и внутри них (например, текстуру с надписью наподобие тех же вывесок в любых играх). Эти режимы объединены в понятие SLI AA и Crossfire Super AA.

Для простоты понимания приведем сводную таблицу режимов сглаживания в картах ATi с поддержкой Crossfire:


 таблица режимов сглаживания

Вывод. Перспективы развития

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

На данный момент никаких радикальных изменений в технологиях сглаживания не происходит, и вряд ли произойдет. Поскольку главное улучшение - переход к искаженной решетке - уже сделано, производителям остается лишь увеличивать количество сэмплов. Именно поэтому уже сейчас у нас есть режимы 6x и 8x.

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



Оригинал материала: https://3dnews.ru./173183