z-buffer算法

画家算法的缺点:深度排序计算量大,排序后还需要计算相邻面才能确保在深度优先级表中前者在前,后者在后。若遇到多边形相交或多边形循环重叠的情形,还必须分割多边形。

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)处的光照颜色并显示。
    }
}
  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值