Opengl 更新VBO或使用制服?

Opengl 更新VBO或使用制服?,opengl,vbo,vertex-shader,vertices,Opengl,Vbo,Vertex Shader,Vertices,假设我的场景中有数百个矩形。它们中的每一个都在更改每一帧: 它们在场景上移动、旋转、放大/缩小 顶点的颜色发生变化,应与纹理的颜色相结合 纹理坐标会更改,因为它们是二维动画 我应该如何做才能获得最佳性能?这是我的想法。请帮我选择其中最好的,或者提出其他建议: 每帧更新VBO 制作比需要更多的顶点(例如:在VBO中存储所有动画的帧)并选择渲染的顶点(多次调用GLDrainElements) 通过制服发送更改的数据,并在顶点着色器(而不是CPU)中重新计算 实际上,主要的问题是:哪些函数可以

假设我的场景中有数百个矩形。它们中的每一个都在更改每一帧:

  • 它们在场景上移动、旋转、放大/缩小
  • 顶点的颜色发生变化,应与纹理的颜色相结合
  • 纹理坐标会更改,因为它们是二维动画
我应该如何做才能获得最佳性能?这是我的想法。请帮我选择其中最好的,或者提出其他建议:

  • 每帧更新VBO
  • 制作比需要更多的顶点(例如:在VBO中存储所有动画的帧)并选择渲染的顶点(多次调用GLDrainElements)
  • 通过制服发送更改的数据,并在顶点着色器(而不是CPU)中重新计算

实际上,主要的问题是:哪些函数可以调用任意多的次数,哪些函数应该避免在每个主循环中调用超过几次?

通常模型在其局部空间中保持不变,因此您只需要将其上载一次到VBO。通过将相应的变换矩阵加载到制服中并在着色器中使用它们,可以执行诸如平移、旋转、缩放等更改。

VBO?你是说VAO?对你来说,看看。谢谢,这对我很有帮助。打很多次电话给GldrawerElements怎么样?假设我在一个VBO中有2D动画和所有~100帧。每个主循环我只想从VBO渲染2个三角形。这是个好主意吗?另一种方法是在VBO中保留2个三角形,并更新它们的纹理坐标或通过统一的方式传递它们。我知道一切都会很好,但每种方式的性能如何?很难预测,因为不同的GPU/驱动程序会表现不同。如果只是在每个帧中渲染两个不同的三角形,并且VBO保持不变,则应该可以。但是再一次,更小的VBO和统一的更新也是驱动程序能够很好地处理的事情,所以我不知道哪个更好。我的建议是首先找出性能瓶颈所在,然后解决它。