Введение

Тип буфера данных в компьютерной графике

Буфер глубины, также известный как Z-буфер, — это тип буфера данных, используемый в компьютерной графике для представления информации о глубине объектов в 3D-пространстве с определенной точки зрения. Глубина хранится в виде карты высот сцены, где значения представляют собой расстояние до камеры, при этом 0 соответствует ближайшему расстоянию. Схема кодирования может быть инвертирована, при этом наибольшее число соответствует ближайшему к камере значению. Буферы глубины помогают в рендеринге сцены, обеспечивая правильное перекрытие полигонов. Z-буфер был впервые описан в 1974 году Вольфгангом Страссером в его докторской диссертации о быстрых алгоритмах для рендеринга окклюдированных объектов. Альтернативным решением для определения перекрывающихся полигонов является алгоритм художника, который способен обрабатывать полупрозрачные элементы сцены, но за счет эффективности и потенциальных ошибок. В 3D-конвейере рендеринга, когда объект проецируется на экран, глубина (Z-значение) сгенерированного фрагмента в проецируемом изображении сравнивается со значением, уже сохраненным в буфере (Z-тест), и заменяет его, если новое значение ближе. Он работает в связке с растризатором, который вычисляет цветовые значения. Фрагмент, выведенный растризатором, сохраняется, если он не перекрывается другим фрагментом. При просмотре изображения, содержащего частично или полностью перекрывающиеся непрозрачные объекты или поверхности, невозможно полностью увидеть объекты, находящиеся дальше от зрителя и скрытые за другими объектами (то есть некоторые поверхности скрыты за другими). Если бы не было механизма управления перекрывающимися поверхностями, поверхности отрисовывались бы друг поверх друга, не учитывая их взаимное расположение. Задача идентификации и удаления этих поверхностей называется задачей скрытых поверхностей. Для проверки перекрытия компьютер вычисляет Z-значение пикселя, соответствующего первому объекту, и сравнивает его с Z-значением в той же позиции пикселя в Z-буфере. Если вычисленное Z-значение меньше, чем Z-значение, уже находящееся в Z-буфере (то есть новый пиксель ближе), текущее Z-значение в Z-буфере заменяется вычисленным значением. Эта процедура повторяется для всех объектов и поверхностей в сцене (часто параллельно). В конечном итоге Z-буфер обеспечивает корректное воспроизведение восприятия глубины: близкий объект скрывает более удаленный. Этот процесс называется Z-отсечением. Z-буфер имеет ту же внутреннюю структуру данных, что и изображение, а именно двумерный массив, с той лишь разницей, что он хранит одно значение для каждого пикселя экрана вместо трех значений, используемых для создания цвета в цветных изображениях. Это делает Z-буфер черно-белым, поскольку он не хранит информацию о цвете. Буфер имеет те же размеры, что и буфер экрана, для обеспечения согласованности. Первичные тесты видимости (например, отсечение задней стороны) и вторичные тесты видимости (например, проверка перекрытия и отсечение по экрану) обычно выполняются на полигонах объектов, чтобы пропустить полигоны, которые не требуется отрисовывать. Z-буфер, в свою очередь, относительно дорог в вычислительном плане, поэтому выполнение первичных и вторичных тестов видимости снижает нагрузку на Z-буфер. Гранулярность Z-буфера оказывает значительное влияние на качество сцены: традиционный 16-битный Z-буфер может приводить к артефактам (называемым "Z-борьбой" или "разрывами"), когда два объекта находятся очень близко друг к другу. Более современный 24- или 32-битный Z-буфер работает значительно лучше, хотя проблему нельзя полностью устранить без использования дополнительных алгоритмов. 8-битный Z-буфер практически не используется из-за недостаточной точности.

Применение

Буфер Z — технология, используемая практически во всех современных компьютерах, ноутбуках и мобильных телефонах для работы с трехмерной компьютерной графикой. В настоящее время основное применение — видеоигры, которым требуется быстрая и точная обработка трехмерных сцен. Буфер Z реализован аппаратно в потребительских графических картах. Буфер Z также используется (в виде программного обеспечения, в отличие от аппаратной реализации) для создания компьютерных спецэффектов для фильмов. Более того, данные буфера Z, полученные при рендеринге поверхности с точки зрения источника света, позволяют создавать тени с помощью метода shadow mapping (отображения теней).

События

Даже при достаточно мелкой гранулярности могут возникать проблемы с качеством, если точность значений расстояния в буфере z распределена неравномерно. Значения для ближних объектов гораздо точнее (и, следовательно, позволяют лучше отображать близлежащие объекты), чем значения для дальних объектов. Обычно это желательно, но иногда это приводит к появлению артефактов при удалении объектов. Модификацией буфера z, обеспечивающей более равномерное распределение точности, является буфер w (см. ниже). В начале новой сцены буфер z необходимо очистить до определенного значения, обычно 1.0, поскольку это значение является верхним пределом (в диапазоне от 0 до 1) глубины, что означает отсутствие объектов в поле зрения на данном этапе. Изобретение концепции буфера z чаще всего приписывается Эдвину Катмуллу, хотя Вольфганг Штрассер описал эту идею в своей докторской диссертации 1974 года за несколько месяцев до изобретения Катмулла. На более современных графических картах для ПК (1999–2005) управление буфером z потребляет значительную часть доступной пропускной способности памяти. Для снижения влияния буферизации z на производительность используются различные методы, такие как сжатие без потерь (вычислительные ресурсы для сжатия/распаковки дешевле, чем пропускная способность) и сверхбыстрая аппаратная очистка буфера z, которая делает устаревшим прием "один кадр с положительным значением, один кадр с отрицательным" (полный отказ от очистки между кадрами за счет использования знаковых чисел для интеллектуальной проверки глубины). Некоторые игры, особенно вышедшие позже в жизненном цикле N64, решили либо минимизировать буферизацию z (например, сначала отрисовывать фон без буферизации z, а затем использовать буферизацию z только для объектов переднего плана), либо полностью отказаться от нее, чтобы уменьшить требования к пропускной способности и объему памяти соответственно. Super Smash Bros. и F-Zero X — две игры для N64, которые минимизировали буферизацию z для увеличения частоты кадров. Несколько игр, разработанных Factor 5, также минимизировали или отказались от буферизации z. На N64 буферизация z может потреблять в 4 раза больше пропускной способности, чем при ее отсутствии. MechWarrior 2 на ПК поддерживала разрешение до 800x600 на оригинальной 4 МБ 3DFX Voodoo благодаря отсутствию использования буферизации z.

Z-убой

В рендеринге z-отсечение — это раннее исключение пикселей на основе глубины, метод, обеспечивающий повышение производительности, когда рендеринг скрытых поверхностей является ресурсоемким. Это прямое следствие z-буферизации, при которой глубина каждого пикселя-кандидата сравнивается с глубиной существующей геометрии, за которой он может быть скрыт. При использовании z-буфера пиксель можно отсечь (отбросить) сразу после определения его глубины, что позволяет пропустить весь процесс освещения и текстурирования пикселя, который в любом случае не будет виден. Кроме того, ресурсоемкие пиксельные шейдеры обычно не выполняются для отсеченных пикселей. Это делает z-отсечение хорошим кандидатом для оптимизации в ситуациях, когда пропускная способность заполнения, освещение, текстурирование или пиксельные шейдеры являются основными узкими местами. В то время как z-буферизация позволяет не сортировать геометрию, сортировка полигонов по возрастанию глубины (то есть использование алгоритма обратного порядка отрисовки) позволяет отрисовывать каждый экранный пиксель меньшее количество раз. Это может повысить производительность в сценах с ограниченной пропускной способностью заполнения и большим количеством перекрытий, но без сочетания с z-буферизацией возникают серьезные проблемы, такие как: полигоны могут взаимно перекрывать друг друга циклически (например, треугольник A перекрывает B, B перекрывает C, C перекрывает A), и не существует канонической "ближайшей" точки на треугольнике (например, независимо от того, сортируются ли треугольники по центроиду, ближайшей точке или самой дальней точке, всегда можно найти два треугольника A и B, такие что A "ближе", но на самом деле B следует отрисовывать первым). Таким образом, алгоритм обратного порядка отрисовки нельзя использовать в качестве альтернативы z-отсечению (без значительной переработки), за исключением оптимизации z-отсечения. Например, оптимизацией может быть хранение полигонов, отсортированных по координатам x/y и глубине z, для определения границ, чтобы быстро определить, могут ли два полигона потенциально взаимодействовать в плане окклюзии.

Буфер W

Для реализации w-буфера, старые значения в пространстве камеры, или , хранятся в буфере, как правило, в формате с плавающей точкой. Однако эти значения нельзя линейно интерполировать по пространству экрана от вершин – их обычно приходится инвертировать, интерполировать, а затем снова инвертировать. Полученные значения , в отличие от , равномерно распределены между и . Существуют реализации w-буфера, которые полностью избегают инверсий. То, какой буфер – z или w – даст лучшее изображение, зависит от конкретного приложения.