Как известно, растровые мониторы представляют собой прямоугольную сетку, состоящую из большого числа точек, которые называются пикселями. Поскольку каждая такая точка имеет фиксированный размер, то любое непрерывное изображение, отображаемое на экране такого типа, станет дискретным. Все элементы этого изображения будут аппроксимироваться в виде последовательности отдельных пикселей. В результате теряется качество и четкость передачи изображения, что приводит к возникновению такого явления, как алиасинг.
Алиасинг сопровождается различными артефактами [1, 2], такими как ступенчатость отображения отдельных полигонов (лестничный эффект), разрушение текстур, потеря мелких деталей, возникновение мерцания и пр. Вышеперечисленные эффекты оказывают негативное влияние на изображение [3]. В связи с этим были созданы различные алгоритмы, которые позволяли уменьшать степень проявления эффектов алиасинга. Одним из наиболее частых применений таких алгоритмов служит индустрия компьютерных игр, в которой эффекты алиасинга проявляются очень часто. Данная область компьютерной графики является одной из самых распространенных и востребованных в настоящее время. Производители видеокарт стараются во многом доработать и усовершенствовать алгоритмы антиалиасинга. В дальнейшем они используют эти алгоритмы при разработке программного обеспечения и драйверов для своих видеокарт, чтобы обеспечить наибольшую эффективность и качество продуктов.
Данная статья посвящена рассмотрению общих идей алгоритмов временного антиалиасинга, а также одной из их модификаций. Речь идет об алгоритме, который носит название TXAA (temporal anti-aliasing developed by NVIDIA). Этот алгоритм сглаживания приобретает все более широкое распространение как среди пользователей, использующих его в качестве дополнительной настройки в играх, так и среди разработчиков, которые пользуются данным инструментом в составе NVIDIA GameWorks [4].
NVIDIA GameWorks – это программный пакет, разработанный NVIDIA, предназначенный для упрощения создания различных эффектов в компьютерных играх [5]. Данный инструмент не является полноценным игровым движком. Он предоставляет набор надстроек, которые можно использовать в сочетании с игровыми движками, такими как Unity, Unreal Engine и другие. GameWorks распространяется в виде скомпилированных библиотек DLL вместо традиционного исходного кода. NVIDIA GameWorks состоит из нескольких основных компонентов:
1. VisualFX: для рендеринга эффектов, таких как дым, огонь, вода, глубина резкости, мягкие тени, HBAO +, TXAA, FaceWorks и HairWorks.
2. PhysX: для физики, разрушений, моделирования частиц и жидкости.
3. OptiX: для освещения и трассировки лучей общего назначения.
4. Core SDK: для облегчения разработки на оборудовании NVIDIA [4, 5].
Кроме того, набор содержит пример кода для разработчиков DirectX и OpenGL, а также инструменты для отладки, оптимизации и разработки для Android. GameWorks, а вместе с ним и TXAA занимают важное место в разработке компьютерных игр.
Чтобы понять основные принципы и идеи алгоритма TXAA, необходимо рассмотреть предшествующие алгоритмы антиалиасинга.
Одним из первых таких алгоритмов был алгоритм Supersample Anti-Aliasing (SSAA). Его главная идея заключается в том, что изображение рендерится в более высоком разрешении, в несколько раз превышающем разрешение исходного изображения [6]. Таким образом, каждому пикселю исходного изображения соответствуют несколько пикселей отрендеренного. Эти пиксели часто называют субпикселями. Далее происходит выборка соответствующих субпикселей для получения среднего цвета. Затем разрешение изображения уменьшается до предполагаемого. В таком изображении каждый пиксель обладает усредненным цветом, что создает более плавные переходы, уменьшая ступенчатость. Главным недостатком данного алгоритма являются большие требования к пропускной способности видеошины, а также большой объем видеопамяти для хранения промежуточного изображения.
Развитием идеи суперсэмплинга является мультисэмплинг и алгоритм Multisample Anti-Aliasing (MSAA). Изображение по-прежнему рендерится в более высоком разрешении (обычно x4 и x8 соответственно для MSAA x4 и MSAA x8). Отличие MSAA от SSAA заключается в том, что субпиксели не рассчитываются отдельно для каждого пикселя. Вместо этого рассчитанные ранее субпиксели используются несколько раз для формирования не одного, а нескольких результирующих пикселей [7]. MSAA позволяет не только сэкономить ресурсы, но и получить лучшее качество сглаживания. Однако требования к производительности видеокарты у данного алгоритма по-прежнему сравнительно высокие.
Для аппроксимации суперсэмплинга и мультисэмплинга были разработаны алгоритмы временного антиалиасинга (temporal anti-aliasing, TAA). Главным отличием алгоритмов TAA от SSAA и MSAA является способ анализа пикселей. В то время как супер- и мультисэмплинг анализируют пиксели пространственно, TAA анализирует кадры во времени, даже когда камера статична.
Идея временного антиалиасинга основана на простом наблюдении – от кадра к кадру большая часть содержимого экрана не меняется. Даже при сложных анимациях заметно, что несколько фрагментов просто меняют свое положение, но при этом они обычно соответствуют некоторым другим фрагментам в предыдущих и будущих кадрах. Исходя из этого текущий кадр проецируется на предыдущий кадр, и образцы смешиваются в буфер накопления. После чего происходит выборка нужного цвета пикселя.
Любой алгоритм временного антиалиасинга базируется на вычислении так называемой временной функции интенсивности. Одна из идей ее вычисления основывается на задании положения каждого объекта на сцене в виде непрерывной функции и затем использовании данной функции для нахождения пикселей, которые покрываются этим объектом. Формально алгоритм вычисления временной функции описывается следующим образом:
Для каждого кадра изображения:
Для каждого объекта в кадре:
1. Вычислить функцию временного преобразования для каждого динамического атрибута.
2. Определить области, которые объект охватывает в течение интервала фильтрации.
Для каждого пикселя:
1. Определить, какие объекты покрывают пиксель в некоторый момент времени в выбранном интервале.
2. Определить промежуточные интервалы времени, в течение которых каждый объект проецируется на этот пиксель.
3. Выполнить скрытое удаление поверхностей путем удаления подынтервалов экранированных объектов.
4. Определить функцию интенсивности пикселя на основе оставшихся подынтервалов и функции временного преобразования объекта.
Отфильтровать результирующую функцию интенсивности пикселя [8].
Под функцией временного преобразования в данном случае понимается функция, отображающая изменение динамического атрибута (например, положение объекта, перемещающегося во время кадра). В тех случаях, когда атрибуты объекта явно не определены, либо слишком сложны для эффективного анализа, может использоваться интерполяция между выбранными значениями.
Алгоритм TXAA, созданный компанией NVIDIA, является развитием идеи временного антиалиасинга. Данная технология базируется на основе алгоритма MXAA (Multisample Anti-Aliasing developed by NVIDIA), но в дополнение использует современные высококачественные фильтры разрешений и временные фильтры в сочетании возможностей аппаратного сглаживания видеокарт последних поколений, а также специальной компьютерной графики.
Алгоритм TXAA использует временной суперсэмплинг, ключевая идея которого состоит в том, чтобы затенять геометрию в разных местах выборки в пределах пикселя каждого кадра, а затем усреднить значения цвета за последние несколько кадров. Затенение в разных местах выборки достигается за счет «дрожания» матрицы проекции (таким образом достигается эффективное изменение местоположения выборки для всех пикселей) [9].
При усреднении цвета используется экспоненциальное среднее значение вместо простого среднего, что требует значение цвета только последнего кадра вместо нескольких кадров. Цвет последнего кадра включает вклад от предыдущих кадров и т.д. В алгоритме TXAA версии 3.0 RC1 добавлена возможность использовать фильтр Блэкмана – Харриса вместо обычного box-фильтра, прежде чем результаты будут экспоненциально смешаны с результатами предыдущего кадра [9], что в ряде случаев улучшает качество изображения.
В случае, когда объекты находятся в движении относительно камеры, история пикселя определяется его положением в предыдущем кадре. В этом случае используется вектор движения на каждом пикселе для определения места нахождения текущего пикселя в предыдущем кадре. Приложения должны генерировать вектор движения в каждом месте выборки. Если цвет соответствующего пикселя в предыдущем кадре сильно отличается от текущего цвета, используется прямоугольник, ограничивающий области его окрестности и отсечения предыдущего цвета относительно этого ограничивающего прямоугольника [9]. Данное решение позволяет значительно снизить требования к аппаратным ресурсам, не нанося при этом ущерба качеству.
В алгоритме TXAA версии 3.0 RC1 был представлен новый способ вычисления ограничивающей рамки, который был разработан компанией NVIDIA. Он основывается на использовании статистических показателей. Этот способ позволяет создавать более жесткие ограничивающие прямоугольники, что приводит к меньшему количеству ореолов, но может потенциально вызвать мерцание, когда камера не движется. Для решения данной проблемы были применены специальные фильтры, позволяющие снизить степень мерцания, а также дополнительные регуляторы.
Для фильтрации пикселей алгоритм TXAA использует выборку сэмплов как внутри, так и снаружи пикселя, в соединении с выборками из предыдущих кадров, чтобы обеспечить по возможности самое высокое качество фильтрации [10].
Алгоритм TXAA стремится обеспечить наиболее хорошее качество изображения, при этом жертвуя небольшим ухудшением производительности. Данный факт коренным образом отличает его от таких алгоритмов сглаживания, как FXAA (Fast Approximate Anti-Aliasing), который среди современных алгоритмов антиалиасинга обеспечивает наиболее высокую производительность, снижая при этом качество картинки.
Все же алгоритм TXAA имеет один недостаток по сравнению с MSAA (MXAA). Многие пользователи отмечали, что при использовании данного вида сглаживания в играх изображение приобретало эффект «замыливания» (blur). На разных мониторах степень «замыливания» проявляется по-разному, тем не менее этот артефакт является побочным эффектом для алгоритма TXAA.
Ключом эффективного использования TXAA является совместимость фильтра разрешения с отложенным затенением и HDR-освещением, для того чтобы данная технология смогла обработать каждый полигон сцены, а не только определенное подмножество, как это бывает с мультисэмплированием. Поскольку данная возможность будет обеспечиваться на уровне ПО, то производительность алгоритма TXAA определяется производительностью пиксельных шейдеров, а не пропускной способностью видеошины.
TXAA имеет два базовых уровня качества: один основан на 2x MSAA, а другой на основе 4x MSAA. Вариант TXAA x2 обеспечивает качество, сравнимое с MSAA x8 при производительности MSAA x2. Модификация TXAA x4 обеспечивает качество, превосходящее MSAA x8, но при производительности MSAA x4 [10].
Ресурсоемкость алгоритма ТXAA наглядно отражают эксперименты по оцениванию производительности алгоритмов антиалиасинга на различных видеокартах. Первый эксперимент проводился с целью сравнения производительности алгоритмов TXAA с алгоритмами FXAA, MXAA и без использования антиалиасинга на видеокартах последних поколений. Для исследования был использован компьютер со следующими характеристиками:
1. Игровая видеокарта NVIDIA GeForce GTX TITAN X SLI последнего поколения.
2. Процессор Intel Core i7 4-го поколения с частотой 3.9ГГц.
3. Монитор с разрешением 2880x1620.
4. ОС Windows 8.1 x64.
Эксперимент проводился на максимальных настройках игры Grand Theft Auto V (GTA V). Результаты данного исследования показаны на рис. 1.
Рис. 1. Производительность алгоритмов сглаживания на современных видеокартах
Рис. 2. Производительность алгоритма TXAA на видеокартах предыдущих поколений
Данная диаграмма позволяет сделать вывод, что производительность алгоритма TXAA x4 действительно сравнима с производительностью MSAA x4. При этом производительность алгоритма TXAA x4 так же, как и TXAA x2, не сильно уступает даже производительности FXAA.
Второй эксперимент проводился для исследования работы алгоритмов на видеокартах NVIDIA серии GeForce 6-го поколения c DirectX 11, которые являются сравнительно устаревшими. Для исследования использовалась игра The Secret World с максимальными настройками и разрешением экрана 1920x1080. Полученные результаты можно отразить на рис. 2.
Исходя из данных этого эксперимента, можно сделать вывод, что даже на видеокартах предыдущих поколений алгоритм TXAA по-прежнему обеспечивает высокую производительность, сопоставимую с производительностью FXAA.
В заключение стоит отметить, что технология TXAA поддерживается видеокартами NVIDIA с архитектурой Kepler и Pascal. К числу данных видеокарт относятся, в частности, все версии GeForce, начиная с 6-го поколения, а также GTX TITAN. Серия GeForce является одной из самых популярных в мире, поэтому большинству пользователей скорее всего будет доступна данная технология. Тем не менее данный алгоритм не поддерживается видеокартами производства AMD, что существенно снижает распространенность TXAA. Одной из возможностей развития для TXAA станет поддержка для видеокарт NVIDIA QUADRO архитектуры Fermi. Другим направлением развития может стать устранение или значительное снижение проявления эффекта «замыливания» у данного алгоритма. Несмотря на это на данный момент технология является весьма перспективной. Она особенно подойдет тем пользователям, которые готовы пожертвовать некоторым снижением производительности ради достижения отличного качества графики. Если компания NVIDIA продолжит развивать алгоритм TXAA, то, возможно, он станет одним из самых ключевых алгоритмов антиалиасинга для современной компьютерной графики.