【问题标题】:Update VBO or use uniforms?更新 VBO 还是使用制服?
【发布时间】:2015-09-08 00:48:56
【问题描述】:

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

  • 它们在场景中移动、旋转、放大/缩小
  • 顶点颜色发生变化,应与纹理颜色相结合
  • 纹理坐标会发生变化,因为它们是 2D 动画

我应该怎么做才能获得最佳性能?有我的想法。请帮我选择哪一个是最好的或提出其他建议:

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

主要问题实际上是:我可以根据需要多次调用哪些函数,以及我应该避免在每个主循环中多次调用哪些函数?

【问题讨论】:

标签: opengl vbo vertex-shader vertices


【解决方案1】:

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

【讨论】:

  • 谢谢,这对我有帮助。多次调用 glDrawElements 怎么样?假设我在一个 VBO 中有 2D 动画和大约 100 帧。每个主循环我只想从该 VBO 渲染 2 个三角形。这是个好主意吗?另一种方法是在 VBO 中保留 2 个三角形并更新它们的纹理坐标或通过统一传递它们。我知道一切都会正常工作,但各方面的表现如何?
  • 很难预测,因为不同的 GPU/驱动程序会表现不同。如果您只是在每帧渲染几个不同的三角形并且 VBO 保持不变,您应该没问题。但是再一次,较小的 VBO 和统一更新也是驱动程序处理得很好的东西,所以我不知道哪个会更好。我对你的建议是首先找出你的性能瓶颈在哪里,然后再解决它。
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
相关资源
最近更新 更多