首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vulkan:用于构建/更新加速结构的动态缓冲区大小(用于VK_KHR_ray_tracing)

Vulkan:用于构建/更新加速结构的动态缓冲区大小(用于VK_KHR_ray_tracing)
EN

Stack Overflow用户
提问于 2020-07-31 17:19:26
回答 1查看 728关注 0票数 0

我正在开发一个Vulkan应用程序,它应该对一些算法进行基准测试。为此,我也希望实现一个相对较低的性能算法--当然,它仍然是最优的。

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

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

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

maxPrimitiveCount描述了可以将构建到加速结构几何中的最大原语数。maxVertexCount描述了当是VK_GEOMETRY_TYPE_TRIANGLES_KHR时,可以用来构建加速结构几何的最大顶点计数。

不幸的是,我不太清楚这是否是我要找的。除此之外,缓冲区通过VkDeviceAddress直接传递给构建系统,我看不出影响从缓冲区读取的顶点数量的另一种方法。

是否有一种明智的方法来完成我想做的事情,还是在每次我的需求发生变化时,最好创建一个新的缓冲区并分配新的内存(每个实际大小)?这对演出会有多糟?

EN

回答 1

Stack Overflow用户

发布于 2020-08-10 18:34:52

不幸的是,我对射线跟踪扩展没有太多的经验,但是有两件事在我的脑海中浮现,可能被证明是有帮助的:

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

第二,您可以使用动态统一缓冲区。只需使最大的一个成为可能,然后绑定由缓冲区内的偏移量设置的描述符。如果统一缓冲区的最大大小不足以满足作业的需要,则可以移动到存储缓冲区;它们也有动态版本。

下面是一些可以从以下内容开始的规范链接:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63196353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档