大缓冲切换与小缓冲切换的成本

时间:2016-10-17 07:53:31

标签: c++ opengl

我正在创建基于图块的渲染器,其中每个图块都有一个顶点模型。但是,从每个顶点模型中,只有一小部分在一帧中呈现。这些子集每帧都会改变。

最快的渲染方法是什么?我可以想到以下几个选项:

  1. 为每个模型进行一次绘制调用。每个模型都完整地存储在gpu上。对于每次绘制调用,每次都会切换完整的vbo。然后使用指数为实际渲染选择适当的小部分。
  2. 使用一个vbo进行一次绘制调用,每个帧通过复制所有其他vbos的必要(小)子集进行汇编(数据在vram中复制)。
  3. 使用一个vbo进行一次绘制调用,但使用glBufferData从CPU数据的(小)子集每帧重新创建vbo。
  4. 您认为哪个最快,或者您能想得更快吗?

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

1 个答案:

答案 0 :(得分:0)

制作大量的抽奖活动是一个坏主意。在OpenGL中,您将受到此方法的CPU限制,因此最好批量处理很多模型。

实际上,我会采用这种方法。所有静态几何都在一个且只有一个VBO和一个VAO内。这并不意味着你只有“一次抽奖”。但是,您应该使用glMultiDraw * Indirect。 这个想法已经成熟,你必须使用计算着色器在GPU上进行剔除,并使用类似GL_INDIRECT_PARAMETERS扩展的方式进行多次间接绘制调用。 Indirect Drawing

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

回答有关更改vao / vbo的问题。改变VAO,或者使用glBindVertexBuffer不应该带来很大的开销。

但你应该对它进行分析,它可能取决于你的驱动程序/硬件:)