1 Предположим, что грань Л в данном пикселе имеет глубину 0,89485 и тест указывает на нее как на ближайшую грань, однако в массиве depth[][] эта глубина округляется до 0,895. Позднее в этом пикселе обнаруживается грань В с глубиной 0,89492 и при сравнении этой глубины с величиной 0,895 грань В тестируется как более близкая и рисуется, что совершенно неправильно!

13.3. HSR-методы со списками приоритетов В рамках данного раздела мы рассмотрим следующие три алгоритма: О «Алгоритм беспечного художника» («heedless painter's aIgorithm») - несложный, но не без изъянов: в нем просто рисуются целые грани в порядке от дальних к ближним.

О «Алгоритм дерева двоичного разбиения пространства» («Ыпагу-space partition tree a!gorithm») элегантен и эффективен, однако требует предварительного этапа построения дерева граней. Однако одно и то же дерево можно использовать многократно при рисовании сцены с различных точек зрения - например, при анимации, когда камера перемещается по неподвижной сцене.

О Алгоритм сортировки по глубине, который является классическим HSR-методом на базе сортировки массива faces [] с добавлением комплексного тестирования для устранения недостатков алгоритма художника.

13.3.1. Алгоритм беспечного художника Первая попытка создать альтернативу применению буфера глубины очень проста, однако часто выдает неправильные изображения, - такие, как на рис. 13.1! Каждая грань объекта поочередно закрашивается целиком. Такой подход является одной из форм алгоритма художника (painter's algorithm): при рисовании каждой грани в буфере кадров ее цвет перекрывает тот, который был здесь ранее; так художник накладывает новые слои краски на старые. В этом случае цвет каждого пиксела - это самый последний нарисованный цвет, и если две грани перекрываются по х и по у, то грань, нарисованная последней, перекроет предыдущую грань, даже если она не находится ближе.

Для того чтобы у данного метода был хотя бы шанс нарисовать сцену правильно, мы используем поле extent.far массива face для записи того, какая грань имеет наиболее удаленную вершину, затем следующую по удаленности и т. д. Массив faces[] сортируется по признаку extent, far, после чего грани рисуются в буфер кадров, начиная с самой удаленной и заканчивая самой ближней. Скелет этого алгоритма выглядит следующим образом:


⇐ Предыдущая| |Следующая ⇒