更新 VBO 还是使用制服?

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

VBO?你是说VAO?在你的情况下,看看instanced rendering。 【参考方案1】:

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

【讨论】:

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

以上是关于更新 VBO 还是使用制服?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Three.js 中更新制服?

使用 OpenGL 3.3 进行实例化似乎很慢

OpenGL 使用单个 VBO 渲染多个对象,并使用另一个 VBO 更新对象的矩阵

使用 glBufferSubData() 更新 VBO 数据

我应该使用相同的 VBO 来传递不同的顶点属性吗?还是我应该使用 2?

更新 openGL VBO