现代计算机图形学

深度缓存(Z-Buffer)

前言

​ 当我们完成了场景中所有三角形的光栅化,下一步就是将他们正确的绘制在屏幕空间上,此时就需要正确处理他们的遮挡关系。

​ 我们可以先试想一种最简单的绘制方法:像画油画一样,先绘制最远处的三角形,然后由远到进依次绘制所有的三角形,后面绘制的三角形会覆盖前面绘制的三角形,从而得到一张遮挡关系正确的图像。

image-20231008154609489

由远及近依次绘制,能得到正确的遮挡关系

​ 但是此时存在一种特殊情况:当3个三角形两两相互遮挡,其整体形成一个环,如果此时依旧使用简单的绘制方法,就无法正确解析出各三角形的深度关系。

image-20231008155423909

存在无法解析深度的情况

​ 为了解决场景中三角环的深度解析问题,使其能够正确绘制在屏幕上,就有了今天所讲的 深度解析(Z-Buffer).

具体思路

方法

​ 深度缓存(Z-Buffer)算法对每个像素的远近进行排序,每个像素都记录当其能够表示的 最浅的深度(min z-value)

​ 要执行深度缓存算法需要生成两个图像:

  • 生成成品图像,其保存着图像的色彩信息(frame buffer)
  • 生成一个只存储每个像素深浅信息的图像(depth buffer)

(注:Z-Buffer中规定,深度为 点到摄像机的距离 且其永远为正,这点与变换中的概念不行同)

image-20231008164627679

Z-Buffer 样例

伪代码

1
2
3
4
5
6
7
8
9
10
// Initialize depth buffer to ∞
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
// do nothing
;