深度缓冲区 (Direct3D 9)

深度缓冲区(通常称为 z 缓冲区或 w 缓冲区)是存储 Direct3D 要使用的深度信息的设备的一个属性。 当 Direct3D 将场景呈现到目标图面时,它可以将关联的深度缓冲区图面中的内存用作工作区,以确定光栅化多边形的像素如何相互遮挡。 Direct3D 使用屏幕外 Direct3D 图面作为写入最终颜色值的目标。 与呈现目标图面关联的深度缓冲区图面用于存储深度信息,告知 Direct3D 每个可见像素在场景中的深度。

在启用深度缓冲的情况下对场景进行光栅化时,将测试呈现图面上的每个点。 深度缓冲区中的值可以是点的 z 坐标或其同质 w 坐标 - 从投影空间中的点 (x,y,z,w) 位置。 使用 z 值的深度缓冲区通常称为 z 缓冲区,使用 w 值的深度缓冲区称为 w 缓冲区。 每种深度缓冲区都有优点和缺点,稍后将对此进行讨论。

在测试开始时,深度缓冲区中的深度值设置为场景的最大可能值。 呈现图面的颜色值设置为背景色值或该点背景纹理的颜色值。 测试场景中的每个多边形是否与呈现图面上的当前坐标(x,y)相交。 如果确实存在,深度值(即 z 缓冲区中的 z 坐标)和 w 坐标在当前点进行测试,以确定其是否小于深度缓冲区中存储的深度值。 如果多边形值的深度较小,它将存储在深度缓冲区中,并且多边形的颜色值将写入呈现图面上的当前点。 如果此时多边形的深度值较大,则测试列表中的下一个多边形。 下图显示了此过程。

注意

尽管大多数应用程序不使用此功能,但你可以更改 Direct3D 用于确定哪些值放置在深度缓冲区和随后呈现目标图面中的比较。 为此,请更改D3DRS_ZFUNC呈现状态的值。 在某些硬件上,更改比较函数可能会禁用分层 z 测试。

 

市场上几乎所有加速器都支持 z 缓冲,使 z 缓冲区成为目前最常见的深度缓冲区类型。 但是无处不在,z 缓冲区有其缺点。 由于涉及数学,z 缓冲区中生成的 z 值往往不会均匀分布到 z 缓冲区范围(通常为 0.0 到 1.0,含)。 具体而言,远近剪裁平面之间的比率严重影响了 z 值的分布不均匀程度。 使用远平面距离与近平面距离比 100,90% 的深度缓冲区范围用于场景深度范围的前 10%。 使用外部场景进行娱乐或视觉模拟的典型应用程序通常需要在 1,000 到 10,000 之间的任意位置的远平面/近平面比率。 在 1,000% 的比率下,98% 的范围花费在深度范围的前 2%, 分布变差,比率较高。 这可能会导致远程对象中的隐藏表面项目,尤其是在使用 16 位深度缓冲区(最常见的支持位深度)时。

另一方面,基于 w 的深度缓冲区通常比 z 缓冲区更均匀地分布在近和远剪辑平面之间。 关键好处是远近剪裁平面的距离比率不再是问题。 这样,应用程序就可以支持较大的最大范围,同时仍然在靠近眼点的位置获得相对准确的深度缓冲。 基于 w 的深度缓冲区并不完美,有时可能会显示附近对象的隐藏表面项目。 w 缓冲方法的另一个缺点与硬件支持有关:w 缓冲在硬件中不受与 z 缓冲一样广泛支持。

使用 z 缓冲区需要在呈现过程中出现开销。 使用 z 缓冲区时,可以使用各种技术来优化呈现。 有关详细信息,请参阅 Z 缓冲区性能

注意

深度值的实际解释特定于呈现器。

 

本部分介绍有关使用深度缓冲区删除隐藏线条和隐藏图面的信息。

Direct3D 渲染