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

时间:2019-03-19 13:15:52

标签: vulkan

主要用于调试目的,我希望在将来的渲染调用深度缓冲区中存储和重用,该缓冲区不受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. 将渲染通道的深度清除值设置为等于10,
  5. 栅格化一些三角形,每个顶点的深度等于3.0,

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

因此,我的问题是:是否可以将未归一化的深度实际存储在Vulkan的深度缓冲区中?如果是,该怎么办?

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

1 个答案:

答案 0 :(得分:3)

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

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

  2. Clipping可能仍然适用。可以将基元剪切到[0,W c ]范围,其中“ W c ”是剪切空间顶点位置的第四部分。要停止此操作,您必须通过VkPipelineRasterizationStateCreateInfo::depthClampEnable = VK_TRUE(或VkPipelineRasterizationDepthClipStateCreateInfoEXT::depthClipEnable = VK_FALSE,如果您使用该扩展名)来关闭深度裁剪。

  3. 在禁用深度裁剪的情况下,深度值仍将被限制在VkViewport::minDepth/maxDepth范围内。因此,您必须确保足够大。

相关问题