vulkan - Vulkan,VK_KHR_ray_tracing:你如何重建 BLAS,而不是更新它?
问题描述
我有一个应用程序(基于 vulkan-tutorial.com),我在其中使用 vulkan 的名义光线跟踪扩展。在其中,为某些几何体创建了加速结构。然后这个几何图形会发生变化(顶点是动态移动的,每帧),因此我通过调用vkCmdBuildAccelerationStructureKHR
with来更新适当的 BLAS VkAccelerationStructureBuildGeometryInfoKHR::update = VK_TRUE
。这很好用(尽管更新忽略了我更改 maxPrimitiveCount 和类似参数 - 它使用了我在第一次构建期间指定的尽可能多的原语;对我来说有点意义,不是我的问题的一部分)。
我进行了一些研究,并在这里遇到了一些最佳实践:https ://developer.nvidia.com/blog/best-practices-using-nvidia-rtx-ray-tracing/在那里,他们提到了这一点:“考虑使用仅重建 [BLAS] 的变形不可预测。” 这似乎是我想尝试的东西,但是,我找不到任何用于重建 BLAS 的示例代码,如果我只是将更新设置为 VK_FALSE,我会收到大量验证层错误并且屏幕上没有图像。具体来说,我得到很多“X 被销毁/释放但仍在使用”,其中 X 是命令缓冲区、VkBuffers、内存、栅栏、信号量......我的猜测是重建试图释放 BLAS,而它仍在利用。
因此,我的问题是:如上文所述,您如何正确执行 BLAS 的“重建”?
我正在考虑使用一些std::shared_ptr
来跟踪给定交换链图像仍在使用的 BLAS,但这似乎过于复杂且有些不干净,此外,我需要与交换链图像一样多的 BLAS,将所需的图形内存乘以交换链尺寸......这在现实生活中的应用中不实用,对吧?
解决方案
我无法解释原因,但我的代码中一定有一个错误,导致了我在问题中描述的错误。
重建而不是更新加速结构的正确方法确实是将更新参数设置VkAccelerationStructureBuildGeometryInfoKHR
为 VK_FALSE,这就是所有需要做的事情。
推荐阅读
- php - 如何使用存储过程进行 php 登录
- vba - 如何使用 VBA 根据条件添加附件?
- php - 获取最后插入记录的 ID
- android - Android gradle build 最近出现异常失败
- angular - Angular HttpClient Errorhandler 最好的方法
- android - 替换一个drawable而不是另一个drawable
- javascript - 在我的测试中无法以开玩笑的方式访问挂载模式下的深层儿童
- c# - 同步融合网格中的服务器端过滤
- ruby-on-rails - Firefox 无效的日期格式:rails 服务器和 angularJS 客户端
- javascript - 设置 cookie 时中断 JS