что такое antialiasing в играх
Борьба с графическими несовершенствами: технология Anti-aliasing в играх
В настройках вашей любимой игры есть стандартный набор параметров: звук, скорость мыши и другие. Одна из настроек в графическом меню называется «сглаживание».
Она включает множество опций для изменения качества графики. Но что на самом деле делает этот алгоритм, почему он есть во всех старых играх и исчезнет ли в ближайшем будущем?
Сглаживание в играх: история появления технологии
Anti Aliasing (сглаживание) — алгоритм устранения эффекта «зубчатости» (отчетливо видимых пикселей) на экране. Разработку в 1972 году в Массачусетском технологическом институте представила команда Architecture Machine Group, которая позже стала называться Media Lab — лаборатория, занимающаяся изучением и разработкой в сфере технологий, науки, искусства, дизайна, медицины.
Принцип работы технологии — создание дополнительных оттенков пикселей, которыми нарисованы кривые линии в изображениях игр. В этом случае добавленные элементы мягко сглаживают границы, создавая градиент. То есть параметр antialiasing в играх влияет на общее качество картинки.
Так почему же возникает эффект «зубчатости»?
Современные мониторы, экраны мобильных устройств состоят из четырехугольных элементов — пикселей. Значит, фактически прямыми, с четкими границами отобразятся только горизонтальные или вертикальные линии. Кривые, расположенные под углом, отображаются в виде «ступеней». Например, линия на картинке ниже кажется прямой, но при приближении становится ясно, что это не так.
Любой, кто играл в старые игры, знаком с характерной пиксельной и блочной эстетикой той эпохи. «Зубчатость» возникает из-за отсутствия плавного перехода между цветами и в этой ситуации на помощь приходит антиалиасинг.
Главное предназначение сглаживания — борьба за качество изображения в игре. С появлением динамичной картинки будет визуализироваться эффект шума — кривые постоянно перестраиваются, отвлекая от истории, делая картинку низкокачественной. Кроме того, объекты на дальнем плане станут достаточно размытыми.
При включенном алгоритме сглаживания картинка становится красивой, но появляется ощутимый минус — дополнительная нагрузка на производительность. За счет новой задачи процессор и видеокарта начинают рендерить дополнительные оттенки, расходовать ресурсы мощности.
Один из способов исправить подобные проблемы — уменьшить пиксели. Изображение, состоящее из 30 квадратов, выглядит более блочным, чем состоящее из 3000 квадратов. Другими словами, высокое разрешение может помочь в решении вопроса.
Но разрешение не всесильно. Чтобы устранить блочный вид в игровом пространстве, разработчики программного обеспечения используют сложные вычислительные методы. Цель: устранить неровные края, которые возникают при создании непрямоугольных форм из прямоугольных пикселей.
Методы сглаживания начали активно развиваться в начале 2000-х и с тех пор претерпели множество изменений.
Первый алгоритм назывался «суперсэмплинг»: примитивный и грубый подход, при котором пиксели разделяются на несколько отдельных выборок, каждая по четыре квадрата. Далее эти сэмплы анализировались, чтобы определить средний цвет всех четырех пикселей. Среднее значение набора использовалось разработчиками, чтобы вносить правки в линии или края.
Этот древний алгоритм требует значительных вычислительных ресурсов, что может вызвать мощную нагрузку на ваш графический процессор
Современные типы сглаживания в играх
SSAA (Super Sample Anti Aliasing)
Любимый многими и максимально качественный вариант сглаживания, дает четкое изображение.
Главный минус — опция резко снижает производительность техники. В этом случае видеокарта искусственно увеличивает разрешение экрана, а с появлением картинки кадр уменьшается до исходного вида.
Например, на экране Full HD (1920×1080) четырехкратный anti-aliasing позволит получить картинку в 4K-качестве (3840×2160)!
SSAA нивелирует видимую «зубчатость», делает дальние объекты четкими, гарантируя качественное изображение для максимального погружения в действо.
Технология SSAA реализован в проектах, где ресурсозатратность такого типа компенсируется высокой производительностью игры. Изредка в настройках есть опция SSAA x 0,5: качество изображения падает вдвое, потом увеличивается при появлении на экране. Визуальная часть становится печальной, но производительность игры — растет.
MSAA (MultiSample antialiasing)
Данная техноллогия — более «легкая» замена SSAA. Применяется в ситуациях, где необходимо сгладить края контрастных сегментов, небольших объектов на заднем плане. Тип сглаживания неэффективен для игр с множеством мелких деталей: текстуры, растения, виды городов. Тогда такой anti-aliasing-прием становится ничем не легче SSAA.
FXAA (Fast approXimate antialiasing)
Вы хотите настроить сглаживание, но у вас слабенький ПК? FXAA подойдет вам идеально, ведь он наименее требователен к ресурсам техники. Вместо того, чтобы вычислять цвета и геометрию игры, он просто размывает неровные края.
Принцип работы алгоритма — добавление по краям кривой дополнительных пикселей с усредненными цветами. Это популярный, но не суперкачественный вариант — границы получаются чересчур размытыми. Вам придется выбрать, с чем проще смириться: с «лесенкой» или излишним блюром.
MLAA (MorphoLogical AA)
Аналогичная FXAA технология от компании Intel находит резкие переходы цвета и градуирует их. Процесс запускается после появления окончательной версии кадра, поэтому нагрузка идет сразу на центральный процессор устройства. Игра работает так же резво, но размытие картинки остается заметным.
SMAA (Subpixel Morphological AA)
Anti-aliasing технология, созданная по аналогии с FXAA и MLAA. Алгоритм вычисляет и добавляет дополнительные «усредненные» пиксели не только на контрастных участках, но и на тех, которые резко отличаются по яркости. Процесс нагружает непосредственно видеокарту, влияя на производительность игры. Картинка остается такой же размытой, как и в двух предыдущих вариантах.
TXAA/TAA (Temporal AA)
Продукт от компании Nvidia соединила MSAA и SMAA, добавив функцию определения вибрации объектов. Система анализирует предыдущие кадры, сравнивая положение пикселей. Такое сглаживание хорошо работает, если изображение на экране статично. Но как только начинается движение — ресурсозатратность взлетает до небес, появляются визуальные ошибки из-за остаточных кадров из «прошлого», размытие становится очень заметным.
Это самая новая из перечисленных технологий, которая поддерживается только современными видеокартами.
DSR (Dynamic Super Resolution)
Разработчик видеокарт Nvidia разработал алгоритм, похожий на SSAA. DSR работает в три этапа:
Когда выбранная игра не поддерживает этот тип сглаживания, возникают ощутимые неудобства — интерфейс и мышь будут подтормаживать, ведь по факту вы играете в разрешении выше, нежели это позволяет монитор.
CSAA/CFAA (Coverage Sampling AA/Custom-Filter AA)
Вариация на тему MSAA. Получаем картинку качества MSAA x 8, но производительность требует мощности, как для MSAA x 4. Изображение четкое! Алгоритм определяет не только саму «зубчатость», но и соседние пиксели: сглаживание срабатывает для больших объектов, а мелкие детали не размываются.
Иллюстрация популярных типов сглаживания на примере игры GTA:
Какой тип antialiasing выбрать, если в игре есть несколько вариантов? Все зависит от вашего «железа».
Вам придется немного поэкспериментировать, ведь ваш компьютер «не очень хорош для игр, но и не ужасен». Вы определенно сможете запустить SMAA, и, возможно, MLAA или FXAA. Будет ли работать MSAA на приличной скорости — вопрос открытый.
С таким «железом» уверенно запускайте игру на максимальной мощности. Если в игре есть бегунок регулировки степени сглаживания — протестируйте разную степень антиалиасинга, чтобы выбрать идеальный вариант.
Почему методы сглаживания важны для игр?
В последние годы разрешение дисплеев выросло до уровня, при котором пиксели стали невидимыми. Чтобы рассмотреть квадратики даже на обычном 24-дюймовом мониторе с качеством 1080p, нужно приблизиться к экрану вплотную. А означает, что антиалиасинг уходит на второй план, ведь графические процессоры становятся мощнее, а среднее разрешение экранов увеличивается. Сегодня многие старые игры можно прекрасно запускать вообще без сглаживания!
Но новым играм без сглаживания никуда. Геймеры используют широкоформатные мониторы с высоким разрешением, где качество картинки должно быть на максимальном уровне!
Стоит ли отключать Anti-Aliasing?
В многопользовательских играх важна точность до пикселя. А значит — качественная картинка даст вам преимущество над соперниками.
Как и во многих других случаях в жизни, лучший способ узнать, нужно ли вам сглаживание, — это протестировать разные варианты.
Загрузите любимую игру и посмотрите, нравится ли вам картинка, как она изменяется с разными настройками, не меняется ли ее производительность. Выбирая настройки сглаживания, помните, что нет идеального типа настройки. Решающим фактором будет ваш компьютер, монитор и требования выбранной игры.
В прошлом сглаживание было важным вопросом. С улучшенной графикой и дисплеями с более высоким разрешением это уходит в прошлое. В некоторых случаях более новые игры вообще не требуют сглаживания. Несмотря на это, важно знать этот термин, чтобы принимать обоснованные решения о балансировании производительности и визуальных эффектов вашей следующей компьютерной игры.
Знание различных алгоритмов также может помочь вам, если вы когда-нибудь решите создать свою собственную игру.
Подписывайтесь на страницы VOKI Games в социальных сетях, будьте в курсе свежих новостей компании 🙂
Что такое antialiasing в играх
Думаю, с понятием разрешения знакомы уже более-менее все игроки, но на всякий случай вспомним основы. Все же, пожалуй, главный параметр графики в играх.
Изображение, которое вы видите на экране, состоит из пикселей. Разрешение — это количество пикселей в строке, где первое число — их количество по горизонтали, второе — по вертикали. В Full HD эти числа — 1920 и 1080 соответственно. Чем выше разрешение, тем из большего количества пикселей состоит изображение, а значит, тем оно четче и детализированнее.
Влияние на производительность
Очень большое.Увеличение разрешения существенно снижает производительность. Именно поэтому, например, даже топовая RTX 2080 TI неспособна выдать 60 кадров в 4K в некоторых играх, хотя в том же Full HD счетчик с запасом переваливает за 100. Снижение разрешения — один из главных способов поднять FPS. Правда, и картинка станет ощутимо хуже.
В некоторых играх (например, в Titanfall) есть параметр так называемого динамического разрешения. Если включить его, то игра будет в реальном времени автоматически менять разрешение, чтобы добиться заданной вами частоты кадров.
Вертикальная синхронизация
Если частота кадров в игре существенно превосходит частоту развертки монитора, на экране могут появляться так называемые разрывы изображения. Возникают они потому, что видеокарта отправляет на монитор больше кадров, чем тот может показать за единицу времени, а потому картинка рендерится словно «кусками».
Вертикальная синхронизация исправляет эту проблему. Это синхронизация частоты кадров игры с частотой развертки монитора. То если максимум вашего монитора — 60 герц, игра не будет работать с частотой выше 60 кадров в секунду и так далее.
Есть и еще одно полезное свойство этой опции — она помогает снизить нагрузку на «железо» — вместо 200 потенциальных кадров ваша видеокарта будет отрисовывать всего 60, а значит, загружаться не на полную и греться гораздо меньше.
Впрочем, есть у Vsync и недостатки. Главная — очень заметный «инпут-лаг», задержка между вашими командами (например, движениями мыши) и их отображением в игре.
Поэтому играть со включенной вертикальной синхронизацией в мультипеере противопоказано. Кроме того, если ваш компьютер «тянет» игру при частоте ниже, чем заветные 60 FPS, Vsync может автоматически «лочиться» уже на 30 FPS, что приведет к неслабым таким лагам.
Лучший способ бороться с разрывами изображения на сегодняшний день — купить монитор с поддержкой G-Sync или FreeSync и соответствующую видеокарту Nvidia или AMD. Ни разрывов, ни инпут-лага.
Влияние на производительность
В общем и целом — никакого.
Сглаживание(Anti-aliasing)
Если нарисовать из квадратных по своей природе пикселей ровную линию, она получится не гладкой, а с так называемыми «лесенками». Особенно эти лесенки заметны при низких разрешениях. Чтобы устранить этот неприятный дефект и сделать изображения более четким и гладким, и нужно сглаживание.
Здесь и далее — слева изображение с отключенной графической опцией (или установленной на низком значении), справа — с включенной (или установленной на максимальном значении).
Технологий сглаживания несколько, вот основные:
Влияние на производительность
От ничтожного (FXAA) до колоссального (SSAA). В среднем — умеренное.
Качество текстур
Один из самых важных параметров в настройках игры. Поверхности всех предметов во всех современных трехмерных играх покрыты текстурами, а потому чем выше их качество и разрешение — тем четче, реалистичнее картинка. Даже самая красивая игра с ультра-низкими текстурами превратится в фестиваль мыловарения.
Влияние на производительность
Если в видеокарте достаточно видеопамяти, то практически никакого. Если же ее не хватает, вы получите ощутимые фризы и тормоза. 4 гигабайт VRAM хватает для подавляющего числа современных игр, но лучше бы в вашей следующей видеокарте памяти было 8 или хотя бы 6 гигабайт.
Анизотропная фильтрация
Анизотропная фильтрация, или фильтрация текстур, добавляет поверхностям, на которые вы смотрите под углом, четкости. Особенно ее эффективность заметна на удаленных от игрока текстурах земли или стен.
Чем выше степень фильтрации, чем четче будут поверхности в отдалении.
Этот параметр влияет на общее качество картинки довольно сильно, но систему при этом практически не нагружает, так что в графе «фильтрация текстур» советуем всегда выставлять 8x или 16x. Билинейная и трилинейная фильтрации уступают анизотропной, а потому особенного смысла в них уже нет.
Влияние на производительность
Тесселяция
Технология, буквально преображающая поверхности в игре, делающая их выпуклыми, рельефными, натуралистичными. В общем, тесселяция позволяет отрисовывать гораздо более геометрически сложные объекты. Просто посмотрите на скриншоты.
Влияние на производительность
Зависит от игры, от того, как именно движок применяет ее к объектам. Чаще всего — среднее.
Качество теней
Все просто: чем выше этот параметр, тем четче и подробнее тени, отбрасываемые объектами. Добавить тут нечего. Иногда в играх также встречается параметр «Дальность прорисовки теней» (а иногда он «вшит» в общие настройки). Тут все тоже понятно: выше дальность — больше теней вдалеке.
Влияние на производительность
Зависит от игры. Чаще всего разница между низкими и средними настройками не столь велика, а вот ультра-тени способны по полной загрузить ваш ПК, поскольку в этом случае количество объектов, отбрасывающих реалистичные тени, серьезно вырастает.
Глобальное затенение (Ambient Occlusion)
Один из самых важных параметров, влияющий на картинку разительным образом. Если вкратце, то AO помогает имитировать поведения света в трехмерном мире — а именно, затенять места, куда не должны попадать лучи: углы комнат, щели между предметами и стенами, корни деревьев и так далее.
Существует два основных вида глобального затенения:
SSAO (Screen space ambient occlusion). Впервые появилось в Crysis — потому тот и выглядел для своего времени совершенно фантастически. Затеняются пиксели, заблокированные от источников света.
HBAO (Horizon ambient occlusion). Работает по тому же принципу, просто количество затененных объектов и зон гораздо больше, чем при SSAO.
Влияние на производительность
Глубина резкости (Depth of Field)
То самое «боке», которое пытаются симулировать камеры большинства современных объектов. В каком-то смысле это имитация особенностей человеческого зрения: объект, на который мы смотрим, находится в идеальном фокусе, а объекты на фоне — размыты. Чаще всего глубину резкости сейчас используют в шутерах: обратите внимание, что когда вы целитесь через мушку, руки персонажа и часть ствола чаще всего размыты.
Впрочем, иногда DoF только мешает — складывается впечатление, что у героя близорукость.
Влияние на производительность
Целиком и полностью зависит от игры. От ничтожного до довольно сильного (как, например, в Destiny 2).
Bloom (Свечение)
Этот параметр отвечает за интенсивность источников света в игре. Например, с включенным Bloom, свет, пробивающийся из окна в помещение, будет выглядеть куда ярче. А солнце создавать натуральные «засветы». Правда, некоторые игры выглядят куда реалистичнее без свечения — тут нужно проверять самому.
Влияние на производительность
Чаще всего — низкое.
Motion Blur (Размытие в движении)
Motion Blur помогает передать динамику при перемещениях объекта. Работает он просто: когда вы быстро двигаете камерой, изображение начинает «плыть». При этом главный объект (например, руки персонажа с оружием) остается четким.
Алгоритмы антиалиасинга в реальном времени
Алиасинг (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.
Рисунок 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). В частности, его реализуют принудительным увеличением разрешения рендеринга по сравнению с разрешением монитора.
Однако упорядоченная сетка часто неоптимальна, особенно для почти вертикальных и почти горизонтальных линий, в которых как раз наиболее очевидны артефакты алиасинга. На Рисунке 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 на основе сэмплирования.