Vulkan,VK_KHR_ray_tracing:如何重建BLAS,而不是对其进行更新?

问题描述

我有一个应用程序(基于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的任何示例代码,并且如果我仅将update设置为VK_FALSE,则会收到大量的验证层错误,并且屏幕上没有图像。具体来说,我得到了很多“ X被破坏/释放但仍在使用中”的信息,其中X是命令缓冲区,VkBuffers,内存,栅栏,信号量……我猜想是重建试图释放仍在运行中的BLAS。使用。

因此,我的问题是:如上一篇文章所述,如何正确执行BLAS的“重建”?

我正在考虑使用一些std::shared_ptr来跟踪给定交换链映像仍在使用的BLAS,但是这似乎过于复杂且有些不干净,此外,我将需要与交换链映像一样多的BLAS。 ,将所需的图形内存乘以交换链大小...这在现实生活中的应用中是不实际的,对吧?

解决方法

我无法解释原因,但是我的代码中一定有一个错误,导致我在问题中描述的错误。

重建而不是更新加速结构的正确方法的确是通过将VkAccelerationStructureBuildGeometryInfoKHR的更新参数设置为VK_FALSE来完成的。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...