Vulkan,VK_KHR_ray_tracing:你如何重建 BLAS,而不是更新它?
Vulkan, VK_KHR_ray_tracing: how do you rebuild a BLAS, as opposed to updating it?
我有一个应用程序(基于 vulkan-tutorial.com),我在其中使用了 vulkan 的名义光线跟踪扩展。在其中,为某些几何体创建了一个加速结构。然后这个几何形状发生变化(顶点动态移动,每帧),因此我通过调用 vkCmdBuildAccelerationStructureKHR
和 VkAccelerationStructureBuildGeometryInfoKHR::update = VK_TRUE
来更新适当的 BLAS。这工作正常(尽管更新忽略了我对 maxPrimitiveCount 和类似参数的更改 - 它使用了我在第一次构建期间指定的尽可能多的原语;对我来说有点有意义并且不是我的问题的一部分)。
我进行了一些研究,发现了一些最佳实践:https://developer.nvidia.com/blog/best-practices-using-nvidia-rtx-ray-tracing/ 在那里,他们提到了这一点:“考虑仅使用具有不可预测变形的 [BLAS] 重建。”这似乎是我想尝试的东西,但是,我找不到任何用于重建 BLAS 的示例代码,如果我只是将更新设置为 VK_FALSE,我会收到大量验证层错误并且屏幕上没有图像.具体来说,我得到了很多“X was destroyed/freed but was still in use”,其中 X 是命令缓冲区、VkBuffers、内存、栅栏、信号量……我的猜测是重建正试图释放 BLAS仍在使用中。
因此我的问题是:如上文所述,您如何正确执行 BLAS 的“重建”?
我正在考虑使用一些 std::shared_ptr
来跟踪给定交换链图像仍在使用的 BLAS,但这似乎过于复杂并且有点不干净,此外,我需要尽可能多的 BLAS交换链图像,将所需的显存乘以交换链大小......这在现实生活中的应用程序中不实用,对吧?
我无法解释原因,但我的代码中一定有错误导致了我在问题中描述的错误。
重建而不是更新加速结构的正确方法确实是通过将 VkAccelerationStructureBuildGeometryInfoKHR
的更新参数设置为 VK_FALSE,这就是所有需要做的。
我有一个应用程序(基于 vulkan-tutorial.com),我在其中使用了 vulkan 的名义光线跟踪扩展。在其中,为某些几何体创建了一个加速结构。然后这个几何形状发生变化(顶点动态移动,每帧),因此我通过调用 vkCmdBuildAccelerationStructureKHR
和 VkAccelerationStructureBuildGeometryInfoKHR::update = VK_TRUE
来更新适当的 BLAS。这工作正常(尽管更新忽略了我对 maxPrimitiveCount 和类似参数的更改 - 它使用了我在第一次构建期间指定的尽可能多的原语;对我来说有点有意义并且不是我的问题的一部分)。
我进行了一些研究,发现了一些最佳实践:https://developer.nvidia.com/blog/best-practices-using-nvidia-rtx-ray-tracing/ 在那里,他们提到了这一点:“考虑仅使用具有不可预测变形的 [BLAS] 重建。”这似乎是我想尝试的东西,但是,我找不到任何用于重建 BLAS 的示例代码,如果我只是将更新设置为 VK_FALSE,我会收到大量验证层错误并且屏幕上没有图像.具体来说,我得到了很多“X was destroyed/freed but was still in use”,其中 X 是命令缓冲区、VkBuffers、内存、栅栏、信号量……我的猜测是重建正试图释放 BLAS仍在使用中。
因此我的问题是:如上文所述,您如何正确执行 BLAS 的“重建”?
我正在考虑使用一些 std::shared_ptr
来跟踪给定交换链图像仍在使用的 BLAS,但这似乎过于复杂并且有点不干净,此外,我需要尽可能多的 BLAS交换链图像,将所需的显存乘以交换链大小......这在现实生活中的应用程序中不实用,对吧?
我无法解释原因,但我的代码中一定有错误导致了我在问题中描述的错误。
重建而不是更新加速结构的正确方法确实是通过将 VkAccelerationStructureBuildGeometryInfoKHR
的更新参数设置为 VK_FALSE,这就是所有需要做的。