2016-10-17 225 views
-1

我正在创建基于瓦片的渲染器,其中每个瓦片都有一个顶点模型。但是,从每个顶点模型只有一小部分在一帧中渲染。这些子集改变每一帧。大缓冲区开关与小缓冲区开关的成本

什么是最快的方式来渲染?我可以考虑以下选项:

  1. 为每个模型进行一次绘制调用。每个模型都存储在gpu上。对于每次平局,每次都会切换完整的vbo。然后使用索引为实际渲染选择合适的小部分。
  2. 使用一个vbo进行一次绘制调用,通过复制所有其他vbos(必须在vram中复制数据)的必要(小)子集来获得每帧的组合。
  3. 使用一个vbo进行一次绘制调用,但是vbo是使用glBufferData从CPU数据的每个帧(小)中重新创建的。

你认为哪个最快,或者你能想到更快的东西?

一个决定因素很明显,如果在较大的VBO之间切换比在较小的VBO之间切换更昂贵。

+2

只需测量它! – knivil

回答

0

这是一个坏主意做出大量drawcalls。在OpenGL中,你将会受到这种方法的CPU约束,所以最好对很多模型进行批处理。

其实,我会去这个方法。所有静态几何都在一个且只有一个VBO和一个VAO内。这并不意味着你只有“一个平局”。但是,您应该使用glMultiDraw * Indirect。 这个想法让你不得不使用计算着色器在GPU上执行剔除,并在多间接绘制调用中使用类似GL_INDIRECT_PARAMETERS扩展的东西。 Indirect Drawing

对于所有动态几何图形,可以使用持久缓冲区。

回答关于更改vao/vbo的问题。改变VAO,或使用glBindVertexBuffer不应该造成很大的开销。

但是你应该剖析它,它可以取决于你的驱动程序/硬件:)