32. Алгоритм, использующий Z буфер. - chrislvt/CG GitHub Wiki
Один из простейших алгоритмов удаления невидимых поверхностей, который работает в пространстве изображения.
Буфер кадра (регенерации) используется для заполнения атрибутов (интенсивности) каждого пикселя в пространстве изображения. Для него требуется буфер регенерации, в котором запоминаются значения яркости, а также Z-буфер (буфер глубины), куда можно помещать информацию о координате z для каждого пикселя. Вначале в Z-буфер заносятся минимально возможные значения z, а буфер регенерации заполняется значениями пикселя, описывающими фон. Затем каждый многоугольник преобразуется в растровую форму и записывается в буфер регенерации, при этом не производится начального упорядочения.
В процессе работы глубина (значение координаты Z ) каждого нового пикселя, который надо занести в буфер кадра, сравнивается с глубиной того пикселя, который уже занесён в Z -буфер. Если это сравнение показывает, что новый пиксель расположен ближе к наблюдателю, чем пиксель, уже находящийся в буфере кадра, то новый пиксель заносится в буфер кадра. Кроме того, производится корректировка Z-буфера: в него заносится глубина нового пикселя. Если же глубина (значение координаты Z ) нового пикселя меньше глубины хранящегося в буфере, то никаких действий производить не надо.
Примечание. В качестве предварительного шага, там где это целесообразно добавить этап удаления нелицевых граней (см. алгоритм Робертса)
Предварительно для выпуклых многогранников целесообразно удалить нелицевые грани.
Достоинства
- Простота. Сцены могут быть любой сложности
- Элементы сцены не нужно сортировать
- фиксированный размер окна - линейный рост времени работы алгоритма
Недостатки
- Большой объём памяти
- Трудоёмкость устранения лестничного эффекта (префильтрация..... сложно). возможна постфильтрация (усреднение подпикселов) - считаем в изображении с более высокой разрешающей способностью, потом усредняем.
- Трудоёмкость реализации эффектов прозрачности и просвечивания
вычисление глубины z
Уравнение плоскости, несущей каждый многоугольник: Ах+Ву+Сz+D=0
, при с!=0. Если с=0 то плоскость многоугольника параллельна оси Z (Для наблюдателя такой многоугольник вырождается в линию)
для скан-строки y=const. Поэтому глубина пиксела на этой строке, у которого x1=x+deltaX, равна:
или
Но deltaX = 1 (единичный шаг растра), и получим:
Алгоритм:
- Заполнение буфера кадра фоновый значением интенсивности (цвета).
- Заполнение Z - буфера минимальным значением Z.
- Преобразование каждого многоугольника в растровую форму в произвольном порядке
- Вычисление для каждого пикселя с координатами (x, y), принадлежащего многоугольнику, его глубины Z(x, y).
- Сравнение глубины 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 - буфером иметь ещё один буфер с информацией о текущей интенсивности пикселя.