Z-буферизация
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
Буфер глубины , также известный как z-буфер , представляет собой тип буфера данных , используемый в компьютерной графике для представления информации о глубине объектов в трехмерном пространстве с определенной точки зрения . Глубина хранится в виде карты высот сцены, значения представляют собой расстояние до камеры, причем 0 — самое близкое значение. Схема кодирования может быть изменена таким образом, чтобы наибольшее число соответствовало значению, ближайшему к камере. Буферы глубины помогают при рендеринге сцены и гарантируют, что правильные полигоны правильно перекрывают другие полигоны. Z-буферизация была впервые описана в 1974 году Вольфгангом Штрассером в его докторской диссертации по быстрым алгоритмам рендеринга перекрытых объектов. [1] Аналогичным решением для определения перекрывающихся полигонов является алгоритм художника , который способен обрабатывать непрозрачные элементы сцены, хотя и ценой эффективности и неверных результатов.
В конвейере 3D-рендеринга , когда объект проецируется на экран, глубина (z-значение) сгенерированного фрагмента в проецируемом изображении экрана сравнивается со значением, уже хранящимся в буфере ( тест глубины ), и заменяет его. если новое значение ближе. Он работает в тандеме с растеризатором , который вычисляет цветные значения. Фрагмент, выводимый растеризатором, сохраняется, если он не перекрывается другим фрагментом.
При просмотре изображения, содержащего частично или полностью перекрывающиеся непрозрачные объекты или поверхности, невозможно полностью увидеть те объекты, которые находятся дальше всего от зрителя и за другими объектами (т. е. одни поверхности скрыты за другими). Если бы не было механизма управления перекрывающимися поверхностями, поверхности отображались бы друг на друге, не заботясь о том, должны ли они находиться позади других объектов. Идентификация и удаление этих поверхностей называется проблемой скрытой поверхности . Чтобы проверить перекрытие, компьютер вычисляет значение z пикселя, соответствующего первому объекту, и сравнивает его со значением z в том же месте пикселя в z-буфере. Если вычисленное значение z меньше, чем значение z, уже находящееся в z-буфере (т. е. новый пиксель ближе), то текущее значение z в z-буфере заменяется вычисленным значением. Это повторяется для всех объектов и поверхностей в сцене (часто параллельно ). В конце концов, z-буфер позволит правильно воспроизвести привычное восприятие глубины: близкий объект скрывает более далекий. Это называется z-отбраковка .
Z-буфер имеет ту же внутреннюю структуру данных, что и изображение, а именно 2D-массив, с той лишь разницей, что он хранит одно значение для каждого пикселя экрана вместо цветных изображений, которые используют 3 значения для создания цвета. Из-за этого Z-буфер выглядит черно-белым, поскольку он не хранит информацию о цвете. Буфер имеет те же размеры, что и экранный буфер, для обеспечения единообразия.
Первичные тесты видимости (например, отсечение задней грани ) и вторичные тесты видимости (например, проверки перекрытия и обрезка экрана) обычно выполняются на полигонах объектов, чтобы пропустить определенные полигоны, которые не нужны для рендеринга. Z-буфер, напротив, сравнительно дорог , поэтому выполнение первичных и вторичных тестов видимости освобождает z-буфер от некоторой нагрузки.
Детализация z-буфера оказывает большое влияние на качество сцены: традиционный 16-битный z-буфер может привести к появлению артефактов (называемых « z-fighting » или сшивкой ), когда два объекта находятся очень близко друг к другу. Более современный 24-битный или 32-битный z-буфер ведет себя гораздо лучше, хотя без дополнительных алгоритмов проблему не устранить. z- буфер 8-битный практически никогда не используется, поскольку он имеет слишком низкую точность.
Использует [ править ]
Z-буфер — это технология, используемая практически во всех современных компьютерах, ноутбуках и мобильных телефонах для выполнения трехмерной компьютерной графики . Основное применение сейчас — видеоигры , требующие быстрой и точной обработки 3D-сцен. Z-буфер реализован аппаратно в потребительских видеокартах . Z-буфер также используется (реализованный как программное обеспечение, а не аппаратное обеспечение) для создания компьютерных спецэффектов для фильмов. [ нужна ссылка ]
Кроме того, данные Z-буфера, полученные при рендеринге поверхности с точки зрения источника света, позволяют создавать тени с помощью техники отображения теней . [2]
События [ править ]
Даже при достаточно малой степени детализации могут возникнуть проблемы с качеством, когда точность значений расстояний в z-буфере не распределяется равномерно по расстоянию. Ближние значения гораздо более точны (и, следовательно, могут лучше отображать более близкие объекты), чем значения, расположенные дальше. Как правило, это желательно, но иногда это может привести к появлению артефактов по мере удаления объектов. Вариант z-буферизации, который приводит к более равномерному распределению точности, называется w-буферизацией (см. ниже ).
В начале новой сцены z-буфер должен быть очищен до определенного значения, обычно 1,0, поскольку это значение является верхним пределом (по шкале от 0 до 1) глубины, означающим, что в этом месте нет ни одного объекта. укажите через усеченную пирамиду просмотра .
Изобретение концепции z-буфера чаще всего приписывают Эдвину Катмуллу , хотя Вольфганг Штрассер описал эту идею в своей докторской диссертации 1974 года. диссертацию за несколько месяцев до изобретения Кэтмалла. [а]
На более поздних видеокартах для ПК (1999–2005 гг.) управление z-буфером использует значительную часть доступной памяти пропускной способности . Для снижения затрат на производительность z-буферизации использовались различные методы, такие как сжатие без потерь (компьютерные ресурсы для сжатия/распаковки дешевле, чем полоса пропускания) и сверхбыстрая аппаратная z-clear, которая делает устаревшим принцип «один кадр положительный, один кадр». отрицательный» трюк (полный пропуск межкадровой очистки с использованием чисел со знаком для умной проверки глубины).
В некоторых играх, особенно в нескольких играх позже в жизненном цикле N64 , было решено либо минимизировать Z-буферизацию (например, сначала визуализировать фон без Z-буферизации и использовать Z-буферизацию только для объектов переднего плана), либо полностью отказаться от нее, чтобы уменьшить требования к пропускной способности памяти и требования к памяти соответственно. Super Smash Bros. и F-Zero X — две игры для N64, в которых Z-буферизация минимизирована для увеличения частоты кадров. В некоторых играх Factor 5 Z-буферизация также была сведена к минимуму или опущена. На N64 Z-буферизация может потреблять в 4 раза больше полосы пропускания, чем без использования Z-буферизации. [3]
Mechwarrior 2 на ПК поддерживает разрешения до 800x600. [4] на оригинальном 3DFX Voodoo размером 4 МБ из-за отсутствия Z-буферизации.
Z-отсечение [ править ]
В рендеринге z-отсечение — это раннее удаление пикселей на основе глубины, метод, обеспечивающий повышение производительности, когда рендеринг скрытых поверхностей обходится дорого. Это прямое следствие z-буферизации, при которой глубина каждого пикселя-кандидата сравнивается с глубиной существующей геометрии, за которой он может быть скрыт.
При использовании z-буфера пиксель можно отсеять (отбросить), как только станет известна его глубина, что дает возможность пропустить весь процесс освещения и текстурирования пикселя, который в любом случае не был бы виден . трудоемкие пиксельные шейдеры Кроме того, для отсеянных пикселей обычно не выполняются . Это делает z-отсечение хорошим кандидатом на оптимизацию в ситуациях, когда являются скорость заполнения основными узкими местами , освещение, текстурирование или пиксельные шейдеры .
В то время как z-буферизация позволяет не сортировать геометрию, сортировка полигонов по увеличению глубины (таким образом, используя алгоритм обратного рисования ) позволяет отображать каждый пиксель экрана меньшее количество раз. Это может повысить производительность в сценах с ограниченной скоростью заливки и большим количеством перерисовки, но если не использовать Z-буферизацию, возникают серьезные проблемы, такие как:
- многоугольники могут перекрывать друг друга в цикле (например: треугольник A перекрывает B, B перекрывает C, C перекрывает A), и
- в треугольнике не существует канонической «ближайшей» точки (например: независимо от того, сортируются ли треугольники по их центроиду , ближайшей или самой дальней точке, всегда можно найти два треугольника A и B такие, что A «ближе», но на самом деле B надо рисовать в первую очередь).
Таким образом, алгоритм обратного рисования не может использоваться в качестве альтернативы Z-отсечению (без серьезной реинжиниринга), кроме как в качестве оптимизации Z-отбраковки. Например, оптимизация может заключаться в сохранении сортировки полигонов в соответствии с расположением x/y и глубиной z для обеспечения границ, чтобы быстро определить, могут ли два полигона иметь взаимодействие окклюзии.
Математика [ править ]
Диапазон значений глубины в пространстве камеры, подлежащем рендерингу, часто определяется между и ценность .
После перспективного преобразования новое значение , или , определяется:
После орфографической проекции новое значение , или , определяется:
где это старое значение в пространстве камеры и иногда называется или .
Полученные значения нормализованы между значениями -1 и 1, где плоскость находится в -1 и плоскость равна 1. Значения за пределами этого диапазона соответствуют точкам, которые не находятся в усеченной пирамиде просмотра и не должны отображаться.
Представление с фиксированной точкой [ править ]
Обычно эти значения сохраняются в z-буфере аппаратного графического ускорителя в формате с фиксированной запятой . Сначала они нормализуются к более распространенному диапазону [0, 1] путем замены соответствующего преобразования в предыдущую формулу:
Упрощение:
Во-вторых, приведенная выше формула умножается на где d — глубина z-буфера (обычно 16, 24 или 32 бита) и округление результата до целого числа: [5]
Эту формулу можно инвертировать и вывести для расчета разрешения z-буфера («детализация», упомянутая ранее). Обратная ситуация вышесказанному :
где
Разрешение z-буфера с точки зрения пространства камеры будет дополнительным значением, полученным в результате наименьшего изменения целого числа, хранящегося в z-буфере, которое равно +1 или -1. Следовательно, это разрешение можно рассчитать по производной как функция :
Выразив это обратно в терминах пространства камеры, заменив вышеизложенным :
Это показывает, что значения сгруппированы гораздо плотнее вблизи плоскости и гораздо реже на дальнем расстоянии, что приводит к большей точности ближе к камере. Чем меньше то есть, тем меньше точность там, где слишком близко установленная плоскость является распространенной причиной нежелательных артефактов рендеринга более удаленных объектов. [6]
Чтобы реализовать z-буфер, значения по линейно интерполируются экранному пространству между вершинами текущего многоугольника , и эти промежуточные значения обычно сохраняются в z-буфере в формате с фиксированной запятой .
W-буфер [ править ]
Чтобы реализовать w-буфер, [7] старые ценности в пространстве камеры или , хранятся в буфере, обычно в формате с плавающей запятой . Однако эти значения нельзя линейно интерполировать по экранному пространству от вершин — обычно их приходится инвертировать , интерполировать, а затем снова инвертировать. Полученные значения , в отличие от , расположены равномерно между и . Существуют реализации w-буфера, которые вообще исключают инверсии.
Будет ли Z-буфер или w-буфер обеспечивать лучшее изображение, зависит от приложения.
Алгоритмы [ править ]
Следующий псевдокод демонстрирует процесс z-буферизации:
// First of all, initialize the depth of each pixel. d(i, j) = infinite // Max length // Initialize the color value for each pixel to the background color c(i, j) = background color // For each polygon, do the following steps : for (each pixel in polygon's projection) { // Find depth i.e, z of polygon // at (x, y) corresponding to pixel (i, j) if (z < d(i, j)) { d(i, j) = z; c(i, j) = color; } }
См. также [ править ]
Ссылки [ править ]
- ^ Штрассер, Вольфганг (26 апреля 1974 г.). «Будущая работа». ( ) Быстрое отображение кривых и поверхностей на графических устройствах отображения PDF ( на немецком языке). Берлин. 6-1.
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка ) - ^ Акенине-Мёллер, Томас; Хейнс, Эрик; Хоффман, Нати (6 августа 2018 г.). Рендеринг в реальном времени, четвертое издание . ЦРК Пресс. ISBN 978-1-351-81615-1 .
- ^ Как я реализовал MegaTextures на реальном оборудовании Nintendo 64 , получено 4 января 2024 г.
- ^ Сравнение 3D-ускорения, эпизод 11: Mechwarrior 2 — 3DFX / PowerVR / S3 Virge / ATI Rage / Matrox Mys , получено 4 января 2024 г.
- ^ Организация OpenGL. «Open GL/FAQ 2 — Точность буфера глубины» . Проверено 26 декабря 2017 г.
- ^ Грегори Массаль. «Буфер глубины — мелкие детали» . Архивировано из оригинала 15 октября 2008 года . Проверено 3 августа 2008 г.
- ^ Стив Бейкер. «Учимся любить свой Z-буфер» . Проверено 3 января 2018 г.
Внешние ссылки [ править ]
Примечания [ править ]
- ^ См. Вольфганг К. Гилой , Дж. Л. Энкарнасао, В. Штрассер. «Школа компьютерной графики Гилоя». Компьютерная графика 35 4:12–16.