Анализ методов сглаживания на основе super-sampling

Продолжение


Реализация RGSS

Сглаживание с повернутой опорной решеткой (RGSS) может быть реализовано с использованием технологии буфера накопления (Accumulation Buffer), а также с использованием T-Buffer, технологии от 3dfx. Мы подробно опишем реализацию RGSS с применением возможности чипа VSA-100 — T-Buffer, использованном в новейших продуктах 3dfx — картах Voodoo5:

1. Движок игры создаёт 3D окружение, используя 3D API типа Direct3D или OpenGL. Оба API используют треугольники как основную строительную единицу для создания 3D объектов. Каждый треугольник имеет свои координаты в 3D пространстве. Эти координаты передаются, трансформируются и освещаются. Ну и, естественно, при наличии аппаратного T&L, данные направляются непосредственно в T&L блок видеокарты для последующей трансформации и освещения. (Впрочем, в этом чипе 3dfx аппаратного T&L нет)

2. Реализация T-Buffer в чипе VSA-100 использует многочиповое решение в котором каждый чип рассчитывает 2 отсчета (разумно будет предположить, что будущие чипы позволят рассчитывать большее количество отсчетов на каждый чип). Таким образом нам понадобится хотя бы два чипа VSA-100 для реализации AA с решеткой 4-на-4. В нашем объяснении мы предполагаем, что у нас 2х чиповая конфигурация, как и используемая в семействе Voodoo5. Как было сказано прежде, решетка подвергается вращению. Положение повернутых отсчетов обеспечивается смещением геометрических вершин. Так, для каждого отсчета, вершины получают точные изменения на субпиксельном (sub-pixel) уровне, соответствующие требуемым положениям отсчетов. Рис. 5 показывает, как это делается. Положение отсчетов в экранных координатах и разрешение остаются теми же, но, сдвигая геометрию на субпиксельном уровне, мы получаем различные отсчеты. Все эти геометрические сдвиги выполняются в чипе VSA-100 аппаратно, поэтому никакие программные надстройки для RGSS AA не требуются.


Рисунок 5: Иллюстрация, привязывающая смещенную геометрию к позициям различных отсчетов.
  • (a) Нормальная не сглаженная решетка.
  • (b) 4 сдвинутых версии сцены. Заметьте, что треугольник с штриховой линией — исходный треугольник, в то время как треугольник со сплошным краем — сдвинутые позиция. Реальная точка отсчета остаётся на том же месте внутри пикселя.
  • (c) Эквивалентные позиции отсчетов. Сравните полученные точки отсчетов показанные на (b) с эквивалентными им маленьким окружностями.

3. Затем происходит рендеринг всей смещённой геометрии. Каждая смещённая версия отсылается в свой собственный T-Buffer. Каждый T-Buffer имеет разрешение соответствующее разрешению конечного AA изображения. Количество T-Buffer соответствует количеству используемых отсчетов. Каждый чип VSA-100 работает с двумя отсчетами и, таким образом, пишет в два буфера. Запись осуществляется в невидимый (задний, back) T-Buffer, аналогичный обычным передним и задним буферам (front и back), которые обычно используются в современных 3D акселераторах. Содержимое переднего буфера выводится на монитор в то время как построение изображения осуществляется в заднем (back) буфере. Это исключает такие артефакты как мерцание при отрисовке (tearing).

4. Как только вся геометрия этого кадра смещена и отрисована в T-Buffers, мы получаем набор буферов содержащие информацию о цветах пикселей для каждого смещения сцены. Каждый буфер содержит отсчет конечного изображения, как проиллюстрировано на рисунке 5. Именно сейчас происходит смена заднего и переднего буфера.

5. На данный момент передний T-Buffer содержит все отсчеты только что отрисованой сцены. Теперь отсчеты принадлежащие одному результирующему пикселю должны быть скомбинированы для формирования конечного сглаженного изображения. Эта операция исполняется перед RAMDAC, с помощью специального блока, который смешивает содержимое различных буферов на пиксельном уровне. RAMDAC это специальный блок 2D/3D чипа, который переводит содержимое буферов в сигнал, который может быть выведен на экран монитора.

Главным преимуществом подобной схемы является то, что нет необходимости в хранении результирующего изображения, а также то, что глубина цвета на выходе выше, чем глубина цвета отдельного буфера. Например, T-Buffers содержат 16bit sub-samples, но операция комбинирования (усреднение цветов) выполняется видеосхемой гораздо более точно, что приводит к конечному AA изображению с более высокой глубиной цвета чем в отдельных T-Buffer-ах. Технология аналогична технологии пост-фильтра, используемой в чипах Voodoo2 и Voodoo3 [3]. Схематическое представление этого метода показано на Рис.6 чуть ниже. Подобная технология может быть применена в чипах, содержащих буфер накопления (Accumulation Buffer) [2][4]. Однако традиционный буфер накопления содержит некоторые недостатки в реализации RGSS. Сдвиг должен выполняться программно, и геометрия должна быть послана в "железо" несколько раз.

Технология T-Buffer в чипах VSA-100 выполняет сдвиг на аппаратном уровне, сохраняя драгоценную пропускную способность (геометрические данные должны быть посланы в чип VSA-100 всего лишь раз, так как чип самостоятельно сдвигает геометрию и отрисовывает её в буфер. Традиционные аппаратные T&L акселераторы могут рассчитать и применить сдвиг аппаратно, но вся геометрия всё ещё должна быть отослана в ядро рендеринга несколько раз. Другой недостаток буфера накопления заключается в комбинировании отсчетов. В случае T-Buffer'а его выполняют как раз перед RAMDAC, в то время как традиционные системы требуют дорогостоящей операции копирования и комбинирования, совмещения содержимого буфера накопления с содержимым кадрового буфера после каждого вычисления кадра для соответствующего отсчета. Больше информации о технологии буфера накопления можно найти в [2] и [7].


Рисунок 6: Общее представление метода RGSS.

Заметьте, всплывшая в секции описания OGSS проблема буфера кадра не касается VSA-100, так как все T-Buffer'а имеют одинаковое разрешение финального изображения. Вместо записи только в один буфер, чип VSA-100 автоматически записывает данные во все T-Buffer'a. К тому же VSA-100 архитектура объединяет отсчеты для формирования конечного сглаженного пикселя ещё до того как данные возвращаются в CPU. Это позволяет CPU осуществлять захват изображения именно в том виде, в котором его видит пользователь на экране. Это обеспечивает используемой в чипе VSA-100 реализации RGSS полную совместимость со всеми 3D API. Также заметьте, что OGSS легко может быть реализована в VSA-100, так как фактически смещения позиции отсчетов полностью программируемые. Реализация OGSS в VSA-100 просто использует другие позиции (а именно — равномерно упорядоченную прямоугольную решетку).

Итоги

Таким образом мы обсудили различные виды реализации SS, сфокусировали своё внимание на OGSS и RGSS. Главное различие между двумя этими методами в расположении отсчетов внутри результирующего сглаженного пикселя. Также мы обсудили реализации этих методов в PC 3D акселераторах. Следующая часть статьи посвящена сравнению качества изображения, а также нескольким другим ключевым моментам.

Теоретическое качество изображения

В предыдущей части мы представили два практических способа выполнения сглаживания. Первым был OGSS, а вторым — RGSS. Мы обнаружили, что основное отличие между этими методами в различном положении отсчетов. Теперь мы сосредоточимся на сравнении OGSS с RGSS. Обратим особое внимание на то, что происходит с краями полигонов. Внутри-полигональные дискретные артефакты обычно устраняются с помощью фильтрации текстур, но это уже имеет малое отношение к нашей статье. Методы SupeSampling Anti-Aliasing (SS AA) помогают устранить артефакты, обеспечивая болшее качество изображения, тем не менее, этого недостаточно для устранения значительных артефактов при текстурировании. Оба метода (OGSS и RGSS) используют 4 отсчета, и, в итоге, мы получаем пять возможных результатов. Проще говоря, допустим, что у нас имеется равномерно закрашенный чёрным цветом полигон на белом фоне. Ниже представлены пять возможных вариантов результата:

Случай 1: Все отсчеты "выпадают" из полигона. Т.е. в итоге мы получаем 0% заполнение. Внутри полигона — 0 из 4 отсчетов, т.е. результирующим цветом в этом случае будет абсолютно белый цвет.

Случай 2: Один отсчет попадает внутрь полигона. Таким образом мы получаем один чёрный и три белых отсчетов. Результат смешения — заполненный 25% серым цветом пиксель. Это 25% случай.

Случай 3: Два отсчета попадают внутрь полигона. Таким образом мы получаем два чёрных и два белых отсчета. Результат смешения — заполненный 50% серым цветом пиксель. Это 50% случай.

Случай 4: Три отсчета попадают внутрь полигона, в итоге мы получаем заполненный 75% серым цветом пиксель. Это 75% случай.

Случай 5: Все отсчеты попадают внутрь полигона. Результат смешения — полностью заполненный чёрным цветом пиксель, и это 100% случай.

В итоге, сглаживание с 4 отсчетами может иметь пять различных краевых эффекта: 0%, 25%, 50%, 75% и 100%, в зависимости от количества отсчетов покрываемых полигоном. Эти различные значения влияют на контраст между пикселями внутри и снаружи полигона. Уменьшенный контраст обеспечивает меньшую краевую ступенчатость. Зная о наличии пяти теоретических вариантов и зная, что мы имеем два метода с различным положением отсчетов, разумно будет заключить, что края будут сглажены различным образом в случае использования различных алгоритмов AA. Именно здесь в игру вступает понятие критического угла наклона стороны (Critical Edge Angles). Критический угол возникает когда край проходит через (или около) двух отсчетов одновременно. Легче всего это понять на следующем примере. Возьмите отсчет позиции метода OGSS (см. рисунок 3а) и представьте, что горизонтальный край движется сквозь один пиксель. Заметьте, что отсчеты выстроены по горизонтали. Это означает, что нижние два отсчета будут затронуты краем одновременно.

Это справедливо и для двух отсчетов вверху, — они тоже выстроены горизонтально. Т.е. это означает, что движение горизонтального края проходит все стадии: 0%, 50%, а потом и 100%. Заметьте, что 25% и 75% выпадают, т.к. два отсчета затронуты краем одновременно, дважды! Потеря 2 из 5 уровней затенения — пример случая "плохого угла" для OGSS. Когда мы смотрим на решетку, мы замечаем, что тот же эффект "всплывает" при крае, находящемся под вертикальным углом (90o). Итак, по сути алгоритм OGSS имеет два плохих угла: горизонтальные края (0o) и вертикальные края (90o). Тот же эффект, но в меньшей степени проявляется и при углах 45o и 135o. Если вы представите себе край, движущийся через решетку под углом 45o слева и справа, то вы заметите, как сначала один отсчет входит в полигон, а затем и два следующих отсчета, выстроенные по диагонали, проходят возле края в одно и то же время. В конце концов, и последний отсчет затрагивается краем. Мы опять теряем случай 50%. На сей раз мы теряем только один теневой уровень, т.е. здесь имеет место случай так называемого "среднего угла" (Mediocre Angle).

В методе RGSS точки отсчетов тоже имеют особое расположение (см. рис 3b). По сути, в RGSS используется расположение аналогичное используемому в OGSS. Используется вращение под определённым углом. Это означает, что метод RGSS также имеет свои критические углы. Также как и в OGSS методе, существуют два случая "плохого" угла и два "среднего". По сути, плохие случаи аналогичные OGSS, но они также повернуты на угол вращения решётки. Поэтому если этот угол равен, к примеру, 20o, то случаи "плохого" угла будут соответственно 0o + 20o = 20o и 20o + 90o = 110o, а "среднего" — 20o + 45o = 65o и 20o + 135o = 155o. Основываясь на этой информации можно сделать неправильный вывод — что оба метода одинаково хороши и плохи. В конце концов, не-очень-идеальные случаи сглаживания (при которых теряются уровни затенения) просто смещаются на другие угловые значения. Скоро мы обнаружим, что некоторые углы требуют лучшего сглаживания. Начнём с теоретических примеров, касающихся критических углов.

Анализ теоретических изображений

Первый краевой пример близок к критическому углу в методе OGSS. Точнее говоря, мы посмотрим на почти горизонтальный край, что очень близко к плохому углу (0o). Рисунки 7а и 7b показывают этот край, наложенный на OGSS и RGSS решетки. Под каждым примером находится полученный сглаженый край, созданный с помощью усреднения отсчетов. Первая заметная деталь — результат OGSS метода явно неудовлетворителен. Только 0%, 50% и 100% затенение доступно для сглаживания краёв и уменьшения контрастности. С другой стороны, методу RGSS доступны все степени затенения для сглаживания. Угол вращения в методе RGSS во всех примерах равен 27o. Заметьте, что специальные реализации типа 3dfx T-Buffer могут использовать другой угол вращения. Вообще, расположение отсчетов может быть запрограммировано. Этот пример показывает нам, что проблемы могут возникнуть не только в случае конкретных критических углов. Углы, близкие к ним также могут вызывать потерю уровней затенения. Конечно, разумно будет определить, насколько "близкие". К сожалению, это намного сложнее, чем это может показаться с первого взгляда.


Рисунок 7: Сравнение близких к критическим углам случаев
  • (a) OGSS
  • (b) RGSS

Тем не менее, мы может определить фактор, влияющий на допустимую близость угла к критическому случаю. Главным фактором является разрешение изображения. Чем выше оно, тем ближе к друг к другу точки отсчетов. Когда они ближе, риск "прыжка" через более чем один отсчет сокращается. По сути, этот фактор изменяется в зависимости от применяемого разрешения. Вот основное правило: выше разрешение — лучшие результаты сглаживания. В этом примере очевидно то, что метод RGSS значительно превосходит по качеству OGSS. Хотя в данном примере это и не удивительно. Всё-таки мы выбрали угол, являющийся критическим для метода OGSS в то время как для RGSS он был совсем не критическим. Теперь рассмотрим пример случая "плохого угла" для метода RGSS. Точнее, рассмотрим случай, когда угол расположения края равен углу вращения. Это аналогично случаю горизонтального края при использовании OGSS. На рисунках 8 и 9 показан медленно движущийся вдоль линии, перпендикулярной плохому углу, полигон. Таким образом край пройдёт сквозь все возможные уровни затенения.

При сравнении случаев "плохих углов" при реализации обоих методов, нетрудно заметить, что оба метода страдают одним и тем же недостатком — потерей уровней затенения. Также при более близком рассмотрении видно, что в случае близком к горизонтальному, конечный результат при использовании OGSS нисколько не напоминает конечный результат RGSS. Сдвиг края вверх и вниз совсем не улучшает ситуацию. Тем не менее, в случае плохого угла для RGSS видно, что конечные результаты обоих методов очень схожи. Более того, они почти одинаковы — результат (b) метода OGSS практически идентичен (d) метода RGSS. То же самое справедливо для (a) и (b). Причина наличия небольших отличий в том, что при угле, близком к горизонтальному лестничный эффект очень расширенный. Ступеньки удлинены, а при наличии только одного уровня затенения невозможно достичь плавности и сглаженности.

Тем не менее при критическом угле в RGSS, лестница очень узкая и неровная. В результате, у нас нет достаточного места для размещения различных значений затенения вдоль края. Фактически, в статичном примере вы можете заметить, что используется только один основной уровень затенения. Из-за этого, метод RGSS может скопировать результат OGSS. Все эти примеры приводят к некоторым выводам. Хотя каждый край отображает худший случай для каждого конкретного метода сглаживания, самый худший случай из них двоих принадлежит методу OGSS. Он визуально хуже самого плохого случая RGSS (край параллельный углу вращения). Влияние меньшего количества уровней затенения намного более заметно на горизонтальном крае, сглаженном методом OGSS. Самое главное влияние на видимость краёв оказывает контрастность. При не очень высоком уровне контрастности разница между двумя методами очень незначительна.


Рисунок 8: Случай плохого угла для RGSS. Результаты OGSS.
  • (a), (b), (c) и (d) результат анимации



Рисунок 9: Случай плохого угла для RGSS. Результаты RGSS.
  • (a), и (b) результат анимации.

Рассмотрев случаи плохих углов, перейдём к случаям средних углов (45o для OGSS и 45o + 27o для RGSS). Они показаны на рисунках 10 и 11.

Случай 45o находится под влиянием эффекта очень схожего с эффектом, видимым в 27o случае о котором мы говорили раньше. Проще говоря, ступенька имеет очень маленькие размеры, что делает размещение достаточного количества уровней затенения невозможным. Опять же, очень трудно заметить разницу между двумя методами, — это заметно лишь в движении. Конечные результаты выглядят почти идентично. Следует вывод, что очень трудно заметить потерю уровней во время игры. Теоретически, RGSS метод немного лучше и с его помощью можно создавать более сглаженную анимацию, но разница минимальна, особенно в случае с уменьшенным контрастом (чёрный/белый — худший случай, но он очень редко встречается в играх). Случай 45o + 27o для RGSS очень схож с предыдущим и показан на рисунках 12 и 13. И снова, лесенка сама по себе относительно мала что приводит к нехватке места для использования различных затенений. Теряется только один уровень затенения и это не очень заметно при более реалистичных уровнях контраста (а не чёрный/белый). Одна вещь, которая заметна при этом угле — скорость анимации тоже оказывает влияние на конечный результат. В примере с OGSS видно, что не каждый пиксель обновляется со сменой каждого шага анимации. Некоторые пиксели сохраняют своё цветовое значение. Это открывает новый фактор, влияющий на качество: частота смены кадров (FPS). Чем выше частота, тем меньше анимационные шаги.


Рисунок 10: Случай среднего угла для OGSS (45°). Результаты OGSS. (
  • a), (b), и (c) результат анимации



Рисунок 11: Случай среднего угла для OGSS (45°). Результаты RGSS.
  • (a), (b), (c) и (d) результат анимации.



Рисунок 12: Случай среднего угла для RGSS (45°+ угол). Результат OGSS.
  • (a), (b), (c), (d) и (e) результат анимации.



Рисунок 13: Случай среднего угла для RGSS (45°+ угол). Результаты RGSS.
  • (a), (b), и (c) результат анимации.

Достаточно высокая частота обновления, объединенная вкупе с высоким количеством уровней затенения — существенный момент в качестве. До этих пор мы занимались рассмотрением сглаживания с 4 отсчетами. Как было замечено раньше, ничто не мешает нам использовать большее или даже меньшее количество отсчетов. Использование упорядоченной решётки только с отсчетами позволяет выполнять сглаживание только в одном направлении (по одной оси). Проще говоря, при увеличении изображения только в вертикальном направлении, т.е. так, что изображение 10-на-10 преобразовуется в 10-на-20. Мы получаем 2 вертикально выровненных отсчета. В этом случае в нашем распоряжении оказываются три уровня затенения: 0, 50 и 100%, только по вертикали. Качество сглаживания в этом случае очень низко. Вращение этой решётки решает проблему с выравниванием и 3 уровня затенения становятся доступными по обеим осям.

Рисунок 14 ниже показывает, что качество RGSS с 2 отсчетами для близких к горизонтальным углов практически идентично качеству OGSS с 4 отсчетами. Аналогичный результат наблюдается при сравнении OGSS с 16 отсчетами с RGSS с 4, для близких к горизонтальным и вертикальным углов. Основываясь на этих данных, можно сделать вывод, что в критических случаях RGSS обеспечивает качество аналогичное качеству OGSS, но с затратой гораздо меньшего количества отсчетов. Метод OGSS не в состоянии обеспечить достаточное количество уровней для таких углов, теряя 25% и 75% уровней затенения. RGSS, с другой стороны, обеспечивает полный комплект уровней для сглаживания близких к горизонтальным и вертикальным краёв. Другие потенциально проблемные углы оказываются не такими уж проблемными в связи с незначительным лестничным эффектом. Заметная разница видна лишь в процессе анимации, но даже во время её разница между двумя методами минимальна. Итак, сильные различия между OGSS и RGSS проявляются в основном лишь в случае близких к горизонтальным и вертикальным краёв.

[ Далее: Какие краевые углы требуют Anti-Aliasing в первую очередь? ]



Опубликовано с разрешения 3dfx Interactive, Inc.




Дополнительно

iXBT Brand 2018

"iXBT Brand 2018" - Выбор читателей в номинации "Процессоры (CPU)":
Подробнее с условиями участия в розыгрыше можно ознакомиться здесь. Текущие результаты опроса доступны тут.