当查看包含不透明对象和曲面的图片时,无法从更靠近眼睛的对象后面的视图中看到这些对象。为了获得逼真的屏幕图像,必须去除这些隐藏表面。这些表面的识别和移除称为 隐藏的表面问题。
Z-buffer又称深度缓冲法,是常用的隐藏面检测方法之一。这是一个 图像空间法 .图像空间方法基于要在2D上绘制的像素。对于这些方法,运行时间复杂度是像素数乘以对象数。空间复杂度是像素数的两倍,因为需要两个像素阵列,一个用于帧缓冲区,另一个用于深度缓冲区。
Z缓冲区方法比较投影平面上每个像素位置的表面深度。通常z轴表示为深度。Z-buffer方法的算法如下所示:
算法:
First of all, initialize the depth of each pixel. i.e, d(i, j) = infinite (max length) Initialize the color value for each pixel as c(i, j) = background color for each polygon, do the following steps : for (each pixel in polygon's projection) { find depth i.e, z of polygon at (x, y) corresponding to pixel (i, j) if (z < d(i, j)) { d(i, j) = z; c(i, j) = color; } }
让我们考虑一个例子来更好地理解算法。假设给定的多边形如下所示:
在开始时,假设每个像素的深度是无限的。
由于z值,即给定多边形中每个位置的深度值为3,应用该算法后,结果为:
现在,让我们更改z值。在下图中,z值从0到3。
开始时,每个像素的深度将是无限的,如下所示:
现在,像素上生成的z值将不同,如下所示:
因此,在Z缓冲区方法中,每个曲面在整个曲面上一次单独处理一个位置。之后,比较深度值,即像素的z值,最近的(最小的z)表面确定要在帧缓冲区中显示的颜色。z值,即深度值通常被规范化为范围[0,1]。当z=0时,它被称为 后剪裁窗格 当z=1时,它被称为 前剪辑窗格 .
在这种方法中,使用了两个缓冲区:
- 帧缓冲区
- 深度缓冲区
深度计算: 我们知道平面的方程是:
ax + by + cz + d = 0, this implies z = -(ax + by + d)/c, c!=0
每个深度的计算可能非常昂贵,但通过使用下图所示的增量方法,可以将计算减少到每像素一次相加:
让我们把A点的深度表示为Z,B点的深度表示为Z。因此:
AX + BY + CZ + D = 0 implies Z = (-AX - BY - D)/C ------------(1) Similarly, Z' = (-A(X + 1) - BY -D)/C ----------(2) Hence from (1) and (2), we conclude : Z' = Z - A/C ------------(3)
因此,可以通过在(标准化的)观察坐标系中记录每个多边形的平面方程,然后使用增量方法找到深度Z来计算深度。 总之,可以说这种方法比较了投影平面上每个像素位置的表面深度。对象深度通常是从视图平面沿查看系统的z轴测量的。 例子:
设S1、S2、S3为曲面。离投影平面最近的曲面称为可见曲面。计算机会(任意地)启动surface 1并将其值放入缓冲区。它将对下一个曲面执行相同的操作。然后,它会检查每个重叠的像素,看看哪一个更接近观看者,然后显示适当的颜色。与视图平面位置(x,y)一样,曲面S1距离视图平面的深度最小,因此在该位置可见。
要记住的要点: 1) Z缓冲区方法不需要对多边形进行预排序。 2) 即使有许多多边形,这种方法也可以快速执行。 3) 这可以在硬件中实现,以克服速度问题。 4) 不需要进行对象到对象的比较。 5) 这种方法可以应用于非多边形对象。 6) 该算法的硬件实现在一些图形工作站上可用。 7) 该方法使用简单,不需要额外的数据结构。 8) 多边形的z值可以增量计算。 9) 不能应用于透明表面,即它只处理不透明表面。例如: 10) 如果只渲染场景中的几个对象,那么由于额外的缓冲区和更新缓冲区所涉及的开销,这种方法就不那么吸引人。 11) 绘制隐藏对象可能会浪费时间。