Перейти к содержимому

Anti aliasing это что

  • автор:

Основы 3D графики: Сглаживание

img

Antialiasing (Сглаживание) — это технология, используемая для устранения эффектов «зубчатости» и мерцания, возникающего на границах выводимых на экран отдельных изображений. По сути она похожа на фильтрацию, ибо добавляет промежуточные цвета для создания более плавных переходов между объектами.

img

Aliasing — нежелательный эффект «зубчатости», проявляющийся на краях изображений. Может возникать по различным причинам, таким как: недостаточное разрешение устройства вывода, разница между исходным и проецируемым разрешением объекта/текстуры и т.д.

Temporal aliasing — Нежелательный эффект мерцания, проявляющийся у движущихся объектов, вызванный, как правило, недостаточной скоростью смены кадров (fps) сцены в сравнении со скоростью движущихся на ней объектов.

Выделяют две группы сглаживания:

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

Наиболее известные методы этой группы:

  • FSAA (Full-scene anti-aliasing) — Полноэкранное сглаживание. Данный термин может применяться к любому типу сглаживания, обрабатывающему экранное изображение целиком, но нередко его используют как синоним суперсэмплинга.
  • SSAA — (Supersample anti-aliasing) — один из старейших и при этом наиболее качественный тип сглаживания. Остальные методы были придуманы по причине того, что просчет данного метода является очень ресурсоемким. SSAA оперирует несколькими (2, 4, 8, . ) образцами каждого экранного пикселя. Данная операция является ресурсоемкой из-за необходимости рендеринга изображения огромных размеров (например для обработки изображения для экрана 1920×1080 с 8xSSAA, необходимо проделать такую же работу, как для просчета изображения в разрешении 7680×2160 без сглаживания.
  • MSAA (Multisample anti-aliasing) — более быстрый, но менее качественный вариант. Скорость работы достигается благодаря обработке только одного экземпляра параметров шейдера и текстуры.
  • CSAA (Coverage Sampling anti-aliasing) — дополнение MSAA. Добавляет образцы охвата (Coverage samples). Сетка образца охвата имеет большее разрешение, нежели сетка образцов MSAA и содержит информацию логического типа о том, покрыта ли часть заданного пикселя полигоном.

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

img

  • MLAA (Morphological anti-aliasing) — ищет разрывы/неровности между пикселями изображения, сверяет с предопределенным образцом и смешивает соседние цвета фрагментов.
  • FXAA (Fast Approximate anti-aliasing) — облегченная версия MLAA, дающая ~5% прироста производительности, но обладающая меньшим качеством.
  • TXAA (Temporal Approximate anti-aliasing) технология компании NVIDIA. Использует комбинацию традиционного мультисэмплинга и постобработки. 2xTXAA качественно равна 8xMSAA и при этом потребляет ресурсы в том же размере, что 2xMSAA. 4xTXAA качественно лучше чем 8xMSAA и потребляет ресурсы в том же размере, что 4xMSAA.
  • SMAA (Enhanced Subpixel Morphological anti-aliasing) — открытый проект, совмещающий в себе MLAA и MSAA/SSAA.

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

Читайте другие лекции курса «Основы 3D графики»:

Что такое антиалиасинг: Digital Foundry о технологиях «сглаживания»

Digital Foundry, техническое подразделение Eurogamer, выпустило видео о технологиях «сглаживания» (anti-aliasing). Эксперты рассказали о преимуществах и недостатках различных видов антиалиасинга, а мы выбрали из видео главное.

Что такое антиалиасинг

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

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

Менее требователен к системе метод под названием MSAA (Multisample Anti-aliasing), увеличивающий плотность пикселей выборочно, на границах определённых полигональных объектов. Конечно же, такой метод гораздо менее требователен к производительности, чем SSAA, увеличивающий количество всех пикселей в четыре раза.

Эти методы позволяют решить проблемы со статичным изображением, но к ситуациям, в которых алиасинг возникает в результате движения, нужен другой подход. В качестве примера эксперт Digital Foundry использует соломенную крышу из третьего «Ведьмака» — на статичных скриншотах она выглядит потрясающе, но на видео начинает «рябить». В этом случае проблема возникает внутри текстуры, а не по её краям. MSAA тут делу не поможет, а SSAA будет слишком сильно нагружать систему.

От ряби можно избавиться, просто снизив уровень детализации конкретного объекта — этот метод носит название Mip Map. Снижение количества пикселей в текстуре, находящейся на расстоянии, может не только повысить производительность, но и избавить её от ряби и прочих неприятных визуальных эффектов.

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

Что популярно сейчас

На всё многообразие проявлений алиасинга у разработчиков неизменно находятся эффективные ответы — методы борьбы постоянно совершенствуются. Например, в последнее время MSAA встречается в играх всё реже, а популярность приобретает метод PPAA (Post Process Anti-Aliasing), в частности FXAA и SMAA. Его суть заключается в том, что «сглаживание» производится постфактум — уже после того, как изображение было создано. У этого метода есть и недостатки — например, нестабильность изображения, вызванная разницей между двумя следующими друг за другом кадрами после обработки. К тому же при использовании PPAA часть изображения может стать чересчур «сглаженной», или, наоборот, остаться «острой».

Эти проблемы можно решить, если предоставить алгоритму постобработки больше информации. Существуют методы «сглаживания», способные обрабатывать каждый новый кадр на основе предыдущего. Это позволяет добиться эффекта, не уступающего в «гладкости» требовательному SSAA, задействовав гораздо меньше ресурсов.

Здесь тоже есть свои проблемы — изображение, созданное на основе предыдущих кадров, может «сгладиться» слишком сильно. Сейчас с этим тоже научились бороться: теперь один алгоритм занимается сглаживанием, а другой, сразу же вслед за ним, «заострением».

Однако технология TAA (Temporal Anti-aliasing) обостряет проблему перехода между кадрами, о которой было сказано ранее. С ней разработчики борются при помощи старого доброго «размытия» (blur), столь нелюбимого многими игроками. По мнению эксперта Digital Foundry, от «блюра» нам никуда не деться — по крайней мере, пока мы не сможем позволить себе несколько тысяч кадров в секунду.

В финале видео эксперт составляет краткую памятку для тех, у кого возникают проблемы с выбором метода «сглаживания».

SSAA — отличное качество, но очень требователен.

MSAA — полезен лишь в отдельных случаях, сейчас встречается редко.

TAA — отличное качество, не так требователен, как SSAA, но знаменит «блюром» и проблемами при переходе между кадрами.

PPAA — нормальное качество, не требователен, рекомендуется использовать в сочетании с каким-либо другим методом.

Борьба с графическими несовершенствами: технология Anti-aliasing в играх

Борьба с графическими несовершенствами: технология Anti-aliasing в играх Фото 0

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

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

Сглаживание в играх: история появления технологии

Anti Aliasing (сглаживание) — алгоритм устранения эффекта «зубчатости» (отчетливо видимых пикселей) на экране. Разработку в 1972 году в Массачусетском технологическом институте представила команда Architecture Machine Group, которая позже стала называться Media Lab — лаборатория, занимающаяся изучением и разработкой в сфере технологий, науки, искусства, дизайна, медицины.

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

Борьба с графическими несовершенствами: технология Anti-aliasing в играх Фото 1

Так почему же возникает эффект «зубчатости»?

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

Борьба с графическими несовершенствами: технология Anti-aliasing в играх Фото 2

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

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

При включенном алгоритме сглаживания картинка становится красивой, но появляется ощутимый минус — дополнительная нагрузка на производительность. За счет новой задачи процессор и видеокарта начинают рендерить дополнительные оттенки, расходовать ресурсы мощности.

Один из способов исправить подобные проблемы — уменьшить пиксели. Изображение, состоящее из 30 квадратов, выглядит более блочным, чем состоящее из 3000 квадратов. Другими словами, высокое разрешение может помочь в решении вопроса.

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

  • Общее сглаживание в играх — алгоритм отрисовывает большое изображение, потом сжимает его.
  • Специализированные алгоритмы anti-aliasing в играх работают с изображениями отдельных типов, вычленяя их из общей картинки (короткие отрезки, большие или маленькие элементы, статичные объекты или картинка в динамике и т.д.).

Методы сглаживания начали активно развиваться в начале 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:

  • SSAA — получаем картинку отличного качества, но ощутимо нагружаем видеокарту.
  • MSAA — применяется редко, подходит для игр с крупными объектами в графике.
  • FXAA — края объектов действительно сглаживаются, но настолько, что все изображение размывается.
  • MLAA — алгоритм нагружает процессор, не влияя на комфорт в игре, но картинка «замыленная».
  • SMAA — производительность игры сильно падает, картинка нечеткая.
  • TXAA — отличный вариант для игр, где большинство кадров статичны.
  • DSR — технология используется редко, большая нагрузка на видеокарту.
  • CSAA/CFAA — получаем картинку отличного качества, в том числе для мелких объектов.

Какой тип antialiasing выбрать, если в игре есть несколько вариантов? Все зависит от вашего «железа».

Примитивное игровое оборудование , для которого стоит использовать SMAA, CSAA :

  • маломощный процессор и видеокарта
  • оперативная память 8GB RAM и меньше
  • склонность к перегреву и неконтролируемому отключению

Среднее по мощности игровое оборудование , для которого стоит использовать SMAA, MLAA, FXAA, MSAA :

  • мощный процессор и видеокарта
  • оперативная память 8GB RAM и более
  • эффективные элементы вентиляции

Вам придется немного поэкспериментировать, ведь ваш компьютер «не очень хорош для игр, но и не ужасен». Вы определенно сможете запустить SMAA, и, возможно, MLAA или FXAA. Будет ли работать MSAA на приличной скорости — вопрос открытый.

Мощное игровое оборудование , для которого стоит использовать SSAA, TXAA, MSAA:

  • игровые процессор и видеокарта
  • оперативная память 8GB RAM и более
  • геймерские кулеры с жидкостным охлаждением

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

Почему методы сглаживания важны для игр?

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

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

Стоит ли отключать Anti-Aliasing?

В многопользовательских играх важна точность до пикселя. А значит — качественная картинка даст вам преимущество над соперниками.

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

Если вы используете разрешение 4K на 27-дюймовом экране, то сглаживание вам, вероятно, не понадобится. Изображение такого качества будет выглядеть идеально без антиалиасинга .

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

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

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

Знание различных алгоритмов также может помочь вам, если вы когда-нибудь решите создать свою собственную игру.

Подписывайтесь на страницы VOKI Games в социальных сетях, будьте в курсе свежих новостей компании ��

Как работает рендеринг 3D-игр: сглаживание с помощью SSAA, MSAA, FXAA, TAA и других методик

image

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

Часть 1: обработка вершин

Кто виноват

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

Так как пикселизированная версия линии больше не является истинной линией, её перемещение или размещение рядом с другими фигурами создаёт множество визуальных артефактов, которые мы и называем «искажениями» (aliasing).

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

Разрешения 10 x 7 пикселей не совсем хватает для отображения этого треугольника без искажений

Некоторые сигналы меняются не в пространстве, а во времени, и здесь мы тоже получаем искажения при сэмплировании с заданными интервалами. Например, для преобразования аналоговой аудиодорожки в цифровую требуется измерять уровень звука через определённые доли секунды (допустим, в случае CD audio это каждые 0,02 миллисекунды).

Различия между сигналом, созданным из сэмпла, и оригинальным сигналом создают временные искажения, с которыми обычно справляются благодаря повышению частоты сэмплирования. Но что если сигнал на самом деле является последовательностью движений? Когда мы следим за реальным миром, окружающие нас предметы движутся без дискретности, поэтому когда это движение преобразуется в поток «снимков», получаются искажения.

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

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

Зачем? Потому, что если бы и то, и другое было чрезвычайно велико, то искажение не представляло бы проблемы. Если взять старый бенчмарк, например 3DMark03, и запустить его на современной системе, то мы сможем сфокусироваться исключительно на пространственных искажениях.

Показанное выше изображение, взятое из первого теста Wings of Fury, сделано с разрешением 1280 x 720 пикселей. Четырнадцать лет назад, когда лучшими графическими картами были ATI Radeon 9800 XT и Nvidia GeForce FX 5900 Ultra, самые большие мониторы имели разрешение примерно 1600 x 1200, поэтому разрешение теста можно считать примерно низким или средним разрешением (сродни современному 1080p).

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

В этом следует винить относительно низкую степень сэмплирования, поэтому логичнее всего будет её увеличить; давайте теперь рассмотрим ту же сцену в 4K (3840 x 2160 пикселей).

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

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

В случае такой старой программы, как 3DMark03, на современном PC переход от 1280 x 768 к 3840 x 2160 снизил среднюю частоту кадров с 1670 до 1274 FPS, то есть увеличение количества пикселей на 740% снизило производительность всего на 24%. Однако в более новых программах ситуация будет иной.

Это легко продемонстрировать, запустив современный 3DMark при различных разрешениях; на графике ниже показана средняя частота кадров первого теста графики в бенчмарке Time Spy.

Переход с 720p на 4K — это повышение разрешения на 800%, но частота кадров упала на 81%. Хотя игры могут и не демонстрировать этот паттерн в точности, но современные AAA-игры не очень от него отличаются. Это говорит нам, что если мы хотим максимально снизить влияние искажений, нам нужен способ получше, чем повышение разрешения растра — чем ниже частота кадров, тем хуже становятся временные искажения.

К сожалению, первый алгоритм, разработанный для устранения пространственного искажения, делал именно это, но прежде чем мы приступим к его рассмотрению, надо указать на его особенности, о которых мы поговорим в этой статье. Техники устранения искажений многие годы разрабатывались независимыми научными исследователями, а также разработчиками систем в компаниях наподобие ATi, Intel и Nvidia.

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

Supersampling anti-aliasing (SSAA)

Этот способ, часто называемый также full scene anti-aliasing — самый старый и простой из всех. Он заключается в рендеринге сцены с повышенным разрешением, с последующим сэмплированием и смешением результата в меньшее количество пикселей. Например, монитор может иметь максимальное разрешение 1920 x 1080, но игра рендерится с разрешением 3840 x 2160, а затем картинка масштабируется и передаётся на экран.

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

Разумеется, мощности современных GPU позволяют использовать более сложные алгоритмы сэмплирования и смешения. Но давайте вкратце рассмотрим, как это работает. На изображении ниже показано действие классического 4x SSAA. «4x» означает, что вычислением арифметического среднего смешивается вместе 4 сэмпла (также называемых taps) для получения окончательного цвета. Для этого растровое разрешение увеличивается по каждой из осей в два раза.

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

Описанный выше паттерн и способ смешения называется box filter, однако существует его популярное улучшение с использованием повёрнутой сетки позиций сэмплов (RGSS). Проблема SSAA заключается в том, что все эти дополнительные пиксели необходимо обрабатывать, и как мы видели из тестов 3DMark, повышение разрешения растра запросто может сильно снизить частоту кадров.

По большей части суперсэмплирование можно заменить более эффективными алгоритмами, однако оно обрело новую жизнь в качестве параметра драйверов графических карт AMD и Nvidia. AMD называет свою технологию Virtual Super Resolution (VSR), а Nvidia — Dynamic Super Resolution (DSR).

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

Multisample anti-aliasing (MSAA)

Этот способ возник как результат работы исследовательских лабораторий Silicon Graphics в начале 90-х. По сути, это SSAA, но применённая только там, где это на самом деле нужно. Ну, на самом деле, внутри технологии есть не только это, но такое объяснение поможет вам понять, как работает алгоритм.

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

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

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

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

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

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

Затем, как и в случае с SSAA, мы сэмплируем и смешиваем детализированный буфер, приводя его к требуемому разрешению, и всё! Мы получили кадр без искажений. С точки зрения производительности, мы выполняли пиксельные шейдеры только для относительно малого количества точек, но для этого нам понадобилось создать и хранить пару буферов высокого разрешения.

Поэтому для multisample anti-aliasing требуется много видеопамяти и широкий канал передачи данных (плюс возможность быстрого считывания/записи в z-буферы), зато эта методика не требует большой вычислительной нагрузки на шейдеры. Давайте воспользуемся старым примером кода AMD, чтобы посмотреть, как она выглядит и чем отличается от SSAA.

Код запускает сцену с простыми текстурами и освещением, но со множеством геометрии, поэтому искажения на её рёбрах бросаются в глаза намного сильнее. В верхнем левом углу есть любопытная информация — для рендеринга каждого кадра в среднем требуется 0,18 миллисекунд, а для смешивания в окончательный результат — всего 0,02 мс. Буфер цвета (тот, который мы видим) занимает 7,4 МБ, как и буфер глубин.

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

Обратите внимание, что в представленном выше изображении время рендеринга увеличилось до 0,4 мс (рост на 122%), а время смешивания (под названием «Resolve») удвоилось. Кроме того, размер буферов цвета и глубин увеличился в четыре раза. Такова цена использования SSAA, и хотя любой современный GPU с лёгкостью справится с этой сценой, в новых 3D-играх ситуация окажется ужасной.

Однако посмотрите на увеличенную часть изображения. Заметили, насколько более гладкими стали линии? Да, в изображении ещё довольно много искажений, но оно заметно лучше. Вот если бы эта техника была не такой затратной! Ну, несколькими нажатиями мы можем переключиться на MSAA, и посмотреть, что изменится.

Показатели времени рендеринга сцены почти вернулись к тем, когда не применялось сглаживание, что хорошо, однако ещё больше стало время смешивания. Общий занятый объём памяти тоже находится примерно посередине между отсутствием AA и 4xSSAA, поэтому, похоже, что MSAA определённо стоит использовать.

Даже искажения на рёбрах примитивов кажутся меньшими, однако это больше связано с использованным паттерном сэмплирования, а не с самим принципом работы MSAA. На самом деле, если посмотреть на текстуру стены в увеличенной области, становится очевидным один недостаток multisample AA.

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

Что же делать, если методики supersampling и multisampling anti-aliasing неидеальны?

Fast approximate anti-aliasing (FXAA)

В 2009 году Nvidia представила другой способ улучшения изломанных краёв фигур в 3D-сцене. SSAA пользуется исключительно «грубой силой», MSAA — аппаратными функциями и трюками в коде. FXAA спроектирована так, чтобы выполняться исключительно через шейдеры. После появления этой методики её несколько раз совершенствовали и сегодня она активно применяется в играх.

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

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

Последовательность выполнения FXAA: нахождение пикселей на рёбрах, определение ориентации, их сдвиг, размытие готового изображения.

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

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

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

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

Без AA (слева) и FXAA (справа) — обратите внимание, что деревья и элероны крыла выглядят намного плавнее

А какие недостатки есть у этой методики? Если в кадре есть множество областей с высокой контрастностью, например, с яркими пикселями на тёмной фоне, они смешиваются, вне зависимости от необходимости.

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

Существуют и другие полноэкранные алгоритмы поиска рёбер. Источником вдохновения для разработчиков FXAA стало созданная Intel Morphological anti-aliasing (MLAA); эта методика была усовершенствована разработчиком игр Crytek и испанским Университетом Сарагосы, которые дали ей название Enhanced Sub-pixel MLAA (сокращённо SMAA).

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

Temporal anti-aliasing (TAA)

Пока мы рассматривали только методики для устранения визуального влияния пространственных искажений. Для борьбы с временными искажениями (temporal aliasing), возникающими из-за того, что 3D-игры генерируют дискретные сэмплы непрерывного движения, чаще всего используется следующий алгоритм.

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

Общая схема временного сглаживания.

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

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

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

Самый популярный алгоритм TAA.

Временное сглаживание (Temporal AA) может создавать избыточное размытие, а также проблему под названием ghosting, при которой края движущихся объектов выглядят размазанными, а не смягчёнными.

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

Кроме использования значений скоростей, большинство реализаций алгоритма TAA выполняют ещё один процесс проверки сэмплов истории; это не позволяет использовать значения из предыдущих кадров, не относящиеся к текущему кадру (например, они могут оказаться скрытыми за сдвинувшимся объектом). В этой методике обычно используется ограничивающий параллелепипед, выровненный по координатным осям (axis-aligned bounding box, AABB), в котором по осям отложена хроматичность буфера истории; она отсекает все пиксели, имеющие цвет за пределами этих границ.

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

Без AA (слева) и TAA (справа) — обратите внимание на размытие деталей на крыле

Для разработчиков кодировать всё это значительно сложнее, чем добавить в игру SSAA или MSAA. Но современные GPU способны быстро вычислять все необходимые шейдеры; в то время как алгоритмы supersampling и multisampling для каждого кадра требуют множества сэмплов, TAA, по сути, распределяет эти сэмплы на несколько кадров. Это означает, что в играх, не сильно ограниченных объёмом вычисляемых шейдеров, TAA можно реализовать ценой относительно малого снижения производительности.

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

И это ещё не всё!

Четыре описанные выше методики, особенно FXAA и TAA, активно используются в играх для PC и консолей. Но есть и множество других алгоритмов.

Например, когда Nvidia выпустила серию графических карт GeForce 9, то объявила и о создании модифицированной версии MSAA под названием Multi-Frame Sampled Anti-aliasing (MFAA). По сути, GPU изменяет паттерн сэмплирования с каждым последующим кадром, то есть на кадр приходится меньшее количество создаваемых и смешиваемых сэмплов.

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

Позже этот разработчик GPU вложил значительные ресурсы в разработку алгоритма сглаживания с использованием искусственного интеллекта под названием Deep Learning Super Sampling (DLSS), впервые появившегося в 2018 году вместе с выпуском чипов Turing.

В первой версии DLSS компания Nvidia должна была обучать нейросеть глубокого обучения (DNN) на конкретных играх сравнением кадров низкого разрешения с кадрами в высоком разрешении со включенным SSAA. Современная версия использует более обобщённую сеть и получает дополнительную информацию в виде векторов движения для определения того, как должен выглядеть кадр, как если бы он рендерился с более высоким разрешением.

Хотя основное преимущество DLSS заключается в повышении производительности (например, рендеринг выполняется при 1080p, но нейросеть повышает разрешение до 1440p), система, по сути, применяет AA, потому что её целевыми данными является изображение.

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

Исследования более совершенных техник сглаживания продолжаются, но мы и так уже проделали длинный путь со времён Riva TNT и Half-Life, когда нам приходилось мириться с зазубренными полигонами, потому что на их устранение не хватало производительности.

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

  • Работа с 3D-графикой
  • Разработка игр

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *