一、前言
通过光栅化我们知道,模型的三角形最终都被画在了屏幕上成为了像素,那么真实的场景往往有许多模型,也就是有很多三角形需要被画在屏幕上,这么多的三角形如何正确的判断它们的遮挡关系,从而把离我们摄像机最近的三角形画出来是一个问题,而解决这个问题的方法就是我们今天要讲的Z-Buffer,中文名深度缓存/缓冲。
二、画家算法
场景中有很多的物体,我们可以由远到近的一一把他们画在画布上来实现遮挡关系。例如:先画远处的山,再画地面,再画树。而此算法被称为画家算法。
那如果碰到如下图这种情况怎么办?
显然,画家算法并不能解决这种复杂的遮挡关系,而且对顺序有着很直观印象的要求,这种要求无法让计算机理解。所以人们采取了新方案,也就是Z-Buffer。
三、Z-Buffer
基本思想:
在渲染的过程中,同时生成渲染结果和一张深度图,其中深度图用来储存该像素上深度值最小的深度信息,在之后根据后续的深度结果决定是否更新该像素的深度值。
简单的说,就是在一个像素内,先默认深度为无限远,然后随着不断渲染,判断新的深度值和储存在其中的深度值的大小关系,如果新的深度小于存储的深度,那么就更新为新的深度,否则不更新,这样就可以确保该像素的深度值始终是正确的,距离摄像机最近的。
我们曾经规定过,相机始终是放在原点,朝向-z方向,那么此时我们就可以认为,z坐标的绝对值表示的就是深度的大小,z的绝对值越大说明深度越大,该点离我们越远,反之则越近。
渲染结果(左)和深度缓存得到的深度图(右)
深度缓存算法伪码
深度缓存的工作流程图示:
(R表示深度值为无限大)一个红色三角形被光栅化,紧接着一个蓝色三角形被光栅化,其中由深度缓存得出的遮挡关系发生的变化。
深度缓存算法复杂度:
深度缓存算法复杂度为O(n),我们并没有做排序求遮挡关系,只是始终在求最小深度所以不是O(nlogn)
参考:
Lecture 07 Shading 1 (Illumination, Shading and Graphics Pipeline)_哔哩哔哩_bilibili