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


Введение

Эта статья рассматривает два метода реализации сглаживания (antialiasing) на основе избыточной выборки (super-sample): сглаживание с повернутой опорной решеткой (Rotated Grid Super-sampling, RGSS) и c упорядоченной решеткой (Ordered Grid Super-sampling, OGSS). В RGSS применяется сетка разбиений, повернутая относительно стандартных осей изображения, как правило, на значения порядка 20o или 30o. По всей видимости, RGSS имеет одно основное преимущество перед OGSS: более эффективное сглаживание границ, близких по направлению к горизонтальной или вертикальной оси, т.е. там, где человеческому глазу наиболее легко заметить дискретные артефакты изображения (aliasing). Это преимущество позволяет использовать меньшее количество выборок (sub-sample) на одну результирующую точку изображения для достижения такого же визуального эффекта, как и при OGSS.

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

Что такое сглаживание?

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

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

Звук — не более, чем волна плотности: сжатие и растяжение воздуха. Это физическое событие бесконечно детально, и оно модифицируется в пространстве вместе со временем. CD — это цифровой носитель для звука; он содержит числа, эквивалентные "количеству" звука в определённые моменты времени. Перевод этих сжатий, колебаний в числа производится через микрофон и АЦП (analog to digital converter, AD). Микрофон может перевести бесконечно детальные колебания в бесконечно детальный электрический сигнал. А АЦП, в свою очередь, измеряет электрический сигнал в определённые моменты времени, сопоставляя с ним конкретное дискретное числовое значение. Каждое такое измерение и есть отсчет. В итоге, бесконечно детальное событие получило дискретное описание, которое уже может быть обработано процессором или может быть сохранено на цифровом носителе, таком, как CD.

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

Для лучшего понимания эффекта ступенчатости ниже приведены два скриншота. В части 'a' рисунка 1 — пример того, что может случиться с краями полученного изображения, например, гор. Мы видим, что поверхность располагается на сетке, каждая секция которой представляет собой пиксель. Так как обычно строим изображение мы пополигонно (а в конечном итоге — попиксельно), мы заполняем или не заполняем каждый пиксель. Получается дискретная система, в которой не может быть частично заполненных пикселей. Выбор решения — заполнять или нет — зависит от местоположения центра пиксельной зоны (на рисунке зоны показаны маленькими кружками).


Рисунок 1: иллюстрация лестничного эффекта, вызванного дискретностью отсчетов
  • (а): Бесконечно детальная кривая
  • (b): Ступенчатое дискретное изображение

На части B мы видим результат: группа пикселей, которая пытается заместить и замещает поверхность, которую мы хотели отрендерить. К сожалению, результатом этого процесса дискретизации может быть полный бардак, все портит изрядный лестничный эффект. Другим примером дискретных искажений в компьютерной графике может послужить исчезновение полигонов или пикселей (так называемый "polygon popping" или "pixel popping"). Эта проблема проявляет себя при работе с маленькими объектами, менее пикселя в ширину или высоту. Например, маленький полигон может быть помещён в такое место, в котором одиночный отсчет невозможен. В итоге полигон исчезает полностью или частично.

Рисунок 2 показывает различные эффекты исчезновения полигонов. Слева мы видим желаемый нами результат, а справа — рассчитанный результат, пострадавший от артефактов нежелательного исчезновения полигонов. Например, обратите внимание на зелёную полоску 'a'. Она закрывает центры пикселей (a) и поэтому видна. Но теперь представьте, что анимация пошла (вниз) и зелёная полоса оказалась в положении (b). В этом положении центры пикселей полосой не закрыты, поэтому, в итоге, фактически ничего и не рендерится. Заметьте, как легко зелёная полоса из видимой стала невидимой всего лишь после небольшого сдвига. Если сдвиг продолжить, то полоса снова закроет центры пикселей и станет полностью видимой. Начинается "мерцание" — прекрасный пример дискретного артефакта. К тому же, заметьте, как изменяются жёлтые фигуры от кадра (a) к (b). На разных кадрах они получились по-разному из-за недостатка отсчетов для точного представления модели. Красные продолговатые треугольники имеют совершенно одинаковые размеры, но они стали различаться в результате разного количества пикселей. Синий квадрат в кадре (a) показывает, как отличающийся от других полигон может перестать отличаться при его растеризации в изменённом месте и положении.

[1] Все эти артефакты, характеризующиеся различным растровым представлением одних и тех же обьектов только в результате изменения их положения и ориентации — симптомы дискретных искажений. Чтобы сократить эти артефакты, применяются специальные алгоритмы сглаживания, в том числе на основе избыточной выборки. По сути, сглаживанием мы и называем процесс удаления нежелательных дискретных артефактов. Проблема алгоритмов и технологий сглаживания всегда требовала и требует высокой пропускной способности и большой скорости заполнения. Это заставило сглаживание долго оставаться в области CAD и на рынке high-end компьютерных графических решений. Однако, сейчас продукты потребительского рынка подбираются к моменту, когда возможно более-менее качественное сглаживание в режиме реального времени (real-time). В следующей секции мы опишем несколько методов сглаживания.

Анимация


Рисунок 2: Иллюстрация исчезновения полигонов
  • (а) : хорошо детализированное изображение слева, грубая версия с отсутствующими полигонами и деталями справа
  • (b) : Анимационный кадр следующий за (a), видны различающиеся полигоны, создающие эффект мерцания (flickering).

Практическая реализация сглаживания

Несмотря на то, что несколько аппаратных и программных реализаций сглаживания уже были разработаны, они не добились успеха на основном потребительском рынке. Слишком высокое потребление ресурсов CPU, высокие нагрузки на память и шину, высокие затраты памяти — всё это сделало их использование на потребительском рынке непрактичным. Даже менее требовательное краевое (edge) сглаживание, которое только пытается исправить лестничный эффект на краю полигонов, но не улучшает ситуации с артефактами их исчезновения и мерцания, не стало популярным по причине его относительно низкого качества и отрицательного влияния на производительность. Сглаживание еще недавно оставалось эксклюзивной технологией CAD/CAM и реалистичной графики не-реального времени. С последними поколениями CPU и графических процессоров стало возможным использовать сглаживание и на потребительских системах, которые теперь имеют достаточную вычислительную мощность, пропускную способность, объем памяти для практической реализации сглаживания. Эта статья рассматривает основные типы сглаживания, основанного на избыточной выборке, и исследует две его специфические реализации.

Методы избыточной выборки

Как было объяснено раньше, дискретные артефакты — результат выборки, или, если точнее, недостаток низкого суммарного количества обработанных отсчетов. Избыточная выборка, как видно из названия, решает эту проблему, используя некоторое количество отсчетов на точку, что больше, чем в обычном случае, усредняя их для получения окончательного результата. В этом случае у нас есть возможность более точно смоделировать визуальное представление бесконечно детализированного естественного мира. Итак, первый важный элемент — избыточная выборка — использование дополнительных отсчетов для увеличения плотности данных в изображении. Таким образом, вместо одного центрального отсчета на пиксель, метод избыточной выборки использует несколько. Два типа сглаживания (далее AA, т.е. anti-aliasing) с использованием избыточной выборки определяются положением этих отсчетов внутри пикселя. Ordered Grid выборка — первый и основной тип избыточной выборки (далее SS, т.е. super-sampling). Само название "Ordered Grid" (упорядоченная решётка) наглядно показывает позицию отсчетов относительно данного пикселя. Выбираемые избыточные отсчеты располагаются в форме упорядоченной решётки, как показано на рис. 3а.


Рисунок 3: Иллюстрация различных типов решёток выборки
  • (a) Ordered Grid, используемая в методе OGSS.
  • (b) Rotated Grid, используемая в методе RGSS.

Второй тип SS AA известен как избыточная выборка с искаженной решеткой (Jittered Grid Super-Sampling, JGSS). JGSS аналогичен OGSS в том, что избыточные отсчеты хранятся попиксельно, но отличие между ними — в расположении отсчетов. В случае с OGSS решётка выборки параллельна и выровнена по горизонтальной и вертикальной осям. А в случае с JGSS решётка повернута относительно осей или искажена каким-либо другим образом. Пример решетки, используемой с JGSS, показана на рис. 3b. Существует несколько различных путей искажения решетки, мы сейчас рассмотрим два основных решения.

Первая реализация — полностью случайная выборка (известна как стохастическая выборка, Stochastic Sampling). По сути, это означает, что внутри результирующего пикселя отсчеты располагаются случайным образом. Ключевой момент в том, что решетка случайна для каждого пикселя на экране. Случайное расположение отсчетов вносит в результирующее изображение белый шум, но человеческий глаз менее восприимчив к случайному шуму, чем к регулярным узорам. Наличие небольшого случайного шума компенсируется исчезновением в результате выборки по многим отсчетам, делает восприятие узоров (в нашем случае — дискретных искажений) гораздо более затруднительным. Качество этого метода потрясающее, но его реализация требует очень больших затрат. Примерно 16 (или более) случайно расположенных отсчетов должны обеспечивать приемлемый уровень зашумления и практически устранить дискретные артефакты. Можно использовать и меньшее количество отсчетов, но это повышает и уровень шума, и заметность артефактов. Причем, аппаратно трудно добиться полностью случайного расположения отсчетов. Желательно избежание отсчетов, слишком близких друг к другу. Примером является использование распределения Пуассона (Poisson Distribution) [5], но подобные методы чрезвычайно сложны и на данный момент недоступны для массового потребительского уровня аппаратной поддержки. Вторая реализация выборки в JGSS — упрощенная форма первой. Вместо использования полностью случайных решеток используется заранее определённая решетка, которая аппроксимирует эффект полностью случайной выборки, повторяя его для каждого результирующего пикселя.

Итак, у нас снова есть решётка, но положения отсчетов более случайны и менее однообразны. Решетка, предложенная документацией на OpenGL, представляет собою трансформированную регулярную сетку (shear) [2]. Упорядоченная решетка смещена в сторону, смещение устраняет некоторую упорядоченность, закономерность, свойственную OGSS. Однако это смещение устраняет только вертикальную упорядоченность. Горизонтальная упорядоченность сохраняется. В итоге, вертикальная регулярность структуры OGSS разрушается, а горизонтальная остаётся. Также существует и часто используется метод сглаживания с повернутой опорной решеткой (Rotated Grid Super-Sampling, далее RGSS). В RGSS расположение отсчетов идентично расположению, применяемому в OGSS, но вся решетка повернута на некоторый угол (рисунок 3b). Заметьте, что таким образом мы избавились как от горизонтальной, так и от вертикальной упорядоченности, и уже нет ярко выраженных рядов и колонок. Подкованные теоретическими знаниями и определениями OGSS и RGSS, мы можем теперь сосредоточиться на их практической реализации в современном оборудовании. Мы рассмотрим одно и то же аппаратное решение для каждого метода SS, но будем иметь ввиду, что описано значительное количество других реализаций SS AA.

Осуществление OGSS

OGSS — это метод, который может быть внедрён почти на всех современных 3D-акселераторах, поддерживающих рендеринг во "внекадровом" (не отображаемом) буфере. Внекадровый буфер имеет место для хранения цветов пикселей, а также значения Z-буфера и буфера шаблонов (Stencil). Однако, он отличается от обычного переднего (front) или заднего (back) буфера тем, что его содержимое никогда не выводится на экран напрямую. Как было ранее объяснено, метод OGSS использует упорядоченную решетку отсчетов для каждого пикселя. Ниже мы более детально поясняем, как можно реализовать OGSS AA на современном 3D "железе".

1. Движок создаёт 3D-окружение, используя 3D API типа Direct3D или OpenGL. Оба API используют треугольники как основную строительную единицу для создания 3D-объектов. Каждый треугольник имеет свои координаты в 3D-пространстве. Эти координаты передаются, трансформируются и освещаются через API, используя спец-драйвер 3D-карты. В нашем простом примере допустим, что наше изображение имеет разрешение 10x10 пикселей и что у нас есть треугольник с вершинами в координатах (5,5), (10,10) и (10,0), создающими его в правой части изображения.

2. Координаты, доставленные API, соответствуют специфическому разрешению изображения. Когда вершины трансформируются и освещаются, они обеспечиваются видовыми координатами (а не мировыми координатами, используемыми в 3D-приложениях). Таким образом, эти координаты привязаны к финальному разрешению изображения. Для достижения нашей цели (AA) нам нужно увеличить эти координаты хотя бы в два раза в обоих направлениях — и в горизонтальном, и в вертикальном — для создания необходимого для эффективного AA количества отсчетов (так называемый Up-sampling). Это простое умножение всех координат в два раза с соответствующим увеличением разрешения. Итак, разрешение, в котором изображение будет рассчитываться, увеличивается до 20x20 (10, умноженное на 2). Координаты наших вершин также будут увеличены до (10,10), (20,20) и (20,0). Заметьте, что, несмотря на все эти изменения, относительное местоположение в пространстве вершин и треугольников сохранилось.

3. Результатом предыдущих действий является то, что вся геометрия увеличивается вдвое в двух направлениях, вертикальном и горизонтальном. Проще говоря, теперь всё стало вдвое больше. И, таким образом, выводится в четыре раза больше пикселей, по сравнению с обычным изображением. Наше исходное изображение имеет размер 10x10, а полученное — 20x20 пикселей.

4. Мы рендерим всю геометрию так же, как и обычно, но во внекадровый (невидимый) буфер. Увеличенная геометрия используется для получения AA-изображения размером 10x10 пикселей. Заметьте, что наш пример использует только один треугольник, а реальные приложения, разумеется, используют гораздо больше.

Рисунок 4: Общая схема метода OGSS

5. Когда сцена кадра построена, мы получили изображение нашего 3D-мира высокого разрешения. Теперь нужно это изображение превратить в сглаженное АА-изображение более низкого разрешения. Т.е., нам нужно перейти от SS 20x20 (двойное разрешение) изображению к AA 10x10 изображению. Этот преобразование (down-sampling) производится усреднением цветов соседних пикселей.

По существу, мы берём цветовые значения четырёх соседних пикселей (квадрат), добавляем их друг к другу и потом делим на четыре. Это означает, что мы получаем однородную смесь цветов пикселей высокого разрешения внекадрового буфера по сравнению с результирующим (демонстрируемым) изображением. На самом деле, эти четыре пикселя на внекадровом изображении высокого разрешения являются будущими отсчетами для пикселей результирующей AA-картинки. Усредненные, эти отсчеты формируют конечный сглаженный пиксель для результирующего изображения. С помощью расчета изображения в высоком разрешении, последующей его фильтрацией с уменьшением разрешения (filtering down) и с использованием усредняющего фильтра значительно уменьшаются дискретные эффекты. Для простого примера предположим, что наше изображение имеет тёмные полосы (0%) на светлом фоне (100%), расположенные вертикально, создающие эффект "полосатости" и имеющие высоту, равную одному разбиению решетки. Выборка будет содержать два тёмных и два светлых отсчета. Усредненный результат — наполовину тёмный и наполовину светлый пиксель.

6. Конечным результатом этого процесса снова будет изображение 10x10, но изображение, сглаженное OGSS методом. Мы обсудим другой важный аспект этого процесса чуть позже, в этой же статье. Схематическое представление метода OGSS можно увидеть на рис. 4 (справа). Практическая реализация реализует OGSS за счёт увеличения внекадровой сцены в два раза, по вертикали и горизонтали. Ничто не мешает использовать другие множители, например, 4 или более. Так, термины 2X OGSS и 4X OGSS часто используются для описания размера сторон регулярной решетки, используемой в OGSS. Иногда размерность заменяется термином "tap" (одна точка, отсчет), приводя, таким образом, к появлению таких терминов, как 4-tap или 16-tap OGSS. Итак, используя 16-tap OGSS, мы имеет решетку 4x4. Следует заметить также, что термины Full-Scene AA и Full-Screen AA (т.е. полноэкранное сглаживание) часто используются неуместно.

Обычно эти термины используются для обозначения OGSS, но, на самом деле, они просто обозначают то, что всё изображение (целиком) подвергается сглаживанию, будь то OGSS, или RGSS, или что-либо иное. Тем не менее, это важно, что мы упоминаем о том, какой именно тип сглаживания реализован в "железе", потому что его качество невысоко, как выяснится совсем скоро. В итоге, следует заметить, что этот метод реализации OGSS, используя существующие 3D-буферы, страдает от потенциальной несовместимости с приложениями, использующими доступ к буферу кадра. Доступ к буферу кадра производят приложения, которые для какой-либо цели заполняют буфер значениями напрямую (значения цвета и/или Z/Stencil). Проблема в том, что внутренний рендеринг происходит в повышенном разрешении, а приложение вообще об этом не знает, и, в итоге, обращение к буферу кадра происходит некорректно. Это можно увидеть на простом примере. Допустим, игра захотела использовать буфер кадра для наложения кабины на изображение. Накладываемое изображение имеет разрешение конечного изображения, а не разрешение внутреннего внекадрового буфера. В результате, накладываемое изображение с размерами экранного буфера записывается во внекадровый буфер, что, естественно, приводит к некорректному результату. Накладываемый слой заполнит лишь 1/4 нужного размера в финальном. С приложениями, использующими прямой доступ к буферу кадра, нужно работать с особой осторожностью. Проблема может быть решена на уровне драйвера, т.к. не существует аппаратного решения этой проблемы. Излишне говорить, что это приводит к серьёзному падению производительности, но без решения этой проблемы некоторые приложения покажут некорректный конечный результат.

[ Далее: Реализация RGSS ]



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




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

iXBT BRAND 2016

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

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.