Листинг 8.1. Инкрементные вычисления глубины for(int у - ybott: у <- ytop: у++) // for each scan-line // для каждой строки развертки {
find xleft and xright II находим xleft и xright
find dleft and dright. and dinc II находим dleft. dright и dinc
find colorleft and colorright. and colorinc II находим colorleft. colorright и colorinc
for (int x - xleft. с - colorleft. d - dleft: x <- xright: x++. c+-colorinc, d+= dinc) if(d < d[x][y]) {
put с into the pixel at (x. y) II помещаем цвет с в пиксел (х. у)
d[x][y] - d: // update the closest depth // обновляем ближайшую глубину }
}
8.4. Удаление невидимых поверхностей В листинге 8.1 показаны почти тривиальные дополнения к алгоритму плиточника с закраской Гуро, предназначенные для удаления невидимых поверхностей. Значения псевдоглубин diek и rfright вычисляются (инкрементно) для каждой строки развертки наряду со значением dinc, которое используется в самом внутреннем цикле. Для каждого пиксела находится псевдоглубина d, производится одно сравнение, после чего элемент обновляется - в случае, если обнаружилось, что текущая грань является ближайшей к наблюдателю.
Сокращение глубины для больших расстояний Напомним из примера 7.4.4, что псевдоглубина точки не имеет линейной зависимости от истинной глубины этой точки (расстояния до глаза), а вместо этого приближается к некоторой асимптоте. Это означает, что при больших глубинах малые изменения истинной глубины преобразуются в чрезвычайно малые изменения псевдоглубины. Поскольку для представления псевдоглубины используется только ограниченное количество бит, то два близких значения глубины могут с легкостью превратиться в одно и то же значение, что может привести к ошибкам при операции сравнения d<d[x][y]. Использование большего количества бит для представления псевдоглубины помогает, однако требует больше памяти. Может помочь также размещение ближней плоскости как можно дальше от глаза.
OpenGL поддерживает буфер глубины и использует для удаления невидимых поверхностей алгоритм, приведенный в листинге 8.1. Следует указать OpenGL на необходимость создания буфера глубины в момент инициализации режима дисплея. Это делается посредством команды: