if (* ptr > z ) {

* ptr = z; putpixel (x, у, с );

}
>

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

Грань рисуется последовательно строка за строкой; для нахождения необходимых значений используется линейная интерполяция (рис. 10.24)

Компьютерная графика. Полигональные модели

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

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

Х2 -X! '

Каждое такое число можно разбить на две части - целую и дробную:

что ггозволяет представлять его как два целых числа, одно из которых - целая часть числа, а другое - дробная часть, умноженная на знаменатель х2 -X]. Число, соответствующее дробной части, всегда находится в диапазоне между О и х2 - Х\ - 1.

При сложении двух таких чисел их целые и дробные части складываются отдельно. Если дробная часть выходит из диапазона, то проводится коррекция целой и дробной частей.

И) // draw a single line

zf = 0; // fractional part of current z
dx = x2 - x1;
dz = ( z2 - z1 ) / dx;
dzf = ( z2 - z1 ) % dx;

ptr = Zbuf + у * SCREENWIDTH + x1;

for (int x = x1; x <= x2; x++, ptr++ )
{

10. Удаление невидимых линий и поверхностей

if ( z < * ptr)
{

putpixel ( х, у, с ); * ptr = z;

}
z += dz; zf += dzf; if ( zf >= dx ) {
z++; zf -= dx;
}
eise
if ( zf < 0 ) {
z~;
zf += dx;
}
}

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

Метод z-буфера рабдтает исключительно в пространстве картинной плоскости и не требует никакой предварительной обработки данных. Порядок, в котором грани выводятся на экран, не играет никакой роли.


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