3

我需要知道如何渲染许多不同的 3D 模型,这些模型将它们的几何形状更改为每一帧(动画模型),不要重复模型和纹理。

我携带所有模型,并为每个模型创建了一个“对象”模型类。

渲染它们的最佳方式是什么?

  1. 为每个 3D 模型使用 1 个 VBO
  2. 为所有模型使用单个 VBO(完全不同,我认为这个选项是不可能的)

我在 Windows 上使用 OpenGL 3.x 或更高版本、C++。

4

1 回答 1

5

TL; DR - 在渲染性能方面没有灵丹妙药

这是为什么?这取决于获取数据、转换数据、将数据推送到 GPU 以及使屏幕上的像素闪烁的复杂过程。因此,出现了一些通常可能会提高性能的指南,而不是“一种最佳方式”。

  • 将所有必要的数据保存在 GPU 上(因为离屏幕越近,电子走的路越短:)
  • 在帧之间向 GPU 发送尽可能少的数据
  • 不要在 CPU 和 GPU 之间进行不必要的同步(这就像试图在平行轨道上运行两辆高速列车,但坚持要让它们减速到你可以每隔一段时间通过窗口通过窗口的程度)

现在,很明显,如果你想拥有一个会改变的模型,你不能有蛋糕然后吃掉它。你必须做出权衡。简而言之,动态对象永远不会像静态对象那样快速渲染。那你该怎么办?

  • 向 GPU 提示数据使用情况(GL_STREAM_DRAWGL_DYNAMIC_DRAW)——这应该保证最佳的内存安排。
  • 不要使用交错缓冲区将静态顶点属性与动态属性混合 - 例如,如果您划分内存,则可以批量更新几何图形而保持纹理坐标不变。
  • 尝试尽可能多地在 GPU 上做 - 使用计算着色器和变换反馈,很可能将整个动画数据存储为缓冲区本身并在 GPU 上计算,避免昂贵的同步。

最后但并非最不重要的一点是,始终仔细衡量您的更改对绩效的影响。盲目地去是没有用的。准确而彻底地测量(甚至像着色器编译时间这样的东西有时也很重要!)。然后,即使您通过反复试验,也有希望到达某个地方。


并特别解决您的一个观点;是否是一个大的 VBO 和几个小的 VBO 并不重要,但一个巨大的 VBO 可能无法适应内存。你仍然可以更新它的一部分,最重要的是它内部的内存安排。

于 2013-10-31T23:20:47.187 回答