画家算法的缺点:深度排序计算量大,排序后还需要计算相邻面才能确保在深度优先级表中前者在前,后者在后。若遇到多边形相交或多边形循环重叠的情形,还必须分割多边形。
z-buffer算法可以避免以上复杂的运算。
帧缓冲区:存放每个像素的颜色值,初值可放对应背景颜色的值。
深度缓存:存放每个像素的深度值,初值取z的极小值。
算法思想:
图形消隐的过程就是给帧缓冲区和z缓冲区相应单元填值的过程。在把显示对象的每个面上的每个点的颜色填入帧缓冲区之前,先把这点的z值和z缓冲区相应单元的值进行比较,如果前者更大就改变帧缓冲区中的值,并且z缓冲区相应单元的值也要改成这点的z坐标。如果这点的z更小,说明对应像素已经显示了对象上一个点的属性,该点要比考虑的点更接近视点。
算法伪代码:
z-buffer()
{
帧缓存全部置为背景色
z缓冲区全部取z最小值
for(多边形每个面)
{
扫描转换该多边形
for(该多边形覆盖的每个像素(x,y) )
{
计算该像素的深度值z(x,y)
if(该深度值大于z缓冲区中(x,y)的深度值)
把z(x,y)存入z缓存中(x,y)处
把多边形(x,y)处颜色值存入帧缓存的(x,y)处
}
}
}
算法优点:在像素级上以近物取代远物,形体在屏幕上的出现顺序无关紧要。这种方法显然比总体排序灵活,利于硬件实现。
算法缺点:没有利用图形的相关性和连续性,占用空间大,需要开一个和图像大小相等的缓存数组。
算法改进:
z-buffer()
{
帧缓存置为背景色
for(屏幕上每个像素(i,j) )
{
深度缓存变量zb置最小值MinValue
for(多面体上的每个多边形P(k) )
{
if(像素(i,j)在P(k)的投影多边形之内)
{
计算Pk在(i,j)的深度值depth
if(depth>zb)
{
zb=depth
indexp=k
}
}
}
if(zb!=MinValue)
计算多边形P(indexp)在交点(i,j)处的光照颜色并显示。
}
}