通过打包顶点缓冲区优化渲染

时间:2018-01-24 05:42:14

标签: opengl vulkan

John Carmack最近发推文:

  

"另一个过时的习惯是为顶点创建单独的缓冲区对象   和索引。"

恐怕我不完全明白他的意思。他是否意味着将包括顶点,索引和关节数据在内的所有3D数据打包到单个顶点缓冲区中与每个单独的缓冲区相比是最佳的?如果是这样,这种技术是否仅适用于OpenGL,或者Vulkan渲染器是否也会受益?

2 个答案:

答案 0 :(得分:4)

我认为他的意思并不是特别需要将它们放在不同的缓冲区对象中。您可能不希望以细粒度交错它们,但是例如缓冲区开头的网格的所有索引,然后跟随它的网格的所有顶点数据都不会比使用单独的缓冲区对象更糟糕。使用偏移将绑定点指向缓冲区中的正确位置。

是否更好将它们放在一个缓冲区中我不知道:如果是,我认为它可能是辅助性的东西,比如减少更大的内存分配往往更有效率,你(或驱动程序)可以做一个大型副本而不是两个较小的副本,当需要复制等时。

编辑:我希望这一切都适用于GL和Vulkan。

答案 1 :(得分:0)

John Carmack回复了关于他原来推文的答案:

  

"性能应该相同,只需要更少的管理。我不打算改变旧代码。"              ...   "这不是一个问题,它在现代硬件上是不必要的。打包它们效率不高,只需要适度的管理费用。"

所以也许它根本不是一个过时的习惯,特别是因为它违背了大多数API的预期用例,并且在某些情况下会破坏兼容性 -  正如Nico所说。