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-буфера рабдтает исключительно в пространстве картинной плоскости и не требует никакой предварительной обработки данных. Порядок, в котором грани выводятся на экран, не играет никакой роли.