Anti aliasing in windows

Webfonts — разбираемся с антиалиасингом под Windows (UPD)

Думаю, что не только я, но и другие пользователи Chrome под Windows, на многих сайтах замечали проблемы c отображением нестандартных шрифтов. Читать текст на таких сайтах можно, но глазам больно. Я бы так все это и продолжал терпеть, но на одном из недавних собственных проектов этот вопрос встал буквально ребром. Решил разобраться во всем досконально.

Разница в этих двух фрагментах очевидна. Первый сделан со случайно выбранного сайта adaptive-images, а второй с его локальной копии, в css которой была изменена буквально одна строчка.

(Читавшие первую версию статьи могут сразу перейти к UPD, где приведено работающее альтернативное решение проблемы для Chrome)

Суть проблемы

Небольшое общее замечание — приведенные в статье исследования проводились под Windows 7. Будет интересно узнать в комментариях о положении дел на других платформах.

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

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

Chrome

К счастью, я не первый, кто сталкивается с этой проблемой и поиск по ключевым словам быстро вывел на ее решение с помощью использования SVG шрифтов, которые, в отличии от своего TrueType аналога, в Chrome рендерятся с применением первого типа сглаживания, то есть антиалиасинга. Казалось бы,- вот оно счастье,- но не тут-то было!

Наверняка, существуют и другие способы получения необходимых font-файлов, но почему-то мной был выбран сервис FontSquirrel. Не хочу делать поспешных выводов, но на мой взгляд, в их генератор css вкралась ошибка.

В качестве подопытного кролика возьмем уже готовый шрифт Colaborate с их сайта. В архиве находится набор шрифтов в различных форматах, файл css и demo.html Открываем последний в Chrome и начинаем недоумевать, а где же, собственно, сглаживание? Особенно сильно его отсутствие заметно у Bold начертания.

Откроем css и посмотрим, что же для нас сгенерировали на сервере FontSqurell:

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

Как было написано выше, разница лишь в одной строчке. Определение svg шрифта поставлено сразу под определение eot и из него удалена подстрока #ColaborateThinRegular. О разнице судите сами — справа фрагмент с оригинальным css (сглаживания нет), слева после внесения исправлений:

Объяснение этому весьма простое — переместив описание svg шрифта мы повысили его приоритет в WebKit браузерах (Chrome, Safari) и он стал использоваться вместо TTF, который эти браузеры под Windows почему-то не сглаживают.

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

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

Оптимизация загрузки

Как известно, любая красота требует жертв. В случае с пользовательскими шрифтами жертвовать приходится временем загрузки страницы за счет увеличения размеров загружаемых данных. Бороться с этим можно, применив сжатие наших шрифтовых файлов. Для svg процедура следующая — при помощи gzip сжимаем наш файл, переименовываем его — присваиваем расширением svgz и добавляем в конфигурацию сервера новый MIME-type. Привожу пример для Apache (можно указывать в .htaccess):

И меняем соответствующую строчку в css (добавляем z) — url(‘ColabThi-webfont.svgz‘) format(‘svg’)

Обратите внимание, font/opentype не является стандартным MIME-type, но именно такой тип помогает избавиться от назойливой ошибки в консоли Chrome: Resource interpreted as Font but transferred with MIME type image/svg+xml

Настройки FontSquirrel

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

Другие браузеры

В заключении, коротко коснусь особенностей IE, FireFox и Opera. Напомню, что речь идет о Windows7.

Тут стоит сказать, что алгоритм антиалиасинга, применяемый Chrome для SVG шрифтов, это не то же самое, что субпиксельное сглаживание, используемое различными ОС для отображения экранных шрифтов. В Windows эта технология называется ClearType. Посмотрите на разницу — красный шрифт это Chrome + SVG Antialiasing, черный FireFox + TTF ClearType. На этом фрагменте хорошо заметно, что антиалиасинг добавляет «лишние» пиксели, делая буквы чуть шире. Для некоторых макетов про кросбраузерную pixel perfect верстку можно забыть.

Нехитрым экспериментальным путем удалось установить, что сглаживание в FF и большой O напрямую зависят от настроек ClearType в операционной системе. Если выключить эту функцию, то заставить браузеры сглаживать шрифты невозможно, хотя IE игнорирует указания операционной системы и сглаживает шрифты всегда. Как пишут, какое-то время назад появилась css директива (-webkit-)font-smooth(ing), но в последних версиях FireFox ее поддержку почему-то убрали. Если вы знаете, как можно обойти эти ограничения, напишите пожалуйста об этом в комментариях. Так же неясен ответ на вопрос как отключить сглаживание шрифтов, ведь существуют ситуации, когда этого делать не надо.

Заключение

В процессе написания этой статьи был прочитан ряд тематических статей и просмотрено много сайтов через призму использования нестандартных шрифтов, с целью определения для себя сферы применимости этой полезной технологии. Хочу сказать, что вывод я сделал следующий — применять нестандартные фонты можно и нужно (иначе, всех зохавает bootstrap), но в ограниченном количестве, для декорирования некоторых элементов UI. И основной текстовый контент нужно оставить в покое! Иначе, сайт может выглядеть совсем не так, как это изначально задумывалось. В подкреплении этих слов даю ссылку на вдумчивую статью, в которой говорится приблизительно тоже самое, но более развернуто. Возможно, в будущем ситуация изменится, но для этого в браузерах должна появиться единая подсистема управления рендерингом шрифтов, одинаково отображающая текст, хотя бы в рамках одной платформы.

Читайте также:  Состояние 0xc0000225 что делать windows

UPD Эврика! После напоминания от GreatRash решил все-таки узнать причину, по которой у меня не срабатывал -webkit-font-smoothing и нашел в процессе баг репорт. Там сто с лишним комментариев, но среди вялого бухтения встретился настоящий бриллиант! Эта конструкция позволяет отказаться от SVG шрифтов и, на первый взгляд, Chrome стал рендерить текст так же, как и все остальные браузеры, хотя расстояние между буквами остается другим, но это, видимо, тоже можно вылечить вот по этому рецепту

@font-face anti-aliasing on windows and mac

I’ve used http://www.fontsquirrel.com/ to create a @font-face kit.
It works fine, but the result on windows is different from the result on mac.
On windows the font seems to have a wrong anti-aliasing:
this is the result on Mac with FF, Chrome or Safari (all updated to last version).
this is the result on Windows with FF or Chrome.

As you can see, the result is not the same. On Windows the font is thicker and rougher.
How can I solve this?

8 Answers 8

This just looks like the normal ugly way fonts are rendered in WinXP. Some (IMO: misguided) people even prefer it.

To get anti-aliasing for desktop fonts in general on XP you have to turn it on, from Display Properties -> Appearance -> Effects -> Use the following method to smooth edges of screen fonts -> ClearType. The default setting “Standard” is the old-school Windows “font smudging” technique that only bothers to turn on at larger font sizes, and then often makes a mess.

IE7+ has an option—on by default—to always use ClearType anti-aliasing to render fonts in the web browser. Other web browsers will respect the user’s configured font rendering method. It is a shame that so many people still have this beneficial setting turned off, but it’s not really your problem.

(There is nasty hack to make Chrome perform some anti-aliasing on text, which is:

Алгоритмы антиалиасинга в реальном времени

Алиасинг (aliasing) — это, возможно, наиболее фундаментальный и самый широко обсуждаемый артефакт 3D-рендеринга всех времён. Однако в игровом сообществе его часто недопонимают. В этой статье я подробно расскажу о теме сглаживания (антиалиасинга, anti-aliasing, AA) в реальном времени, особенно о том, что касается игр, и в то же время буду излагать всё достаточно простым языком.

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

Эту программу можно скачать здесь.

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

Природа алиасинга

«Если ты знаешь себя и знаешь врага, то не подвергнешься опасности и в сотне битв»

Как учит нас Сунь Цзы, чтобы победить врага, нам нужно сначала понять его. Врагом — простите меня за излишнюю драматичность — методов сглаживания являются артефакты алиасинга. Поэтому нам первым делом нужно понять, как и откуда появляется алиасинг.

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

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

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

При идеальном сглаживании для каждого пикселя определяется, какая часть его площади закрыта треугольником. Если пиксель закрыт на 50%, то он должен быть заполнен цветом на 50% между белым и чёрным (средним серым). Если он закрыт меньше, то должен быть пропорционально темнее, если больше — то пропорционально светлее. Полностью закрытый пиксель является белым, полностью незакрытый — чёрным. Результат этого процесса показан на четвёртом рисунке. Однако выполнение этого вычисления в реальном времени в общем случае является невыполнимой задачей.

Рисунок 1. Простейший алиасинг.

1-1. Сетка 8×8 с помеченными центрами

1-2. Сетка 8×8 с треугольником

1-3. Сетка 8×8 с растеризированным треугольником

1-4. Сетка 8×8 с идеально сглаженными выходными данными

Типы алиасинга

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

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

Читайте также:  Windows 10 пропадает зарядка

Рисунок 2: Различные типы алиасинга. Слева направо, сверху вниз:
• Единственный выровненный относительно экрана прямоугольник с частично прозрачной текстурой.
• «Мельница», состоящая из выровненных относительно экрана переменных белых и чёрных треугольников.
• Несколько чёрных линий различной ширины, начиная с 1 пикселя сверху до 0,4 пикселя снизу, и белая линия толщиной 0,5, отображающая синусоиду.
• Куб, состоящий из шести плоских закрашенных прямоугольников
• Наклонная плоскость, текстурированная высокочастотной текстурой травы.
• Выровненный относительно экрана прямоугольник с пиксельным шейдером, определяющим цвет каждого пикселя на основе функции синуса.

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

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

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

Рисунок 3. Иллюстрация подпиксельного алиасинга.

3-1. Сетка 8×8 с отмеченными центрами

3-2. Сетка 8×8 с двумя отрезками прямых

3-3. Сетка 8×8 с растеризированными отрезками, без AA

3-4. Сетка 8×8 с идеально сглаженным треугольником

На Рисунке 3 показан подпиксельный алиасинг в простой сцене, состоящей из двух отрезков прямых. Верхний имеет ширину в один пиксель, и хотя при растеризации он демонстрирует знакомый артефакт-«лесенку» геометрического алиасинга, результат всё равно в целом соответствует по форме входным данным. Нижний отрезок имеет ширину полпикселя. При растеризации часть пересекаемых им столбцов пикселей не имеет одного центра пикселя в пределах отрезка. В результате он разделяется на несколько несвязанных фрагментов. То же самое можно заметить на прямых линиях и кривой синусоиды на Рисунке 2.

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

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

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

Техники сглаживания на основе сэмплирования

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

Давайте снова рассмотрим наш первый пример с треугольником в сетке 8×8 пикселей. Проблема со стандартным рендерингом заключается в том, что мы сэмплируем только центр каждого пикселя, что приводит к генерированию уродливой «лесенки» на рёбрах, которые не являются полностью горизонтальными или вертикальными. С другой стороны, вычисление покрытия каждого пикселя невозможно в реальном времени.

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

Рисунок 5: треугольник, растеризированный с четырьмя упорядоченными сэмплами на пиксель

Центры пикселей снова помечены красными точками. Однако в каждом пикселе сэмплируется на самом деле четыре отдельных места (они помечены бирюзовыми точками). Если треугольник не закрывает ни один из этих сэмплов, то пиксель считается чёрным, а если закрывает их всех, то белым. Здесь интересна ситуация, когда закрыта только часть пикселей: если закрыт один из четырёх, то пиксель будет на 25% белым и на 75% чёрным. В случае двух из четырёх соотношение 50/50, а при трёх закрытых сэмплах результатом будет более светлый оттенок в 75% белого.

Эта простая идея является фундаментом всех методов антиалиасинга на основе сэмплирования. В этом контексте также стоит заметить, что когда количество сэмплов на пиксель стремится к бесконечности, то результат этого процесса будет стремиться к «идеальному» сглаженному примеру, показанному ранее. Очевидно, что качество результата сильно зависит от количества использованных сэмплов — но и производительность тоже. Обычно в играх используется 2 или 4 сэмплов на пиксель, а 8 и более обычно применяются только в мощных PC.

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

Расположение сэмплов

Расположение сэмплов внутри пикселя сильно влияет на конечный результат, особенно в случае небольшого количества сэмплов (2 или 4), которое чаще всего используется в графике реального времени. В предыдущем примере сэмплы располагаются так, как будто они являются центрами отрендеренного изображения в четыре раза больше исходного (16×16 пикселей). Это интуитивно понятно и легко достигается простым рендерингом изображения бОльших размеров. Этот метод известен как антиалиасинг на упорядоченной сетке (ordered grid anti-aliasing, OGAA), также его иногда называют субдискретизацией (downsampling). В частности, его реализуют принудительным увеличением разрешения рендеринга по сравнению с разрешением монитора.

Читайте также:  Брутфорс пароля для windows

Однако упорядоченная сетка часто неоптимальна, особенно для почти вертикальных и почти горизонтальных линий, в которых как раз наиболее очевидны артефакты алиасинга. На Рисунке 6 показано, почему так происходит, и как повёрнутая или разреженная сетка сэмплирования обеспечивает гораздо лучшие результаты:

6-1. Сцена с почти вертикальной линией

6-2. Идеально сглаженная растеризация

6-3. Растеризация с четырьмя упорядоченными сэмплами

6-4. Сглаживание с четырьмя разреженными сэмплами

В этом почти вертикальном случае идеальный результат с четырьмя сэмплами должен иметь пять различных оттенков серого: черный при полностью незакрытых сэмплах, 25% белого при одном закрытом сэмпле, 50% при двух и так далее. Однако растеризация с упорядоченной сеткой даёт нам всего три оттенка: чёрный, белый и 50/50. Так происходит, потому что упорядоченные сэмплы расположены в два столбца, а потому, когда один из них закрывается почти вертикальным примитивом, другой тоже скорее всего будет закрыт.

Как показано на изображении с разреженным сэмплингом, эту проблему можно обойти, изменив положение сэмплов внутри каждого пикселя. Идеальным расположением сэмплов для сглаживания является разреженное. Это означает, что при N сэмплов никакие два сэмпла не имеют одного общего столбца, строки или диагонали в сетке NxN. Такие паттерны соответствуют решениям задачи об N ферзях. Методы антиалиасинга, в которых используются такие сетки, называют выполняющими антиалиасинг на разреженных сетках (sparse grid anti-aliasing, SGAA).

Типы сэмплов

Самый простой подход к антиалиасингу изображения на основе сэмплирования заключается в том, что все вычисления выполняются для «реального» пикселя каждого сэмпла. Хотя этот подход высокоэффективен для удаления всех типов артефактов алиасинга, он также является очень вычислительно затратным, потому что при N сэмплах увеличивает в N раз затраты на затенение, растеризацию, занимаемую полосу пропускания и память. Техники, при которых все вычисления выполняются для каждого отдельного сэмпла, называются сглаживанием суперсэмплингом (super-sampling anti-aliasing, SSAA).

Примерно в начале этого века в графическое оборудование была встроена поддержка антиалиасинга мультисэмплингом (multi-sample anti-aliasing, MSAA), являющегося оптимизацией суперсэмплинга. В отличие от случая SSAA, в MSAA каждый пиксель затеняется только один раз. Однако для каждого сэмпла вычисляются значения глубины и стенсила, что обеспечивает то же качество сглаживания на рёбрах геометрии, что и в SSAA, при значительно меньшем снижении производительности. Кроме того, возможны дальнейшие улучшения производительности, особенно занятой полосы пропускания, если поддерживается сжатие Z-буфера и буфера цвета. Они поддерживаются во всех современных архитектурах видеопроцессоров. Из-за способа оптимизации сэмплирования MSAA, с алиасингом прозрачности, текстур и шейдеров таким образом напрямую справляться невозможно.

Третий тип сэмплирования был представлен компанией NVIDIA в 2006 году в технологии антиалиасинг покрытия сэмплирования (coverage sampling anti-aliasing, CSAA). MSAA отделяет затенение от попиксельного вычисления глубины и стенсила, а CSAA добавляет сэмплы покрытия, которые не содержат значений цвета, глубины или стенсила — в них хранится только двоичное значение покрытия. Такие двоичные сэмплы используются для помощи в смешивании готовых сэмплов MSAA. То есть режимы CSAA добавляют сэмплы покрытия к режимам MSAA, но не имеет смысла выполнять сэмплирование покрытия без создания множества сэмплов MSAA. В современном оборудовании NVIDIA используется три режима CSAA: 8xCSAA (4xMSAA / 8 сэмплов покрытия), 16xCSAA (4x/16), 16xQCSAA (8x/16) и 32xCSAA (8x/32). У AMD есть похожая реализация с 4x EQAA (2x/4), 8xEQAA (4x/8) и 16xEQAA (8x/16). Дополнительные сэмплы покрытия обычно только незначительно влияют на производительность.

Группировка сэмплов

Последним ингредиентом методов AA на основе сэмплирования является способ группировки сэмплов, то есть то, как отдельные сэмплы, сгенерированные при рендеринге, собираются в конечный цвет каждого пикселя. Как показано на Рисунке 7, для этой цели используются различные фильтры группировки. На рисунке показаны пиксели 3×3 — бирюзовые точки обозначают позиции сэмплов, а жёлтый оттенок обозначает фильтр группировки сэмплов.

7-2. Фильтр Quincunx

Очевидный и самый распространённый метод группировки просто накапливает каждый сэмпл в квадратной области, представляющей пиксель с равными весами. Это называется фильтром «box», и используется во всех обычных режимах MSAA.

Одним из первых подходов, пытавшихся улучшить эффект сглаживания с помощью малого количества сэмплов, является антиалиасинг «quincunx». В нём на пиксель вычисляется всего два сэмпла: один в центре, и один смещённый на полпикселя вверх и влево. Однако вместо этих двух сэмплов накапливается пять сэмплов, составляющих паттерн, показанный на Рисунке 7. Это приводит к значительному снижению алиасинга, но в то же время размывает всё изображение, потому что значения цветов окружающих пикселей группируются в каждый пиксель.

Более гибкий подход был представлен в 2007 году компанией AMD в серии видеопроцессоров HD 2900. В них используется программируемая группировка сэмплов, что позволяет реализовать режимы группировки «narrow tent» и «wide tent». Как показано выше, каждый сэмпл не имеет одинаковый вес. Вместо этого используется функция взвешивания, зависящая от расстояния до центра пикселя. Узкий (narrow) и широкий (wide) варианты используют разный размер ядра фильтра. Эти способы группировки можно сочетать с различным количеством сэмплов, и некоторые из полученных результатов показаны на общем сравнении. Что касается quincunx AA, то эти методы представляют собой компромисс между резкостью изображения и снижением алиасинга.

Сравнение AA сэмплирования

На Рисунке 8 показано сравнение всех рассмотренных нами методов AA на основе сэмплирования с различным количеством сэмплов. На изображении «ground truth» показано ближайшее к «реальному», идеальное представление сцены. Оно создано сочетанием 8xSGSSAA и 4×4 OGSSAA.

Стоит заметить аналогичное качество SGMSAA и SGSSAA с одинаковым количеством сэмплов при геометрическом алиасинге, и нехватку антиалиасинга прозрачности, текстур и шейдеров в случае MSAA. Недостатки упорядоченных паттернов сэмплинга, особенно для почти горизонтальных и почти вертикальных линий сразу заметны при сравнении 4x SGSSAA и 2×2 OGSSAA. При всего двух сэмплах на пиксель OGSSAA ограничен только горизонтальным (2×1) или только вертикальным (1×2) AA, а разреженный паттерн в какой-то мере может покрывать оба типа рёбер.

Методы AA с фильтрами группировки сэмплов, отличающиеся от обычного фильтра box, обычно обеспечивают более качественное снижение алиасинга на сэмпл, но страдают от эффекта размытия всего изображения.

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

Рисунок 8: Обработка различных типов алиасинга различными методами AA на основе сэмплирования.

Оцените статью