Буферы глубины (Direct3D 9)

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

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

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

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

Примечание

Хотя в большинстве приложений эта функция не используется, вы можете изменить сравнение, используемое в Direct3D для определения того, какие значения следует поместить в буфер глубины и в дальнейшем на поверхность цели отрисовки. Для этого измените значение состояния D3DRS_ZFUNC отрисовки. На некоторых видах оборудования при изменении функции сравнения может отключиться иерархическая проверка 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-Буфера.

Примечание

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

 

В этом разделе представлены сведения об использовании буферов глубины для удаления скрытой линии и скрытой поверхности.

Отрисовка Direct3D