Для реализации этого алгоритма требуется не только буфер регенерации, но еще и
буфер глубины, z-буфер, в который помещается информация о координате z для
каждого писксела. Вначале в z-буфер заносятся значения большие максимально
возможного значения z, а буфер регенерации заполняется значениями пткселов,
описывающими фон. Затем каждый многоугольник преобразуется в растровую формуи
записывается в буфер регенерации. При разложении в растр для каждой точки
многоугольника выполняются следующие шаги:
Вычисление глубины многоугольника z(x,y) в точке (x,y)
Если z(x, y) меньше, чем значение z-буфера в позиции (x, y), то
z(x, y) заносятся в элемент (x, y) z-буфера и
значение пиксела, которое имеет многоугольник в рассматриваемой точке,
помещается в элемент (x,y) буфера регенерации.
Если условие на шаге 2 выполняется, считается, что точка многоугольника
расположена ближе к наблюдателю, чем точка, значение яркости которой находилось
в позиции (x, y) буфера регенерации. Поэтому записываются новые значения глубины
и яркости.
Главным недостатком этого алгоритма является требование большого объема памяти
под z-буфер. Однако реализация алгоритма очень проста. Эксплуатационные остаются
почти все время почти постоянными, поскольку в среднем с ростом числа
многоугольников в видимом объеме уменьшается число пикселов, покрываемых одним
многоугольником. Поэтому средний размер каждого множества пар, среди которых
производится поиск, практически постоянен.
Пусть некоторый треугольник построчно преобразуется в растровую форму.
Вычисление координаты z для каждой точки сканирующей строки модно упростить,
воспользовавшись тем, что многоугольник плоский, то есть z линейна относительно
x и y. Если плоскость многоугольника описывается уравнением:
A*x + B*y + C*z + D = 0,
из которого легко выражается z:
z= -(D + A*x + B*y)/C,
теперь, если в точке (x, y), z=z0, то в точке
(x + dx, y), zx = z0-A/C*d x и, соответственно, в точке
(x, y + dy) zy = z0-B/C*d y, если учесть, что d x=1 и d y=1, выражения
упрощаются и остаются постоянные члены для данного многоугольника. Таким
образом, зная глубину в одной точке, легко вычислить глубины в каждой следующей,
выполнив лишь одно вычитание.
Написал Вася Пупкин.