【问题标题】:How to store unrestricted depth range in Vulkan depth buffer如何在 Vulkan 深度缓冲区中存储不受限制的深度范围
【发布时间】:2019-03-22 22:24:26
【问题描述】:

主要出于调试目的,我希望在未来的渲染调用深度缓冲区中存储和重用,该深度缓冲区不受 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。

【问题讨论】:

    标签: vulkan


    【解决方案1】:

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

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

    2. Clipping 可能仍然适用。可以将基元裁剪到 [0, Wc] 范围,其中“Wc”是裁剪空间顶点位置的第四个分量。要阻止这种情况,您必须通过VkPipelineRasterizationStateCreateInfo::depthClampEnable = VK_TRUE(或VkPipelineRasterizationDepthClipStateCreateInfoEXT::depthClipEnable = VK_FALSE,如果您使用该扩展程序)关闭深度剪辑。

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

    【讨论】:

    • 感谢您的提示!很抱歉没有分享代码:很难将它与更大的代码库分开。至于您的建议,(1)我使用的是 D32_SFLOAT,似乎不是限制器,(2)我在这里不太确定,但我设置了VkPipelineRasterizationStateCreateInfo::depthClampEnable = VK_TRUE,虽然它似乎没有改变任何东西,( 3) 我已将范围设置为 [0, 10],所以应该不是问题。
    • @VladimirNazarenko “很抱歉没有共享代码”他暗示这是您将获得的最佳答案,除非您实际展示您的代码。我猜你的问题还没有解决,因为你没有接受。与其道歉,不如分享。您可以隔离与此处放置的三点相关的内容并将其放入您的问题中,或者您可以创建一个仅处理此深度问题的 MCVE,将其完整显示。如果您担心 MCVE 的大小,我们知道 vulkan 需要进行大量设置,我们也知道如何忽略不重要的部分。
    • @opa,感谢您的推动!当然代码示例是最好的。我制作了复制器并更新了答案。
    • @nicol-bolas,如果你有时间,你会检查原始帖子中的示例吗?它是否正确地遵循了您的建议?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多