Буферы глубины (Direct3D 9)
Буфер глубины, часто называемый z-буфером или w-буфером, является свойством устройства, в который хранятся сведения о глубине, которые будут использоваться Direct3D. Когда Direct3D отрисовывает сцену на целевую поверхность, она может использовать память в связанной поверхности буфера глубины в рабочей области, чтобы определить, как пиксели растровых многоугольников occlude друг друга. Direct3D использует внеэкранную поверхность Direct3D в качестве цели, в которую записываются конечные значения цветов. Поверхность буфера глубины, связанная с поверхностью целевого объекта отрисовки, используется для хранения сведений о глубине, которая сообщает Direct3D, насколько глубоко каждая видимая пиксель находится в сцене.
Когда сцена растеризована с включенной буферизацией глубины, проверяется каждая точка на поверхности отрисовки. Значения в буфере глубины могут быть координатами z-координаты точки или его однородной координатой w- от расположения точки (x,y,z,w) в пространстве проекции. Буфер глубины, использующий значения z, часто называется z-буфером, а тот, который использует значения w, называется w-buffer. Каждый тип буфера глубины имеет преимущества и недостатки, которые рассматриваются далее.
В начале теста значение глубины в буфере глубины устанавливается максимально возможное значение для сцены. Значение цвета на поверхности отрисовки имеет значение цвета фона или значение цвета фоновой текстуры в этой точке. Каждый многоугольник в сцене проверяется, пересекается ли он с текущей координатой (x,y) на поверхности отрисовки. Если это так, значение глубины , которое будет координатой z в z-буфере, и координата w в w-buffer - в текущей точке проверяется, если она меньше, чем значение глубины, хранящееся в буфере глубины. Если глубина значения многоугольника меньше, он хранится в буфере глубины и значение цвета из многоугольника записывается в текущую точку на поверхности отрисовки. Если значение глубины многоугольника в этой точке больше, проверяется следующий многоугольник в списке. Этот процесс показан на следующей схеме.
Заметка
Хотя большинство приложений не используют эту функцию, вы можете изменить сравнение, которое Direct3D использует для определения значений, помещенных в буфер глубины и последующей поверхности целевой отрисовки. Для этого измените значение состояния D3DRS_ZFUNC отрисовки. На некотором оборудовании изменение функции сравнения может отключить иерархическое тестирование z.
Почти все акселераторы на рынке поддерживают z-буферизацию, что делает z-буферы наиболее распространенным типом буфера глубины сегодня. Однако вездесущие, z-буферы имеют свои недостатки. Из-за математики, созданные значения z в z-буфере, как правило, не распределяются равномерно по диапазону z-буфера (обычно 0,0 до 1,0, включительно). В частности, соотношение между далекими и близкими плоскостями сильно влияет на распределение неравномерно z значений. Использование расстояния дальней плоскости к соотношению расстояния около плоскости 100, 90 процентов диапазона буфера глубины тратится на первые 10 процентов диапазона глубины сцены. Типичные приложения для развлечений или визуального моделирования с внешними сценами часто требуют соотношений дальней плоскости или почти плоскости в любом месте от 10000 до 10 000. В соотношении от 1000, 98 процентов диапазона тратится на первые 2 процента диапазона глубины, и распределение становится хуже с более высокими коэффициентами. Это может привести к скрытым артефактам поверхности в удаленных объектах, особенно при использовании 16-разрядных буферов глубины, наиболее часто поддерживаемой битовой глубины.
С другой стороны, буфер глубины на основе W часто равномерно распределяется между ближайшими и дальними плоскостями клипа, чем z-буфер. Ключевым преимуществом является то, что соотношение расстояний для далеких и близких плоскостей вырезки больше не является проблемой. Это позволяет приложениям поддерживать большие максимальные диапазоны, а также получать относительно точные буферизации глубины близко к точке глаза. Буфер глубины на основе w не идеально подходит, и иногда может отображать скрытые артефакты поверхности для близлежащих объектов. Еще один недостаток подхода w-buffered связан с поддержкой оборудования: w-buffering не поддерживается как широкое оборудование, так как z-буферизация.
Использование z-буфера требует накладных расходов во время отрисовки. Различные методы можно использовать для оптимизации отрисовки при использовании z-буферов. Дополнительные сведения см. в производительности Z-буфера.
Заметка
Фактическое толкование значения глубины зависит от отрисовщика.
В этом разделе представлены сведения об использовании буферов глубины для скрытой линии и удаления скрытых поверхностей.
- запрос на поддержку буфера глубины (Direct3D 9)
- создание буфера глубины (Direct3D 9)
- включение буферизации глубины (Direct3D 9)
- получение буфера глубины (Direct3D 9)
- очистка буферов глубины (Direct3D 9)
- изменение доступа к записи буфера глубины (Direct3D 9)
- функции сравнения буферов глубины (Direct3D 9)
Связанные разделы