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

use*_*826 3 opengl 3d vbo models

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

我随身携带所有模型,并为每个模型创建了一个"对象"模型类.

呈现它们的最佳方式是什么?

  1. 为每个3D模型使用1个VBO
  2. 为所有模型使用单个VBO(完全不同,我看不到这个选项)

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

Bar*_*icz 5

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

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

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

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

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

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


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