在给定场景变化的情况下有效更新GL状态

时间:2014-05-18 18:38:49

标签: opengl opengl-es

假设我们有一个场景,其中包含绘制顺序中的n个网格列表。每个网格的三角形数由一个常数限定(尽管该常数可能很大)。还假设我们有GL状态,这样所有网格都可以通过一次绘制调用(glDrawArrays / Elements)来渲染。

考虑到场景的变化,可能包括:

  • 在列表中插入网格
  • 从列表中删除网格
  • 更改网格的几何图形(可能包括更改其三角形计数)

是否有O(1)方式更新GL状态以便对场景进行一次更改?

2 个答案:

答案 0 :(得分:0)

由于draw-order和single-draw-call约束,网格必须按顺序在VBO中线性排列。因此,如果在列表中插入网格,则必须通过移动数据来调整VBO的大小,而不是O(1)。

答案 1 :(得分:0)

这不是一个真正的OpenGL问题。工作的复杂性与几何体的建模有关,这种情况在您开始尝试将其推入GPU之前就已经发生了。

但是你可以考虑一些特定于GL的事情:

  • 使用索引缓冲区和DrawElements调用将顶点数组顺序与绘制顺序分开。如果您从一个顶点缓冲区中抽取多个实体并且您希望它们发生更改,则可以在顶点缓冲区中留下一些填充并按索引寻址顶点。

  • 想想如果每个帧都改变了这个顶点数据到GPU的方式。例如,使用双缓冲或MapBufferRange,CPU可以使用新的顶点数据为下一帧填充缓冲区,而GPU从不同的缓冲区(或范围)绘制当前帧。

每帧安排/修改顶点所做的工作仍然不能是O(1)。 GPU工作(以及CPU / GPU传输)往往被认为比命令分析术语更多,但有些事情可以最大限度地减少时间。