Введение

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

Реализация

Классический алгоритм растрирования проецирует каждый многоугольник на плоскость изображения и определяет, какие точки выборки из регулярно расположенного множества находятся внутри проецируемого многоугольника. Поскольку местоположение этих образцов (т.е. пикселей) задано неявно, это определение может быть выполнено путем проверки границ относительно неявной сетки точек выборки. Однако, если расположение точек выборки нерегулярно и не может быть вычислено по формуле, этот подход не работает. Нерегулярный Z-буфер решает эту проблему, явно сохраняя местоположения образцов в двухмерной пространственной структуре данных, а затем выполняя запрос к этой структуре для определения, какие образцы находятся внутри проецированного треугольника. Этот последний шаг называется "нерегулярной растризацией". Хотя конкретная используемая структура данных может варьироваться в зависимости от реализации, два изученных подхода – это kd-дерево и сетка связанных списков. Сбалансированная реализация kd-дерева имеет преимущество в том, что гарантирует доступ за O(log(N)). Основной недостаток заключается в том, что параллельное построение kd-дерева может быть затруднено, а обход требует дорогостоящих инструкций ветвления. Сетка списков имеет преимущество в том, что её можно более эффективно реализовать на GPU-оборудовании, которое в первую очередь предназначено для классического Z-буфера. С появлением CUDA программируемость современного графического оборудования была значительно улучшена. Магистерская диссертация "Быстрая растризация треугольников с использованием нерегулярного Z-буфера на CUDA" (см. Внешние ссылки) содержит полное описание программной реализации создания теневых карт на основе нерегулярного Z-буфера на CUDA. Система рендеринга полностью работает на графических процессорах и способна генерировать тени без ступенчатости при пропускной способности в десятки миллионов треугольников в секунду.

Приложения

Нерегулярный Z-буфер может использоваться в любом приложении, требующем вычислений видимости в произвольных точках плоскости изображения. Было показано, что он особенно хорошо подходит для создания карт теней – алгоритма, работающего в пространстве изображения, для рендеринга жестких теней. Помимо рендеринга теней, потенциальные области применения включают адаптивный антиалиазинг, дрожащую выборку и отображение окружения.