exam32 - MiAneko24/bmstu-cg GitHub Wiki

32. Алгоритм, использующий Z буфер.

  • Это один из простейших алгоритмов удаления невидимых поверхностей.
  • Работает в пространстве изображений.
  • В этом алгоритме используется идея о буффере кадра.

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

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

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

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

Многоугольник описывается уравнением: Ax + By + Cz + D = D, отсюда получаем:
z = -(Ax + By + D) / C При с = 0 - многоугольник для наблюдателя вырождается в линию.
Ясно, что для сканирующей строки y = const. Поэтому, можем рекуретно считать z' для каждого х' = x + dx.

z' - z = -(ax' + d) / c + (ax + d) / c = a(x - x') / c, откуда z' = z - (a / c), потому что (x - x') = dx = 1 (единичый шаг растра)

Глубина пикселя, являющегося пересечением сканирующей строки с ребром многоугольника

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

Глубину определяют по соотношению:

z3 = z2 + (y3 - y2) / (y2 - y1) * (z2 - z1), где

  • (y1, z1), (y2, z2) - координаты вершин проекции ребра на плоскость YOZ.
  • (x3, z3) - координаты проекции точки пересечения на ту же плоскость.

Оценка эффективности

Плюсы:

  • Сцены могут быть произвольной сложности.
  • Не нужна сортировка, как в других алгоритмах.
  • Трудоемкость линейно зависит от числа рассматриваемых поверхностей

Недостатки:

  • Большой объем памяти (под буфферы).
  • Трудоемкость устранения лестничного эффекта.
  • Трудность реализации эффектов прозрачности.

Псевдокод (алгоритм)

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

Для невыпуклых многогранников, предварительно надо удалить нелицевые грани.

Алгоритм так же можно применять для построения сечений поверхностей, в таком случае изменится только операция сравнения:
1

Следующий вопрос: 33. Алгоритм, использующий список приоритетов.

Предыдущий вопрос: 31. Алгоритм Вейлера Азертона удаления невидимых линий и поверхностей.