Z缓冲区或深度缓冲区方法

当查看包含不透明对象和曲面的图片时,无法从更靠近眼睛的对象后面的视图中看到这些对象。为了获得逼真的屏幕图像,必须去除这些隐藏表面。这些表面的识别和移除称为 隐藏的表面问题。

null

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;
    }
}

让我们考虑一个例子来更好地理解算法。假设给定的多边形如下所示: 图片[1]-Z缓冲区或深度缓冲区方法-yiteyi-C++库

在开始时,假设每个像素的深度是无限的。 图片[2]-Z缓冲区或深度缓冲区方法-yiteyi-C++库

由于z值,即给定多边形中每个位置的深度值为3,应用该算法后,结果为: 图片[3]-Z缓冲区或深度缓冲区方法-yiteyi-C++库

现在,让我们更改z值。在下图中,z值从0到3。 图片[4]-Z缓冲区或深度缓冲区方法-yiteyi-C++库

开始时,每个像素的深度将是无限的,如下所示: 图片[5]-Z缓冲区或深度缓冲区方法-yiteyi-C++库

现在,像素上生成的z值将不同,如下所示: 图片[6]-Z缓冲区或深度缓冲区方法-yiteyi-C++库

因此,在Z缓冲区方法中,每个曲面在整个曲面上一次单独处理一个位置。之后,比较深度值,即像素的z值,最近的(最小的z)表面确定要在帧缓冲区中显示的颜色。z值,即深度值通常被规范化为范围[0,1]。当z=0时,它被称为 后剪裁窗格 当z=1时,它被称为 前剪辑窗格 .

在这种方法中,使用了两个缓冲区:

  1. 帧缓冲区
  2. 深度缓冲区

深度计算: 我们知道平面的方程是:

ax + by + cz + d = 0, this implies 

z = -(ax + by + d)/c, c!=0

每个深度的计算可能非常昂贵,但通过使用下图所示的增量方法,可以将计算减少到每像素一次相加: 图片[7]-Z缓冲区或深度缓冲区方法-yiteyi-C++库

让我们把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轴测量的。 例子: 图片[8]-Z缓冲区或深度缓冲区方法-yiteyi-C++库

设S1、S2、S3为曲面。离投影平面最近的曲面称为可见曲面。计算机会(任意地)启动surface 1并将其值放入缓冲区。它将对下一个曲面执行相同的操作。然后,它会检查每个重叠的像素,看看哪一个更接近观看者,然后显示适当的颜色。与视图平面位置(x,y)一样,曲面S1距离视图平面的深度最小,因此在该位置可见。

要记住的要点: 1) Z缓冲区方法不需要对多边形进行预排序。 2) 即使有许多多边形,这种方法也可以快速执行。 3) 这可以在硬件中实现,以克服速度问题。 4) 不需要进行对象到对象的比较。 5) 这种方法可以应用于非多边形对象。 6) 该算法的硬件实现在一些图形工作站上可用。 7) 该方法使用简单,不需要额外的数据结构。 8) 多边形的z值可以增量计算。 9) 不能应用于透明表面,即它只处理不透明表面。例如: 图片[9]-Z缓冲区或深度缓冲区方法-yiteyi-C++库 10) 如果只渲染场景中的几个对象,那么由于额外的缓冲区和更新缓冲区所涉及的开销,这种方法就不那么吸引人。 11) 绘制隐藏对象可能会浪费时间。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享