如何在 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. 深度缓冲区的图像格式必须是浮点数。如果它是定点,则值仍将被限制在该范围内。需要注意的是硬件不具有支持浮点深度缓冲(不过,如果没有,那么赔率是好它不支持任何扩展这个)。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

如何在Vulkan中的多个计算队列之间执行并行计算着色器?

来自分类Dev

如何将多重采样深度缓冲区解析为深度纹理?

来自分类Dev

iOS-Metal:如何清除深度缓冲区?类似于OpenGL中的glClear(GL_DEPTH_BUFFER_BIT)

来自分类Dev

如何使深度缓冲区对JavaFX中的子场景起作用

来自分类Dev

如何在Vulkan中绘制图元?

来自分类Dev

Vulkan驱动程序和Vulkan SDK如何交互?

来自分类Dev

在Vulkan中启用VSync

来自分类Dev

Vulkan中命令缓冲区之间的同步

来自分类Dev

如何从Vulkan渲染到OpenGL?

来自分类Dev

在Vulkan中如何确定表面的大小?

来自分类Dev

Vulkan-顶点缓冲区更新

来自分类Dev

如何,何时从Vulkan中的帧缓冲区捕获图像到文件

来自分类Dev

如何在不禁用深度测试的情况下读取延迟渲染的光照过程中的深度缓冲区?

来自分类Dev

在Vulkan中最通常的更新顶点缓冲区的正确方法

来自分类Dev

为什么单个深度缓冲区足以满足此vulkan swapchain渲染循环的需要?

来自分类Dev

Vulkan / VMA更改缓冲区大小类似于`realloc`

来自分类Dev

如何在Vulkan中跨多个计算队列执行并行计算着色器?

来自分类Dev

使用vulkan进行绘制调用之间的存储缓冲区同步

来自分类Dev

如何正确清洁Vulkan对象?

来自分类Dev

如何在Vulkan中重新分配缓冲区

来自分类Dev

如何在Vulkan中创建一个缓冲区来存储不同大小的多个纹理

来自分类Dev

如何在vlfw中包含Vulkan-hpp?

来自分类Dev

在金属中如何清除深度缓冲区或模板缓冲区?

来自分类Dev

如何获得WGL创建32位深度的缓冲区?

来自分类Dev

如何使深度缓冲区对JavaFX中的子场景起作用

来自分类Dev

Vulkan 深度缓冲区位置重建

来自分类Dev

Vulkan 中 memoryTypes 的含义

来自分类Dev

LibGDX 如何从 FrameBuffer 获取深度缓冲区?

来自分类Dev

Vulkan 中的动态顶点缓冲区格式设置

Related 相关文章

  1. 1

    如何在Vulkan中的多个计算队列之间执行并行计算着色器?

  2. 2

    如何将多重采样深度缓冲区解析为深度纹理?

  3. 3

    iOS-Metal:如何清除深度缓冲区?类似于OpenGL中的glClear(GL_DEPTH_BUFFER_BIT)

  4. 4

    如何使深度缓冲区对JavaFX中的子场景起作用

  5. 5

    如何在Vulkan中绘制图元?

  6. 6

    Vulkan驱动程序和Vulkan SDK如何交互?

  7. 7

    在Vulkan中启用VSync

  8. 8

    Vulkan中命令缓冲区之间的同步

  9. 9

    如何从Vulkan渲染到OpenGL?

  10. 10

    在Vulkan中如何确定表面的大小?

  11. 11

    Vulkan-顶点缓冲区更新

  12. 12

    如何,何时从Vulkan中的帧缓冲区捕获图像到文件

  13. 13

    如何在不禁用深度测试的情况下读取延迟渲染的光照过程中的深度缓冲区?

  14. 14

    在Vulkan中最通常的更新顶点缓冲区的正确方法

  15. 15

    为什么单个深度缓冲区足以满足此vulkan swapchain渲染循环的需要?

  16. 16

    Vulkan / VMA更改缓冲区大小类似于`realloc`

  17. 17

    如何在Vulkan中跨多个计算队列执行并行计算着色器?

  18. 18

    使用vulkan进行绘制调用之间的存储缓冲区同步

  19. 19

    如何正确清洁Vulkan对象?

  20. 20

    如何在Vulkan中重新分配缓冲区

  21. 21

    如何在Vulkan中创建一个缓冲区来存储不同大小的多个纹理

  22. 22

    如何在vlfw中包含Vulkan-hpp?

  23. 23

    在金属中如何清除深度缓冲区或模板缓冲区?

  24. 24

    如何获得WGL创建32位深度的缓冲区?

  25. 25

    如何使深度缓冲区对JavaFX中的子场景起作用

  26. 26

    Vulkan 深度缓冲区位置重建

  27. 27

    Vulkan 中 memoryTypes 的含义

  28. 28

    LibGDX 如何从 FrameBuffer 获取深度缓冲区?

  29. 29

    Vulkan 中的动态顶点缓冲区格式设置

热门标签

归档