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_DepthGreater
或 SV_DepthLessEqual
而不是 SV_Depth
,以免失去 'early z rejection' 优化。
请参阅 this blog post and this post 以获得对该主题的良好讨论。
TL;DR: 大多数人只是使用 DXGI_FORMAT_D32_FLOAT
而不必担心。
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_DepthGreater
或 SV_DepthLessEqual
而不是 SV_Depth
,以免失去 'early z rejection' 优化。
请参阅 this blog post and this post 以获得对该主题的良好讨论。
TL;DR: 大多数人只是使用 DXGI_FORMAT_D32_FLOAT
而不必担心。