【问题标题】:Replacing a VBO in an existing VAO替换现有 VAO 中的 VBO
【发布时间】:2012-08-30 14:21:05
【问题描述】:

我有一个带有 VBO 的 VAO,用于各种顶点属性:顶点位置、顶点法线和元素数组 VBO(都是 STATIC_DRAW),因此渲染实例只需要:

glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, <count>, <type>, 0);

但是,我想为每个实例绘制具有不同顶点纹理 (s,t) 坐标的对象的多个实例(我仅限于 OS X GL 3.2 核心配置文件 BTW)。 texcoord VBO 使用 STREAM_DRAW 提示(尽管我可能会使用 DYNAMIC_DRAW)。

绑定VAO,绑定当前的texcoord VBO,通过glVertexAttribPointer设置属性指针,用glBindVertexArray(0)完成VAO,用不同的纹理坐标绘制新实例是否更高效?或者更新 VAO 的成本是否使这成为一种糟糕的方法?在绑定的 VAO 中使用 glBufferSubData 更新 texcoord VBO 怎么样?

在对单独的方法进行基准测试之前,我非常感谢一些反馈,因为错误的选择将导致重大的重构。

【问题讨论】:

  • 一直在寻找有关此的更多信息。我自己正在将我的引擎升级到 GL3.2,所以会尝试发布我的发现。
  • @Grimmy - 你有什么有趣的发现吗?
  • 我最终采用了“创建大量 VAO”的方法。如果需要,我仍然可以处理 VAO 绑定,但还没有任何性能问题。公平地说,我只有少数实例是同一个网格对特定属性使用不同的数据。

标签: performance opengl vbo opengl-3


【解决方案1】:

只需创建多个 VAO。顶点数组对象是轻量级的,它们用于一次性设置顶点数组...

一个VBO可以绑定多个VAO,让你的生活更轻松、更快捷。

如果您在某个时候想要另一个属性配置,请丢弃旧的 VAO 并创建一个新的。

【讨论】:

  • 这是我考虑过的:VAO 设置不是时间关键的 - 它是设置代码,但如果 texcoords 发生变化,则必须在渲染循环期间创建或更新 VAO。我的理解是,VAO 设置做了很多工作来验证缓冲区、边界和内部一致性,以便可以以牺牲初始化成本为代价有效地使用它。
  • 如果您无法在设置时创建所有需要的 VAO,您唯一的选择是配置 VAO 创建/更新解决方案和 VBO 更新解决方案。我从未注意到循环时 VAO 初始化导致的延迟,但这是特定于应用程序的。
  • 卢卡,感谢您的观察。 VAO 肯定是轻量级的,有一个很好的伪代码示例here,无论如何我的代码中都会存在相同数量的(共享)VBO 数据。您是否发现在多个 VAO 之间切换会导致显着延迟?或者我是否在自相矛盾,因为 VAO 绑定在设置成本之后应该是有效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
相关资源
最近更新 更多