在我的基于DirectX 11的引擎中,我有一个Mesh类(显然)有一个顶点和一个索引缓冲区。
现在我不知道我是否应该使用动态或静态顶点缓冲区。
我应该总是使用动态缓冲区吗?我应该总是使用静态缓冲区并每帧重新绑定它吗?
或者我应该自动检测使用情况并在网格每次更新/空闲后切换到动态/静态特定数量的帧(让我们说~120帧)?这意味着更多的开发(检测这种行为,然后更改缓冲区),这是一个好主意吗?
我不想让引擎用户面对两个不同的类(因此他最终必须决定使用静态/动态缓冲区)。它应该是我的引擎的一部分来处理这个。
答案 0 :(得分:1)
角色动画通常使用蒙皮/骨骼动画完成,不需要更新每个帧的顶点,只需更新每个模型的骨骼矩阵。每个顶点属性通常受到一些骨骼的影响,这些骨骼具有静态定义的一些权重(通常每个顶点最多4个骨骼)。
有时你还需要在程序上生成一些顶点,或者从CPU动画它们,因为GPU上的代码可能过于复杂,所以在这种情况下你需要使用动态顶点缓冲区。
在这两种情况下,不可能提前(静态地)知道动画的行为,也不应该遇到必须在它们之间切换的情况。虽然对于动态顶点缓冲区,但是当您不想制作动画时,可以避免更新缓冲区。在可能需要动画的情况下,仅使用动态缓冲区可能很诱人,但实际上这些对于GPU在最坏情况下(动态)初始化顶点缓冲区是不利的,因此推荐的方法是优先选择具有动画的静态场景尽可能使用GPU,并且只在特殊情况下使用动态缓冲区