Vulkan中设备局部缓冲区的部分更新

时间:2019-04-18 08:05:16

标签: vulkan

我正在生成顶点数据(从体素数据)到内存,设置临时缓冲区(主机可见)(vkCreateBuffer),将顶点数据复制到临时缓冲区,设置设备本地缓冲区({{ 1}}),然后将缓冲区从可见主机复制到设备本地(vkCreateBuffer)。

据我了解,我可以拥有多少个缓冲区是有限制的,因此我可能无法为每个模型创建一个缓冲区。

对于静态模型,这很好,只需将它们混在一起并上传即可。但是我想“定期”修改一些随机顶点。为此,我正在考虑对设备本地缓冲区进行差异更新。因此,在大缓冲区中,我只更新实际更改的数据。能做到吗?

如果我不从主机可见缓冲区渲染任何内容,那么它将不会占用GPU上的任何资源?这样我就可以使主机可见的缓冲区,而不必重新创建并填充它们?

1 个答案:

答案 0 :(得分:0)

是的,您应该可以做自己想做的事。本质上,您发送的更新数据没有,但没有暂存缓冲区和复制命令(类似于我们通常填充统一缓冲区的方式)。

在伪代码中:

  • 更新应用程序中的数据
  • 映射缓冲区
  • 复制更改的数据
  • 取消映射缓冲区
  • 同步

最后一部分是棘手的问题-您可以简单地创建缓冲区VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,这意味着它将在对<{1}的 next 调用之前进行更新。因此,基本上,您需要在渲染下一帧之前执行上述操作,请参见spec。请注意,缓冲区必须为vkQueueSubmit

是将这个“动态”数据作为超级缓冲区的一部分,还是完全独立的缓冲区由您决定。

此方法用于诸如由应用程序管理的粒子系统之类的事情。显然,直接复制到主机和GPU都可以看到的缓冲区(大概)比暂存/复制方法要慢。

但是,如果您要通过登台缓冲区发送一些数据并将命令复制到主机仅对主机可见的 缓冲区,然后然后定期修改部分或全部该数据(例如用于可变形地形的数据)可能会比较棘手,这不是我研究的内容。

编辑:刚刚看到以下可能相关的帖子? Best way to store animated vertex data