存储动画顶点数据的最佳方式

0xA*_*A55 2 vulkan

据我了解,有几种方法可以将顶点数据存储和传输到 GPU。

  • 使用临时暂存缓冲区并将其每帧复制到离散 GPU 内存
  • 使用共享缓冲区(这很慢?)并且每帧更新共享缓冲区
  • 永久存储每个网格的暂存缓冲区,而不是每帧重新创建它并将其复制到 GPU

哪种方法最适合存储快速变化的动画网格数据?

Nic*_*las 6

这取决于硬件及其宣传的内存类型。请注意,以下所有内容都需要您使用来vkGetBufferMemoryRequirements检查内存类型是否可以支持您需要的用途。

如果硬件通告的内存类型是 ,那么您应该使用它而不是暂存。现在,您仍然需要对其进行双缓冲,因为您无法写入 GPU 正在读取的数据,并且您不想与 GPU 同步,除非 GPU 晚了一帧。这也是你应该衡量的;您的 GPU 需求可能需要三重缓冲区,因此请设计灵活的系统。DEVICE_LOCALHOST_VISIBLE

请注意,某些硬件有两个不同的堆DEVICE_LOCAL,但只有其中之一具有HOST_VISIBLE内存类型。所以要注意这些情况。

如果没有这样的内存类型(或者内存类型不支持您需要的缓冲区使用),那么您需要对此进行分析。两种选择是:

  • 暂存(通过可用的专用传输队列)到DEVICE_LOCAL最终使用数据的内存类型。
  • 直接使用非DEVICE_LOCAL内存类型。

请注意,这两者都需要缓冲,因为您希望尽可能避免同步。通过传输队列进行暂存还需要信号量,因为您需要确保图形队列在传输队列完成使用之前不会尝试使用内存。这也意味着您需要处理队列之间的资源共享。

但就我个人而言,我会尽可能避免使用CPU 动画顶点数据。支持 Vulkan 的 GPU 完全能够自行完成任何动画操作。GPU 进行骨骼加权蒙皮(甚至基于双四元数)已有十多年了。甚至顶点调色板动画也是 GPU 可以完成的;将各个不同的顶点相加得出最终答案。因此,具有大量 CPU 生成的顶点数据的场景应该相对较少。