【问题标题】:Vulkan: Dynamic buffer size for building/updating acceleration structures (for VK_KHR_ray_tracing)Vulkan:用于构建/更新加速结构的动态缓冲区大小(用于 VK_KHR_ray_tracing)
【发布时间】:2020-08-11 02:34:52
【问题描述】:

我正在开发一个 Vulkan 应用程序,它应该对一些算法进行基准测试。为此,我还想实现一个性能相对较低的算法 - 但当然仍然尽可能优化。

该算法细分了一些基本几何体(目前在 CPU 上,还计划使用计算着色器的版本)。我可能需要更新顶点和索引缓冲区的大小,不幸的是我还没有任何好的指标来猜测大小,所以我只想在所需大小大于当前大小时将分配的内存加倍(如果可行,则减半)。这应该可以合理地最小化内存分配。

我的计划是让 VkDeviceMemory 具有当前最大大小(即 2 的幂),然后将其绑定到可能更小的缓冲区(大小与实际顶点/索引计数相匹配)......但是似乎不可行,因为要查询所需的内存大小,我需要将已经创建的 VkBuffer 传递给vkGetBufferMemoryRequirements。当然,我可以创建具有当前最大大小的缓冲区和设备内存,并告诉正在使用它们的实际大小,但这有点复杂:

我的应用程序使用光线追踪(特别是 KHR 扩展),这意味着这些缓冲区将被传递给 vulkan 的加速结构构建系统,我不完全确定如何告诉该系统要使用缓冲区的哪一部分。以下是加速结构的构建方式:(link to NVIDIA's tutorial)(当然,我必须修改它以允许更新加速结构,而不仅仅是创建它......)。我的猜测是我可以通过VkAccelerationStructureCreateGeometryTypeInfoKHR::maxVertexCountmaxPrimitiveCount 传递这个号码,但是 vulkan 规格说明:

maxPrimitiveCount 描述了可以构建到加速结构几何体中的最大基元数。 maxVertexCount 描述了当 geometryType 为 VK_GEOMETRY_TYPE_TRIANGLES_KHR 时用于构建加速结构几何体的最大顶点数。

不幸的是,我不太清楚这是否是我正在寻找的东西。除此之外,缓冲区直接通过VkDeviceAddress 传递给构建系统,我没有看到其他方法可以影响从缓冲区读取的顶点数。

有没有一种明智的方法来做我想做的事情,或者每次我的需求发生变化时,最好简单地创建一个新缓冲区并分配新内存(每个实际大小)?这对性能有多大影响?

【问题讨论】:

    标签: vulkan raytracing


    【解决方案1】:

    不幸的是,我对光线追踪扩展没有太多经验,但我想到了两件事可能会有所帮助:

    首先,根据我对情况的了解,您可以预先分配一些大型缓冲区,例如它们的池。例如,它们的大小可以增加 2 的幂。这样您就不必在测试过程中再次分配额外的缓冲区。

    其次,您可以使用动态统一缓冲区。只需使最大的一个成为可能,然后将描述符集绑定到该缓冲区内的偏移量。 如果统一缓冲区的最大大小不足以完成作业,您可以移动到存储缓冲区;他们也有动态版本。

    以下是一些规范链接:

    【讨论】:

    • 感谢您的回复,我会对此进行调查,但是由于缓冲区是通过设备地址传递给命令的,因此这些链接在这里并不适用(我认为)-它们会进来不过,一旦我通过计算着色器进行镶嵌,就很方便。我已经取得了进展,但还不足以回答我自己的问题,但为了记录,VkAccelerationStructureBuildOffsetInfoKHR::primitiveCount 似乎是正确的起点,我已经得到something 以这种方式工作,通过选择任意缓冲区大小(10k 个三角形)并保持不变。
    猜你喜欢
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多