学过画画的同学也许会有体会:先画背景再画前景(画家算法)。在渲染过程中,同样也面临着同样的问题:物体间有一定的绘制顺序,有的可见,有的被其他物体阻挡。
那么我们如何进行排序呢?既然绘制的都是三角面,那么可不可以对三角形排序,再绘制呢?很可惜,在某些情况下不适用:
如上图的情况,显然无论按什么顺序画三角形,都不能正确输出遮蔽关系,所以我们排序的最小单位不能是三角面,而是像素点。
深度缓冲(Z-Buffer)
为了正确绘制遮蔽关系,我们需要对每个三角形在屏幕的每个像素进行排序:通过计算像素点在每个三角面变换坐标的z值取最小(近处物体遮挡远处),得到该像素点可视的三角面。在实现上,需要记录每个像素点的深度(z-value)(depth buffer)和对应的颜色(来自三角面的颜色)(frame buffer)。
可视化算法如下图(红蓝2个三角面的像素点进行深度排序)
如果给 Z-Buffer的值归一到 [0, 1] 可以得到下图右侧的图像