![]() 扫描线Z-buffer算法() { 1) 对每个多边形求取其顶点中所含的y的最小值ymin和最大值ymax,按ymin进行排序,将多边形置入多边形y桶; 2) 活化多边形表APT,活化边表AET初始化为空; 3) For(每条扫描线i,i从小到大) { (1) 帧缓存CB置为背景色; (2) 深度缓存ZB置为负无穷大(因为视方向为Z轴的负方向); (3) 将多边形y桶中对应扫描线i的新的多边形加入到活化多边形表APT中; (4) 对新加入的多边形,生成其相应的边Y桶; (5) 对APT中每一个多边形,若其边Y桶中对应扫描线i增加了新的边,则将新的边配对,加到活化边对表AET中; (6) for(AET中的每一对边) { for (每一个满足xl <j < xr的象素j) { d = z +Δzl; //深度depth if (d > ZB(i,j)) { ZB(i,j) =d; 计算当前象素点的颜色值c; 写帧缓存CB(i,j)=c; } } } (7) 删除APT中多边形顶点最大y坐标为i的多边形,并删除相应的边; (8) for (活化边表AET中的每一个边对) { if (ylmax=i && yrmax=i) 删除ylmax和yrmax已等于i的边对; else if (ylmax或yrmax 已等于i) { 删除ylmax或yrmax 已等于i的边; 对该多边形的边重新配对; } //用增量公式计算新的xl 、xr 和zl 。 xl=xl+Δxl; xr=xr+Δxr; zl=zl+Δxl Δzl +Δz ; } } } |