Direct3D 9) (深度缓冲区

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

在启用深度缓冲的情况下将场景栅格化时,对渲染图面中的每个点进行测试。 深度缓冲区中的值可以是点的 z 坐标或其同类 w 坐标 - 从投影空间中该点的 (x,y,z,w) 位置。 使用 z 值的深度缓冲区通常称为 z 缓冲区,使用 w 值的深度缓冲区则称为 w 缓冲区。 每种类型的深度缓冲区各有优缺点,将在本文的稍后部分讨论。

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

测试深度值的图示

注意

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

 

市场上的所有加速器几乎都支持 z 缓冲,这使 z 缓冲区成为当前最常见的深度缓冲区类型。 尽管无处不在,但 z 缓冲区也有缺点。 由于涉及数学,在 z 缓冲区生成的 z 值通常无法在 z 缓冲区范围(通常为 0.0 至 1.0,非独占)中均匀分布。 具体来说,远剪裁平面和近剪裁平面之间的比率会严重影响 z 值分布的平均情况。 如果使用的远平面距离至近平面距离比率为 100,则 90% 的深度缓冲区范围要花费在前 10% 的场景深度范围上。 典型的娱乐应用程序或有外部场景的视觉仿真通常需要任意的远平面/近平面比率在 1,000 至 10,000 之间。 比率为 1000 时,范围的 98% 花费在前 2% 的深度范围上,且高比率的分布情况更糟。 这可能会导致远对象中的隐藏图面项目(特别是使用 16 位深度缓冲区时)成为最常受支持的位深度。

另一方面,较之 z 缓冲区,基于 w 的深度缓冲区通常在近剪裁平面和远剪裁平面之间分布地更平均。 主要优势在于,远剪裁平面和近剪裁平面之间的距离比不再是问题。 这允许应用程序支持大型的最大范围,并仍然能获得靠近眼点的相对正确的深度缓冲。 基于 w 的深度缓冲区并不完美,有时可能会出现近对象的隐藏图面项目。 w 缓冲方法的另一个缺点与硬件支持有关:w 缓冲在硬件中的受支持范围不如 z 缓冲广。

渲染期间使用 z 缓冲区需要开销。 有多种技术可用于优化使用 z 缓冲区时的渲染。 有关详细信息,请参阅 Z 缓冲区性能

注意

深度值的实际解释特定于其渲染器。

 

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

Direct3D 渲染