这是绘制许多不同动态3D模型的最佳和最正确的方法(它们是动画的并且每帧都会改变)

时间:2013-10-31 22:38:41

标签: opengl 3d models vbo

我需要知道如何渲染许多不同的3D模型,它们将几何图形更改为每个框架(都是动画模型),不要重复模型和纹理。

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

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

  1. 为每个3D模型使用1个VBO
  2. 为所有模型使用单个VBO(完全不同,我看不到这个选项)
  3. 我在Windows上使用OpenGL 3.x或更高版本,C ++。

1 个答案:

答案 0 :(得分:5)

TL; DR - 在渲染性能方面没有银弹

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

  • 将所有必要的数据保存在GPU 上(因为距离屏幕越近,电子必须越短的方式:)
  • 尽可能少地将数据发送到之间的
  • 不要在CPU和GPU 之间进行不必要的同步(这就像试图在平行轨道上运行两个高速列车一样,但坚持要将它们放慢到可以每隔一段时间通过窗口传递一些东西的程度同时)

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

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

最后但并非最不重要的是,始终仔细衡量您的变更对效果的影响。盲目行事无济于事。准确测量并彻底(甚至像着色器编译时间这样的东西有时也很重要!)。然后,即使你经过反复试验,也有希望你能到达某个地方。


特别提到你的一点;它是一个大的VBO还是一些较小的VBO并不重要,但是一个巨大的VBO可能在内存中存在问题。你仍然可以更新它的一部分,最重要的是里面的内存安排。