Pull to refresh

FXAA — новый алгоритм сглаживания от NVIDIA

Reading time6 min
Views156K
Здравствуйте.

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

Подавляющее большинство игроков знают о «лесенках» на краях объектов и возможном решении этой проблемы — «anti-aliasing», или «сглаживание». Очень подробно этот вопрос описан в статье Дона Волигроски (Don Woligroski) Anti-Aliasing Analysis, Part 1: Settings And Surprises (русский перевод). Также неплохое сравнение с примерами игр текущего поколения игровых консолей есть у Digital Foundry — The Anti-Aliasing Effect (англ.). Вкратце, всё сводится к одному: сглаживание — это здорово, восприятие картинки сильно вырастает в цене, в современных реалиях игропрома продукты с малым сглаживанием или даже без оного находятся в категории освистанных (в первую очередь — фанатами платформ-конкурентов, но тем не менее), но вот реализация качественного сглаживания оставляет желать лучшего, главным образом — из-за недостаточной вычислительной мощности целевого оборудования. В данном случае в гораздо более выгодных условиях оказываются, конечно же, апологеты игры на ПК, т.к. на мощность их железа оказывает влияние только материальный фактор, зато консольщики не упускают случая позубоскалить над ПКшниками на предмет «PC HAZ NO GAEMZ!», мол, игр у вас нет, играете в графику. Я специально не буду затрагивать этот вопрос, потому что рационально-объективных доводов в пользу субъективного ощущения «тёплого лампового гейминга» быть не может в принципе, это вопрос личного выбора со всеми вытекающими. Уже существующие и использующиеся алгоритмы описаны по вышеуказанным ссылкам, поэтому перейду непосредственно к теме: что такое FXAA, с чем его едят и насколько это вкусно.

Начнём с теории. Если быть предельно точным, то FXAA — не такой уж новый алгоритм: впервые он был использован в MMORPG Age of Conan и уже отметился в шутере F.3.A.R., но я буду рассматривать его, как новый, благодаря интересному решению, которое попалось мне на глаза на часто посещаемом форуме (спасибо h0w1er). FXAAFast approXimate Anti-Aliasing, это более производительное решение по-сравнению с традиционным MSAA (Multi-Sampling Anti-Aliasing). Это однопроходный пиксельный шейдер, который обсчитывает результирующий кадр на этапе постобработки. Он создан быть более быстрым и менее требовательным к памяти по-сравнению с MSAA, «оплачивая» свои «плюсы» точностью работы и качеством, хотя на самом деле всё не так страшно, как это звучит. FXAA также имеет ряд преимуществ, включая улучшенное сглаживания спекуляров и субпикселей (речь о поверхностях размером меньше одного пикселя, «лесенки» заставляют такие объекты мерцать). В официальном документе (PDF) создатель FXAA Тимоти Лоттс (Timothy Lottes) заявляет, что для алгоритма FXAA с настройками среднего качества («золотая середина» между качеством и производительностью) постобработка кадра разрешением 1920x1200 на GTX 480 занимает меньше миллисекунды. Основные преимущества FXAA, со слов Тимоти, заключаются в алгоритме сглаживания субпикселей FXAA, работающем лучше оного в MLAA, достаточность для работы железа уровня DX9, постообработке кадра за один проход и, по-моему, самое интересное — независимость от используемого GPU Compute API. Но есть и одна неприятность — необходимость для разработчиков встраивать эту технологию сглаживания в свои игры, когда как традиционные методы сглаживания работают (или не работают) на уровне драйверов. Другими словами, пока программисты не используют в своих движках код FXAA для сглаживания, нужного эффекта мы не получим, влючить FXAA извне официально было нельзя. До недавних пор.

31 июля в ветке Alles rund um FXAA (Treibereinstellungen, Shader-replacements) форума 3DCenter Forum, появился «some dude», который произвёл инъекцию кода FXAA в библиотеку d3d.dll и дал возможность гибко настраивать результат через конфигурационные файлы, а также включать и выключать FXAA по кнопке Insert и делать скриншоты нажатием Delete [Pause], а [Print Screen] делает скриншот начиная с версии beta 9. Этот набор файлов копируется в директорию с исполняемым файлом DX9-приложения (игры, демки — не важно), а это приложение при запуске «подхватывает» библиотеку с нужной инъекцией. И пошло-поехало: так как Gast (автор инъекции) изначально озаботился сохранением результатов работы в лог, народ стал ему присылать баги, которые Gast, в свою очередь, начал править. Позже в его наборе появилась инъекция для DX10 (dxgi.dll), сейчас рассматривается вариант добавить FXAA в DX11, но у автора нет DX11 железа, поэтому вопрос немного подвис в воздухе, а с версии beta 10 — и DX11 (но не забывайте, что это всё-таки бета инъекции).
UPDATE 19.08.2011
<Здесь раньше была куча ссылок, которые потеряли актуальность>
На 19 августа 2011г актуальная версия — beta 10, зеркала: rapidshare.com, letitbit.net, depositfiles.com, rghost.net. К сожалению (или к счастью, кому как) набор фильтров от pedace с виньетированием, сепией и т.п. для beta 10 пока не объявлен, но наткнулся на пользовательские фильтры к этой версии, зеркала: [1], [2], [3], [4], [5].

А теперь — танцы практика. Практиковаться будет на World of Tank, версия 0.6.6.

WoT no WoT EdgeAA

WoT FXAA WoT FXAA Sharpen

Вариант без сглаживания (No AA) показывает явные «эскалаторы», и хоть модели танков достаточно большие и детализированные, артефакты видно совершенно явно, особенно на тонких объектах, о которых дополнительно ниже.

Вариант встроенного сглаживания (Edge AA) пытается смазывать края объектов, но у него это получается довольно посредственно, не говоря уже об уходе картинки в небольшое мыло.

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

Ну и вариант FXAA Sharpen. Gast в версии beta 6 добавил фильтр резкости, взятый из MPC-HC, и результат очень достойный: мыло исчезло, текстуры стали выглядеть даже резче, чем в оригинале, а «лесенок», несмотря на этот фильтр, практически не добавилось. Из-за незапланированной авторами резкости текстуры башни чуть-чуть «выбило» (синяя зона), но в игре, могу вас уверить, это абсолютно незаметно.

А что же с производительностью? Да практически ничего плохого. К сожалению, движок WoT живёт в своём мире и всплески/падения производительности могут выскакивать на самом ровном месте. У меня получилось следующее:

WoT inbattle noAA WoT inbattle FXAA Sharpen

Картинка «In battle no AA» — то, о чём я говорил выше: тонкие деревца трещат от артефактов, тогда как на вариант «In battle FXAA Sharpen» картинки гораздо приятнее глазу, за исключением проблем фильтра резкости, который уж слишком тонкие линии сужает в толщину волоса, как, например, навесной прицел артиллерии. А количество кадров в секунду в варианте FXAA даже выше, несмотря на то, что эти два скриншота сделаны с разницей в 1 секунду и танк был неподвижен.

На самом деле при длительном тесте была получена цифра ~10-12% — на столько падает производительность при использовании FXAA, тогда как MSAA 4x, с качеством сглаживания которого и конкурирует FXAA, в довольно часто даёт падение вдвое больше. Если будет интересны сравнения — больше цифр и картинок можно найти в статье NVIDIA's New FXAA Antialiasing Technology сайта [H]ard|OCP, где я почерпнул часть информации, а в завершении своего небольшого обзора соглашусь с Марком Уорнером @ HardOCP: при должной реализации у FXAA большое будущее, особенно на консолях, где ресурсы жёстко ограничены, а имея возможность настроить конфигурацию инъекции по своему вкусу, многие уже сейчас без помощи разработчиков, смогут насладиться красивой картинкой в любимой игре.

UPD. На 10 августа уже появилась более настраиваемая инъекция, так сказать, «сборная солянка» от участников обсуждения: INJ_FXAA_DX9_pedace_v1.rar, зеркала: rapidshare.com, letitbit.net, depositfiles.com, rghost.net, hotfile.com. В сборку включены разные фильтры: насыщение цветом, виньетирование, размытие, сепия и другие. Всё это настраивается через единый файл настроек и самое полезное — настройки меняются «на лету»: Alt+Tab из приложения для редактирования настроек, Alt+Tab обратно — новые настройки работают, перезапуск не требуется. С этим вариантом инъекции я избавился от блеклости при включении фильтра резкости, в настройках полностью отключил USE_TECHNICOLOR, USE_TONEMAP и USE_VIGNETTE. Результат выглядит так:

WoT pedace noAA WoT pedace FXAA

Налицо более чёткая картинка без «лесенок» и мыла, даже текстуры выглядят веселее.

UPDATE #2



Добавил BMP PNG из Fraps'а. Где-то мой косяк, согласен: предполагал, что получить скриншот с результатами FXAA непосредственно из игры нельзя, как это нельзя сделать в случае с MLAA, но, как выяснилось, можно, т.к. это не постобработка фреймов драйвером после вывода на экран, а прямая картинка через инъекцию.
Tags:
Hubs:
Total votes 8: ↑8 and ↓0+8
Comments8

Articles