【问题标题】:Best way to store animated vertex data存储动画顶点数据的最佳方式
【发布时间】:2017-06-25 08:34:48
【问题描述】:

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

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

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

【问题讨论】:

  • 每帧带宽要求有多大? PCIe 可以传输大量数据。
  • 所有这些都是转移,我正在寻找最有效的。可以说这是一个复杂的场景,大约有 50 个移动角色,具有高多边形网格和一些静态环境网格。所以可以说它很高。
  • 移动字符通常不使用 gpu 蒙皮,每帧改变几十到一百个矩阵而不是数千个顶点。
  • @ratchetfreak 我同意,在顶点着色器中计算动画顶点比在 CPU 上制作动画并每帧重新上传整个模型要快得多

标签: vulkan


【解决方案1】:

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

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

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

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

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

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

不过,我个人会尽量避免 CPU 动画顶点数据。支持 Vulkan 的 GPU 完全能够自己制作任何动画。十多年来,GPU 一直在进行骨骼加权蒙皮(甚至基于双四元数)。甚至顶点调色板动画也是 GPU 可以做到的;总结各种不同的顶点以得出最终答案。所以有大量 CPU 生成的顶点数据的场景应该是比较少见的。

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 2018-12-01
    • 2013-09-10
    • 2014-07-28
    • 2012-05-10
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多