Часть III / Лекция 21. Методы удаления невидимых линий
Метод z-буфера
Это один из простейших алгоритмов удаления невидимых поверхностей. Идея
z-буфера является простым обобщением идеи о буфере кадра. Буфер кадра
используется для запоминания атрибутов (интенсивности) каждого пиксела в
пространстве изображения, z-буфер это отдельный буфер глубины,
используемый для запоминания координаты z или глубины каждого видимого
пиксела в пространстве изображения. В процессе работы глубина или значение
z каждого нового пиксела, который нужно занести в буфер кадра,
сравнивается с глубиной того пиксела, который уже занесен в z-буфер. Если это
сравнение показывает, что новый пиксел расположен впереди пиксела, находящегося
в буфере кадра, то новый пиксел заносится в этот буфер и, кроме того,
производится корректировка z-буфера новым значением z. Если же сравнение
дает противоположный результат, то никаких действий не производится. По сути,
алгоритм является поиском по х и у наибольшего значения функции
z(x, у).
Главное преимущество алгоритма его простота. Кроме того, этот
алгоритм решает задачу об удалении невидимых поверхностей и делает тривиальной
визуализацию пересечений сложных поверхностей. Сцены могут быть любой
сложности.
Основной недостаток алгоритма большой объем требуемой памяти.
Дадим словесное описание алгоритма z-буфера.
- Заполнить буфер кадра фоном, а z-буфер памяти числом zmin.
- Преобразовать многогранник в растровую форму:
- ax + by + cz + d = 0 плоскость.
(x1, y1, z1) (x2, y2, z2) ... (xn, yn, zn) a = S(yi - yi+1) * (zi + zi+1) b = S(zi - zi+1) * (xi + xi+1) c = S(xi - xi+1) * (yi + yi+1)
- z = -(ax + by + d)/c. Выражаем изменение плоскости вдоль одной из осей.
z - z' = -(ax1 + d)/c + (ax + d)/c = a(x - x1)/c z1 = z - (a/c)Dx, но
Dx = 1, поэтому z1 = z - (a/c), где z1 новая
координата, а z старая координата.
- Вычислить для каждой точки (x, y) многоугольника значение z(x, y)
глубины нахождения в прямоугольнике.
- Сравнить полученное z с соответствующим zбуфера,
полученным по координатам в буфере.
- Если вычисленное z меньше zбуфера, то изображение
помещаем в буфер кадра, а zбуфера присваиваем z.
|