场景中有很多物体,要把他们放到屏幕上,自然涉及到顺序的问题,那么先放什么后放什么才能让画面看起来是对的呢?

很自然就能想到先画远的,再画近的覆盖掉远处的物体。从远到近就能把正确的结果画出来,这也是以前油画画家的画法。

Painter’s Algorithm

我们先对远处物体做光栅化,再对近处的物体慢慢处理完即可,这种算法叫画家算法

画油画,可以先画远处的山,再画地面,再画树。

画立方体,也可以先画最远的面,再画周围四个面,再画最前面的面。

但画立方体周围四个面时也需要顺序,我觉得周围四个面距离我都差不多,那么顺序怎么定呢?我们想要定义深度其实不容易。

Untitled

画家算法可以按照深度从远到近排序,需要 $O(nlogn)$ 的排序时间复杂度。

但有一种情况比较特别,下面三个三角形如何判断哪个三角形在前哪个三角形在后呢?

三角形两两覆盖,互相遮挡,就没办法定义其深度关系,就无法按照画家算法排序。

Untitled

因此图形学引入了一个概念——Z-Buffer(深度缓冲)。

Z-Buffer

既然空间中三角形不好排远近顺序,但我对像素来说挺容易分析的。每个像素在像素内永远记录像素所表示的几何的最浅的深度。

我们渲染出成品的图像的同时,也会生成另一个图像,只存每个像素记录的对应几何最浅深度的信息,这个图叫做深度图、深度缓存。再利用深度缓存来维护遮挡信息。

也就是说,我们需要两个缓冲:

前面我们的相机放在原点往 $-z$ 方向看,这样我们看到所有的 $z$ 都是负的,数字小反而离我们远。那么为了简化计算,我们认为 $z$ 是这个点到摄像机的距离,永远是正的,越小越近。