Direct3D 12 中的 W-Buffer(ing)

W-Buffer(ing) in Direct3D 12

D3D10 文档上有一个 list,其中显示了从 D3D9 到 D3D10 的弃用功能。它说不再支持 W 缓冲,我们应该改用高精度深度 buffers/Z-Buffers。我怀疑 Direct3D 11 和 12 也没有(完全)支持它。但是有什么方法可以在 Direct3D 12 中使用 W 缓冲区吗?

Direct3D 9 中的 "W-buffering" 功能是遗留固定功能管道的一部分。在 Direct3D 10 及更高版本中,您只能使用可编程着色器管道(或对于 DirectX 11+,DirectCompute 着色器管道)。因此,'w-buffering' 硬件功能不相关。当人们使用 16 位深度缓冲区时,这也是 Direct3D 9 时代硬件的一个更严重的问题。

在可编程着色器模型中,由您的着色器使用常规 z 或线性化深度值计算深度值,并设置适当的 depth/stencil 状态。请注意,您需要使用 SV_DepthGreaterSV_DepthLessEqual 而不是 SV_Depth,以免失去 'early z rejection' 优化。

请参阅 this blog post and this post 以获得对该主题的良好讨论。

TL;DR: 大多数人只是使用 DXGI_FORMAT_D32_FLOAT 而不必担心。