如何在 Vulkan 深度缓冲区中存储不受限制的深度范围

How to store unrestricted depth range in Vulkan depth buffer

主要是出于调试目的,我希望在未来的渲染调用中存储和重用深度缓冲区,它不受 Vulkan 规范的约束,不会限制在 [0.0, 1.0] 范围内。 VK_EXT_depth_range_unrestricted 似乎正是我需要的,所以我有

  1. 已启用VK_EXT_depth_range_unrestricted,
  2. 将视口中的深度范围设置为 [0.0, 10.0],
  3. 设置 VkPipelineDepthStencilStateCreateInfo 的深度边界为 [0.0, 10.0],depthTestEnable 和 depthWriteEnable 为 VK_TRUE,
  4. 将 renderpass 的深度清除值设置为 10,
  5. 光栅化一些三角形,每个顶点的深度等于3.0,

发现深度图的所有像素都等于1.0。但我希望光栅化像素的深度为 3.0,而不是光栅化为 10.0(在 renderdoc 中检查并通过将深度缓冲区转储到主机内存进行了检查)。

因此我的问题是:是否可以在 Vulkan 的深度缓冲区中实际存储非标准化深度?如果是,我该怎么做?

更新: 我根据 Sascha Willems 的三角形绘图示例制作了复制器。它在 fork 时 运行 示例中,验证不报告任何内容。我看到的是空白图像(每个像素都被清除),但是我希望绘制一个三角形(因为它的每个顶点的深度为 3,而清除的深度为 5)。 以防万一,设备是Vega RX,驱动18.50-ubuntu16.04.

从扩展规范的问题部分,您可以找到许多其他必须发生的事情。由于您不打算展示您的代码,这里有一个列表:

  1. 深度缓冲区的图像格式必须是浮点数。如果它是定点的,那么值仍将被限制在该范围内。请注意,硬件 不必 支持浮点深度缓冲区(尽管,如果不支持,那么它也不支持此扩展的可能性很大)。

  2. Clipping 可能仍然适用。图元可以裁剪到[0, Wc]范围内,其中"Wc"是裁剪的第四个分量-space顶点位置。要停止这种情况,您必须通过 VkPipelineRasterizationStateCreateInfo::depthClampEnable = VK_TRUE(如果您使用该扩展名,则为 VkPipelineRasterizationDepthClipStateCreateInfoEXT::depthClipEnable = VK_FALSE)关闭深度裁剪。

  3. 禁用深度裁剪后,深度值仍将被限制在 VkViewport::minDepth/maxDepth 范围内。所以你必须确保它足够大。