大家好,今天我们来聊聊图形渲染中的深度。深度,咋一看,蛮抽象的一个概念,但实际却处处存在于我们生活中。比如现在很火的无人驾驶激光雷达的定位,深度相机感知,以及各种传感器深度测量等,都与深度相关。同样的,在图形渲染中,深度的应用也很广。首先,我们看看图形渲染中一个常见的现象,在我们显示CAD模型时,很多时候需要同时显示面和边。这个时候,我们经常会发现边的显示是断断续续的,显示不完整。如下图所示:
这种显示效果是很糟糕的,我们称这种现象叫着Z-Fighting。Z-Fighting顾名思义就是指边和面的z坐标之间互相冲突了,造成这种现象的主要原因是因为面和边离得很近,两者的深度值很接近,正常的深度剔除没办法保证绘制的前后顺序。接下来我们就来讲讲为什么会这样,以及在开发时,怎样避免这种问题。
1. 深度值计算
在讲深度值之前,我们先回顾一下深度值是怎么使用的。上一篇我们在讲透明渲染时也提到过。OpenGL渲染时有个深度缓冲区,在进行绘制每个对象时,对于光栅化后的对象像素,计算每个像素的深度,大于缓冲区深度的像素不绘制,小于深度缓冲区的像素才进行绘制,并把当前深度值写入到缓冲区中。
世界坐标系中的点,经过模型变换,视图变换、投影变换等最终转换成NDC坐标中的点,NDC坐标系中点的z值就是我们