Z-Buffer 深度缓存

Painter's Algorithm 画家算法

起源于油画绘制方式,从后往前,依次覆盖后面的物体

需要对不同深度的物体进行分类来确定面与面的绘制顺序,复杂度为$O(n\log n)$,其中n为三角形的个数,也存在一个无法解决的问题,不能处理无法确定绘制顺序的物体,例如下图互相遮挡的情况

Z-Buffer

主要思想

  1. 对于每一个采样点或像素存储一个最小的z值(深度值)
  2. 存储方式与frame buffer存储颜色值的方式相同,在depth buffer里存储深度值

出于简化考虑,我们通常认为z值始终是正数,这意味着越小的值代表采样点或像素距离相机越近,越大的值则代表距离越远

Z-Buffer会在生成渲染图的同时根据各采样点(像素)的深度值生成深度图,颜色越深代表距离越近,越浅则越远

算法

初始化depth buffer的所有值为$\infty$

在光栅化的流程中增加如下伪代码流程

1
2
3
4
5
6
7
for (each triangle T)
    for(each sample(x,y,z)in T) //循环每一个采样点,深度值在采样时确定
        if(z<zbuffer[x,y])   //判断深度值大小,确定远近
            framebuffer[x,y]=rgb; //更新颜色值
            zbuffer[x,y]=z;  //更新深度值
        else
            ; //什么都不做,因为采样流程已经完成

整体算法流程会形成如下图效果,复杂度为O(n),n为三角形面的数量