Буферы глубины

Буфер глубины или z-буфер хранит сведения о глубине для управления тем, какие области многоугольников отображаются, а какие скрываются в текущем отображении.

Обзор

Буфер глубины, часто также называемый z-буфером или w-буфером, — это свойство устройства, в котором хранятся сведения о глубине, используемые в Direct3D. При отрисовке сцены на поверхности цели Direct3D может использовать память на связанной поверхности буфера глубины как рабочую область, чтобы определить, как пиксели преобразованных в растровый формат многоугольников закрывают друг друга. Direct3D использует поверхность Direct3D вне экрана в качестве цели, куда записываются окончательные значения цветов. Поверхность буфера глубины, связанная с поверхностью цели отрисовки, используется для хранения сведений о глубине, которые используются в Direct3D, чтобы определить глубину отображения каждого пикселя в сцене.

Когда сцена преобразуется в растровый формат с включенной буферизацией глубины, каждая точка на поверхности отрисовки проверяется. Значения в буфере глубины могут быть координатой z точки или ее однородной координатой w на основе координат расположения точки (x,y,z,w) в пространстве проекции. Буфер глубины, в котором используются значения z-координаты, часто называется z-буфером, а тот, в котором используются значения w-координаты, — w-буфером. У каждого типа буфера глубины есть преимущества и недостатки, которые будут подробно описаны далее.

В начале теста в буфере глубины установлено максимально возможное для сцены значение глубины. В качестве значения цвета на поверхности отрисовки используется либо значение цвета фона, либо значение цвета текстуры фона в этой точке. Каждый полигон в сцене проверяется на предмет пересечения с текущей координатой (x,y) на поверхности отрисовки.

Если он пересекается, значение глубины, которое будет координатой z в z-буфере и координатой w в w-буфере, в текущей точке проверяется, чтобы определить, меньше ли оно значения глубины, хранящегося в буфере глубины. Если значение глубины полигона меньше, оно сохраняется в буфер глубины, а значение цвета полигона записывается в текущую точку на поверхности отрисовки. Если значение глубины полигона в этой точке больше, проверяется следующий полигон в списке. Этот процесс показан на следующей схеме.

схема проверки значений глубины

Методы буферизации

Хотя в большинстве приложений эта функция не используется, вы можете изменить сравнение, используемое в Direct3D для определения того, какие значения следует поместить в буфер глубины и в дальнейшем на поверхность цели отрисовки. На некоторых видах оборудования при изменении функции сравнения может отключиться иерархическая проверка z-буферов.

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

В частности, соотношение между дальней и ближней плоскостями отсечения сильно влияет на неравномерность распределения z-значений. Если соотношение между расстояниями до дальней и ближней плоскостей равно 100, 90% диапазона буфера глубины занимается первыми 10% диапазона глубины сцены. В обычных приложениях для развлечения или визуального моделирования с внешними сценами часто требуется соотношение между расстояниями до дальней и ближней плоскостей в диапазоне от 1 000 до 10 000. При соотношении 1 000 98% диапазона занимается первыми 2% диапазона глубины, а при повышении соотношения равномерность распределения падает. Это может привести к скрытым артефактам поверхности дальних объектов, особенно при использовании 16-разрядных буферов глубины, наиболее широко поддерживаемой глубине.

С другой стороны, w-буфер глубины обычно обеспечивает более равномерное распределение между ближней и дальней плоскостями отсечения, чем z-буфер. Главное преимущество заключается в том, что соотношение расстояний до дальней и ближней плоскостей отсечения больше не доставляет проблем. За счет этого приложения могут поддерживать большие максимальные диапазоны, при этом обеспечивая относительно точную буферизацию глубины вблизи базовой точки визуализации сцены. W-буфер глубины не идеален и иногда может приводить к возникновению скрытых артефактов поверхности ближних объектов. Еще один недостаток использования w-буфера связан с поддержкой оборудования: w-буферизация не так широко поддерживается на оборудовании, как z-буферизация.

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

Фактическая интерпретация значения глубины зависит от конкретного обработчика.

Буферы глубины и трафаретов