На этом шаге мы рассмотрим различные реализации этого метода.
Здесь мы будем рассматривать поверхности в виде многогранников или полигональных сеток. Известны такие методы показа с удалением невидимых точек: сортировка граней по глубине, метод плавающего горизонта, метод Z-буфера [1, 2].
Сортировка граней по глубине. Это означает рисование полигонов граней в порядке от самых дальних к самым близким. Этот метод не является универсальным, ибо иногда нельзя четко различить, какая грань ближе (рисунок 1).
Рис.1. В каком порядке рисовать эти грани?
Известны модификации этого метода, которые позволяют корректно рисовать такие грани, они описаны в [1]. Метод сортировки по глубине эффективен для показа поверхностей, заданных функциями z=f(x, y) (рисунок 2).
Рис.2. Эта поверхность нарисована четырехугольными гранями
Метод плавающего горизонта. В отличие от предыдущего метода при методе плавающего горизонта грани выводятся в последовательности от ближайших к самым дальним. На каждом шаге границы граней образовывают две ломаные линии - верхний горизонт и нижний горизонт. Во время вывода каждой новой грани рисуется только то, что выше верхнего горизонта, и то, что ниже нижнего горизонта. Соответственно, каждая новая грань поднимает верхний и опускает нижний горизонты. Этот метод часто используют для показа поверхностей, которые описываются функциями z=f(x, y).
Метод Z-буфера. Метод основывается на использовании дополнительного массива, буфера в памяти, в котором сохраняются координаты Z для каждого пикселя растра. Координата Z отвечает расстоянию точек пространственных объектов до плоскости проецирования. Например, она может быть экранной координатой Z в системе экранных координат (X, Y, Z), если Z перпендикулярна плоскости экрана.
Рассмотрим алгоритм рисования объектов согласно этому методу. Пусть, чем ближе точка в пространстве к плоскости проецирования, тем больше значение Z. Тогда сначала Z-буфера заполняется минимальными значениями. Потом начинается вывод всех объектов. Причем не имеет значение порядок вывода объектов. Для каждого объекта выводятся все его пиксели в любом порядке. Во время вывода каждого пикселя по его координатам (X, Y) находится текущее значение Z и Z-буфере. Если рисуемый пиксель имеет большее значение Z, чем значение в Z-буфере, то это означает, что эта точка ближе к объекту. В этом случае пикселm действительно рисуется, а его Z-координата записывается в Z-буфер. Таким образом, после рисования всех пикселей всех объектов растровое изображение будет состоять из пикселей, которые соответствуют точкам объектов с самыми большими значениями координат Z, то есть (видимые точки - ближе всех к нам).
Этот метод прост и эффективен благодаря тому, что не нужно ни сортировать объекты, ни сортировать их точки. При рисовании объектов, которые описываются многогранниками или полигональными сетками, манипуляции со значениями Z-буфера легко совместить с выводом пикселей заполнения полигонов плоских граней.
В настоящее время метод Z-буфера используется во многих графических 3D акселераторах, которые аппаратно реализуют этот метод.
Наиболее целесообразно, когда акселератор имеет собственную память для Z-буфера, доступ к которой осуществляется быстрее, чем к оперативной памяти компьютере. Возможности аппаратной реализации используются разработчиками и пользователями компьютерной анимации, позволяя достичь большой скорости прорисовки кадров.
Со следующего шага мы начнем рассматривать закрашивание поверхностей.