32. Алгоритм, использующий Z буфер. - p1xelse/CG GitHub Wiki

Один из простейших алгоритмов удаления невидимых поверхностей, который работает в пространстве изображения.

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

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

Примечание. В качестве предварительного шага, там где это целесообразно добавить этап удаления нелицевых граней (см. алгоритм Робертса)

Предварительно для выпуклых многогранников целесообразно удалить нелицевые грани.

Достоинства

  1. Простота. Сцены могут быть любой сложности
  2. Элементы сцены не нужно сортировать
  3. фиксированный размер окна - линейный рост времени работы алгоритма

Недостатки

  1. Большой объём памяти
  2. Трудоёмкость устранения лестничного эффекта (префильтрация..... сложно). возможна постфильтрация (усреднение подпикселов) - считаем в изображении с более высокой разрешающей способностью, потом усредняем.
  3. Трудоёмкость реализации эффектов прозрачности и просвечивания

вычисление глубины z

Уравнение плоскости, несущей каждый многоугольник: Ах+Ву+Сz+D=0

, при с!=0. Если с=0 то плоскость многоугольника параллельна оси Z (Для наблюдателя такой многоугольник вырождается в линию)

для скан-строки y=const. Поэтому глубина пиксела на этой строке, у которого x1=x+deltaX, равна:

или

Но deltaX = 1 (единичный шаг растра), и получим:

Алгоритм:

  1. Заполнение буфера кадра фоновый значением интенсивности (цвета).
  2. Заполнение Z - буфера минимальным значением Z.
  3. Преобразование каждого многоугольника в растровую форму в произвольном порядке
  4. Вычисление для каждого пикселя с координатами (x, y), принадлежащего многоугольнику, его глубины Z(x, y).
  5. Сравнение глубины Z(x, y) со значением Zбуф(x, y), хранящимся в Z-буфере для пикселя теми же координатами(x, y). Если Z(x, y)>Zбуф(x, y), то записать атрибут очередного многоугольника в буфер кадра и Zбуф(x, y) заменить на значение Z(x, y).

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

Z(x,y) > Zbuf(x,y) && Z(x,y) <= Zразр(сеч), где Zразр(сеч) - глубина искомого разреза(сечения.

Примечание. Для построения прозрачных поверхностей можно применять модифицированный вариант Z - буфера ALFA -буфер. Если рассматриваются монохромные, почти прозрачные поверхности, то в этом случае достаточно наряду о Z - буфером иметь ещё один буфер с информацией о текущей интенсивности пикселя.