问题描述
我有一个应用程序(基于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来完成的。