Z-буферизация - Z-buffering

Z-буфер данных

В компьютерная графика, z-буферизация, также известен как буферизация глубины, это управление глубиной изображения координаты в 3D графика, обычно выполняется аппаратно, иногда в программного обеспечения. Это одно из решений проблема видимости, что является проблемой определения того, какие элементы визуализированной сцены видны, а какие скрыты. Z-буферизация была впервые описана в 1974 году Вольфгангом Штрассером в главе 6 (стр. 6-1) его докторской диссертации.[1] В алгоритм художника - еще одно распространенное решение, которое, хотя и менее эффективно, может также обрабатывать непрозрачные элементы сцены. Z-буфер использует метод пространства изображения для обнаружения скрытых поверхностей. Z-буфер может относиться к структуре данных или к методу, используемому для выполнения операций с этой структурой.

В движке 3D-рендеринга, когда объект проецируется на экран, глубина (z-значение) сгенерированного пиксель на проецируемом экране изображение сохраняется в буферz-буфер или буфер глубины). Z-значение - это мера перпендикулярного расстояния от пикселя на плоскости проекции до его соответствующей 3d-координаты на многоугольнике в мировом пространстве.

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

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

При просмотре изображения, содержащего частично или полностью перекрывающиеся непрозрачные объекты или поверхности, невозможно полностью увидеть те объекты, которые находятся дальше всего от зрителя и позади других объектов (т. Е. Некоторые поверхности скрыты за другими). Идентификация и удаление этих поверхностей называется проблемой скрытых поверхностей. Чтобы улучшить время рендеринга, скрытые поверхности должны быть удалены перед передачей проецируемого изображения поверхностей в z-буфер. Чтобы проверить перекрытие, z-буфер вычисляет z-значение пикселя, соответствующего первому объекту, и сравнивает его с z-значением в том же месте пикселя в z-буфере, соответствующем объекту, который известен как ближе всего к зрителю. Если вычисленное z-значение меньше, чем z-значение, уже находящееся в z-буфере, то текущее z-значение в z-буфере заменяется вычисленным значением. Это не обязательно означает, что первый объект в целом ближе к зрителю, чем ближайший известный объект, но это определенно означает, что соответствующая 3d-точка z-значения на поверхности первого объекта в мировом пространстве ближе к зритель. Другими словами, объекты пересекаются, и по крайней мере какая-то часть первого объекта находится ближе и, следовательно, видна зрителю. В конце концов, z-буфер позволит правильно воспроизвести обычное восприятие глубины: близкий объект прячется дальше. Это называется z-отбраковка.

Степень детализации z-буфера имеет большое влияние на качество сцены: традиционный 16 бит z-буфер может привести к артефакты (называется "z-борьба " или сшивание), когда два объекта находятся очень близко друг к другу. Более современный 24 бит или 32-битный z-буфер ведет себя намного лучше, хотя полностью устранить проблему без дополнительных алгоритмов невозможно. An 8 бит z-буфер почти никогда не используется из-за слишком низкой точности.

Использует

Z-буфер - это технология, используемая почти во всех современных компьютерах, ноутбуках и мобильных телефонах для выполнения трехмерной графики, например, в компьютерных играх. Z-буфер реализован в виде аппаратного обеспечения в кремниевых ИС (интегральных схемах) в этих компьютерах. Z-буфер также используется (реализован как программное обеспечение, а не как аппаратное обеспечение) для создания компьютерных спецэффектов для фильмов.[нужна цитата ]

Кроме того, данные Z-буфера, полученные от рендеринга поверхности с точки зрения источника света, позволяют создавать тени с помощью отображение теней техника.[2]

События

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

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

Изобретение концепции z-буфера чаще всего приписывают Эдвин Кэтмелл, хотя Вольфганг Штрасер описал эту идею в своей докторской диссертации 1974 г. Диссертация за несколько месяцев до изобретения Катмулла.[а]

На более современных видеокартах для ПК (1999–2005 гг.) Управление z-буфером использует значительную часть доступного объем памяти пропускная способность. Для снижения стоимости производительности z-буферизации использовались различные методы, такие как сжатие без потерь (компьютерные ресурсы для сжатия / распаковки дешевле, чем полоса пропускания) и сверхбыстрого аппаратного z-clear, который делает устаревшим трюк «один кадр положительный, один кадр отрицательный» (вообще пропускать межкадровую очистку с использованием чисел со знаком для умной проверки глубины).

Z-отбраковка

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

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

В то время как 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 бита) и округление результата до целого числа:[3]

Эту формулу можно инвертировать и вывести, чтобы вычислить разрешение z-буфера (упомянутую ранее «степень детализации»). Обратное вышеупомянутому :

где

Разрешение z-буфера с точки зрения пространства камеры будет инкрементным значением, полученным в результате наименьшего изменения целого числа, хранящегося в z-буфере, которое равно +1 или -1. Следовательно, это разрешение может быть вычислено по производной от как функция :

Выразив это обратно в терминах пространства камеры, заменив указанным выше :

Это показывает, что значения гораздо плотнее сгруппированы около плоскости и гораздо реже, что приводит к большей точности ближе к камере. Меньший есть, тем меньше точность там далеко - имея Плоскость, установленная слишком близко, является частой причиной нежелательных артефактов рендеринга в более удаленных объектах.[4]

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

W-буфер

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

Результат - z-буфер или w-буфер - лучшее изображение - зависит от приложения.

Алгоритмика

Следующий псевдокод демонстрирует процесс z-буферизации:

// Прежде всего, инициализируем глубину каждого пикселя. D (i, j) = infinite // Максимальная длина // Инициализируем значение цвета для каждого пикселя как цвет фона c (i, j) = цвет фона // Для каждого polygon, выполните следующие действия: for (каждый пиксель в проекции многоугольника) {// Найдите глубину, т.е. z многоугольника // в точке (x, y), соответствующей пикселю (i, j) if (z 

Смотрите также

использованная литература

  1. ^ Штрассер, Вольфганг (1974-04-26). Schnelle Kurven- und Flächendarstellung auf grafischen Sichtgeräten (PDF). Берлин.
  2. ^ Акенин-Мёллер, Томас; Хейнс, Эрик; Хоффман, Нэти (2018-08-06). Рендеринг в реальном времени, четвертое издание. CRC Press. ISBN  978-1-351-81615-1.
  3. ^ Организация OpenGL. "Open GL / FAQ 2 - Точность буфера глубины". Получено 2017-12-26.
  4. ^ Грегори Массаль. «Буфер глубины - мелкие детали». Архивировано из оригинал 15 октября 2008 г.. Получено 2008-08-03.
  5. ^ Стив Бейкер. "Научитесь любить свой Z-буфер". Получено 2018-01-03.

внешние ссылки

Заметки

  1. ^ Увидеть Вольфганг К. Гилой [де ], J. L. Encarnação, W. Straßer. "Школа компьютерной графики Гилоя". Компьютерная графика 35 4: 12–16.