Данный алгоритм можно представить следующим образом:

for all pixels for all objects compare z

Одним из преимуществ этого метода является простота, универсальность (он может легко работать не только с полигональными моделями; возможно использование Constructive Solid Geometry) и возможность совмещения определения видимости с расчетом цвета пиксела.

10. Удаление невидимых линий и поверхностей Еще одним несомненным плюсом метода является большое количество методов оптимизации, позволяющих работать с сотнями тысяч граней и обеспечивающих временные затраты порядка O(Gogn), где С - общее количество пикселов па экране, а п - общее количество объектов в сцене. Более того, существуют методы, обеспечивающие практическую независимость временных затрат от количества объектов.

10.4.2. Метод z-буфера Одним из самых простых алгоритмов удаления невидимых граней и поверхностей является метод z-буфера (буфера глубины), где для каждого пиксела, как и в методе трассировки лучей, находится грань, ближайшая к нему вдоль направления проектирования, однако здесь циклы по пикселам и по объектам меняются местами: for all objects

for all covered pixels compare z

Поставим в соответствие каждому пикселу (jc, у) картинной плоскости кроме цвета с(х, у), хранящегося в видеопамяти, его расстояние до картинной плоскости вдоль направления проектирования z(x, у) (его глубину).

Массив глубин инициализируется +оо.

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

int * zBuf = NULL; // z-buffer, for 32-bit models
void initZBuf () {
zBuf = (int *)malloc (SCREEN_WIDTH*SCREEN_HEIGHT*
sizeof(int));
int * ptr = zBuf;
for (int i = 0; i < SCREEN_WIDTH * SCREENJHEIGHT; i++ )
* ptr++ = MAXINT;
}

void writePixel (int x, int у ,int z, int с )

{
int * ptr = zBuf + x + y*SCREEN_WIDTH;

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