Данная статья основана на журнале Хорхе Хименеса, Хосе Эчеварриа, Тиаго Соуса и Диего Гутьерреса.

Их демо реализации SMAA можно посмотреть здесь (файл .exe). На моём GTX 960 2GB оно работает вполне нормально.

Старые способы сглаживания (антиалиасинга)


Долгие годы стандартами для реализации сглаживания были методы MSAA (Multisampling Antialiasing) и SSAA (Supersampling Antialiasing). На самом деле, они и по-прежнему обеспечивают наивысшее качество среди всех современных методов сглаживания. Как мы знаем, алиасинг возникает из-за нехватки сэмплов, как на пространственном (ломаные линии), так и на временном уровне (мерцание), обычно рядом с гранями и областями изображения с высоким/низким контрастом. Для борьбы с ним у нас имеются два способа, которые когда-то были единственными решениями: Supersampling и Multisampling. При суперсэмплинге мы увеличиваем изображение, а затем снижаем его дискретизацию до нужного разрешения. Этот принцип отлично работает, потому что распространяется на все аспекты проблемы. При мультисемплинге используется похожее решение. В этом методе каждый сэмпл дублируется на основание определённого коэффициента. При современных больших разрешениях для этого требуются достаточно мощные графические карты. Поэтому нам нужны новые методы сглаживания, как на пространственном, так и на временном уровнях. Все эти методы используют в своей работе один алгоритм — распознавание краёв. Но они выполняют и другие операции.

Современные способы сглаживания


Существует множество современных основанных на фильтрации методов, которые хорошо справляются со своей работой, несмотря на то, что уступают двум перечисленным выше. FXAA, DEAA, GPAA, GBAA, CSAA, EQAA, DLAA… В этой статье мы поговорим о SMAA, и о его предшественнике — MLAA. Эти современные основанные на фильтрации методы имеют собственные проблемы:

  • Большинство алгоритмов распознавания краёв, которые лежат в основе этих методов, учитывают только численные различия между пикселями и игнорируют то, как они отображаются зрителю.
  • Исходная форма объекта не всегда сохраняется, общее скругление углов почти всегда чётко заметно на текстах, резких углах и субпиксельных элементах.
  • Большинство решений рассчитано на обработку только горизонтальных или вертикальных паттернов, и игнорирует диагонали.
  • Реальные субпиксельные элементы и субпиксельное движение обрабатывается неверно. Алиасинг отражений (specular) и затенения (shading) устраняются не полностью.

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

Морфологическое сглаживание (Morphological Antialiasing, MLAA)


MLAA пытается оценить покрытие исходной геометрии. Для точной растеризации сглаженного треугольника необходимо вычислить площадь покрытия каждого пикселя внутри треугольника, чтобы правильным образом смешать его с фоном. MLAA начинает с изображения без сглаживания, а затем обращает процесс вспять, векторизируя силуэты, чтобы вычислить покрываемые ими площади. Поскольку фон после растеризации узнать нельзя, MLAA затем смешивает его с соседом, предполагая, что его значение близко к значению исходного фона. Другими словами, алгоритм распознаёт границы (с помощью информации о цвете или глубине), а затем обнаруживает в них конкретные паттерны. Сглаживание обеспечивается интеллектуальным смешиванием пикселей в границах. MLAA имеет реализации на DirectX 10 и Mono Game (XNA). Он честно реализован в таких играх, как Fable II. Создатели MLAA позже создали SMAA, или Enhanced Subpixel Morphological Antialiasing (усовершенствованное субпиксельное морфологическое сглаживание), которое является основной темой данной статьи.


MLAA в действии

Enhanced Subpixel Morphological Antialiasing (SMAA)



Сравнение SMAA и других методов в Crysis 2

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


Вверху — AA нет; в середине — MLAA; внизу — SMAA

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

Распознавание краёв


Распознавание краёв — важнейший этап, потому что нераспознанные края остаются искажёнными. С другой стороны, слишком большое количество краёв с фильтрацией снижает качество сглаженного изображения. Для распознавания края может использоваться различная информация: цветность, яркость, глубина, нормаль поверхности и их сочетание. SMAA по четырём причинам использует яркость (luma):

  1. Меньше артефактов.
  2. Яркость всегда видима.
  3. Она может справляться с искажениями затенения.
  4. И, наконец, она быстрее, чем цветность (chroma).


Слева и в центре: другие методы распознавания краёв, приводящие к появлению красных пересечений и артефактов; справа: совершенно чёткие края SMAA

Запомните это изображение. Вот как работает распознавание краёв: окончательное вычисленное значение — это булево значение, называемое граница левого края. Аналогичным образом вычисляются булевы значения для верхнего края. Формула:

$c_{max }= max\left(c_l, c_r, c_b, c_i, c_{2l}\right)$


$e_l^\prime =  e_l \wedge c_l > 0.5.c_{max}$


Все значения c называются дельтами контраста.

Обработка паттернов


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

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

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

  1. Поиск диагонального расстояния $d_l$ и $d_r$ слева и справа от диагональных линий.
  2. Получение пересекающихся краёв $e_1$ и $e_2$.
  3. Пользуясь этой входной информацией, мы определяем конкретный диагональный паттерн для доступа к заранее вычисленной текстуре области, получая области $a_t$ и $a_b$.

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

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

$f_x(b_1,b_2,x) = x.b_1(1-x).b$


Где $b_1$ и $b_2$ — это два двоичных значения (0 или 1), а $x$ — значение интерполяции.

Результаты


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


Сравнение MLAA с SMAA и отсутствием AA

Однако SMAA работает на субпиксельном уровне. Это приводит к следующему:

  • Локальный контраст
  • Распознавание диагональных паттернов
  • Резкие геометрические элементы
  • Точный поиск

Всё это можно увидеть на изображении ниже, где эти аспекты сравниваются с результатами других методов. На самом деле, SMAA может создавать результаты, близкие к SSAA 16x.


Излишние затраты, создаваемые каждым из этих решений, незначительны. В частности, адаптация локального контраста занимает всего 0,08 мс, распознавание резких геометрических элементов и точные расстояния занимают 0,01 мс, а обработка диагоналей добавляет лишних 0,12 мс. Проще говоря, SMAA довольно быстр, медленнее, чем SSAA и MSAA, но более плодотворен и менее ресурсоёмок.

Комментарии (10)


  1. shuhray
    16.02.2019 19:16
    +3

    Как раз сейчас это всё грызу, поэтому даю полезные ссылки. Обзор методов сглаживания краёв и рисования полупрозрачных предметов (это трудно совместить)
    www.decom.ufop.br/sibgrapi2012/eproceedings/tutorials/t6-survey_paper.pdf
    Неподвижную картинку сглаживает отлично, но при движении вдоль края бегут «мыши», поэтому нужно ещё временнОе сглаживание (к каждому кадру добавляется чуть-чуть от предыдущего кадра)
    www.dropbox.com/sh/dmye840y307lbpx/AAAQpC0MxMbuOsjm6XmTPgFJa
    Я взялся писать геометрическую программу (интерактивные построения в пространстве) и надолго завис на сглаживании краёв.


  1. AngReload
    16.02.2019 20:53

    Интересная тема, но статье нехватает подробностей.


  1. andreili
    16.02.2019 20:57

    Что-то у меня демка по ссылке не запускается вообще — нагрузка на GPU при активном приложении есть, но на экране пусто.
    Win10 + RTX 2070.


    1. dmshr
      17.02.2019 05:22

      аналогично, Win10+1070.


      1. AngReload
        17.02.2019 19:10

        А у меня вот работает, win 10 и старая AMD


  1. DimPal
    17.02.2019 11:14

    А в чем смысл рядов в предпоследней картинке? Что они значат? Столбцы подписаны, а ряды нет.


    1. beavole
      17.02.2019 12:45
      +1

      Ряды подписаны справа.


      1. DimPal
        17.02.2019 22:24

        Два ряда, оба не подписанные (пред-последняя картинка)


        1. beavole
          18.02.2019 03:58

          Да, прошу прощения — я глюканул. Почему-то был уверен, что вы про последнюю картинку говорили. Наверное, потому, что сам сначала не увидел на ней привычных подписей слева.


    1. AngReload
      18.02.2019 06:50

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


      Далее:
      MLAA — алгоритм постобработки (те. на вход получает только картинки из столбца NoAA) старый для сравнения
      SMAA 1x — тоже только постобработка, но новым улучшенным алгоритмом
      SMAA S2x = MSAA 2x (две выборки на пиксель, но гораздо быстрее чем двойное разрешение рендера) + SMAA 1x
      SMAA 4x = TAA 2x (временное сглаживание, сдвиг сетки выборки для разных кадров) + MSAA 2x + SMAA 1x
      … оставшиеся столбцы — понятно.


      Вообще, была хорошая статья на хабре про сглаживание — https://habr.com/ru/post/343876/