OpenGL合并顶点数据以最小化绘制调用

时间:2014-10-26 14:16:16

标签: c++ performance opengl

背景

  • 2D"无限"世界分为块
  • 每个块一个VAO(& VBO / EBO)
  • 在块渲染中嵌套for循环;每个街区一次抽奖。

代码

void Chunk::Render(/* ... */) {
    glBindVertexArray(vao);

    for (int x = 0; x < 64; x++) {
        for (int y = 0; y < 64; y++) {
            if (blocks[x][y] == 1) {
                /* ... Uniforms ... */
                glDrawElements(GL_TRIANGLE_STRIP, 6, GL_UNSIGNED_INT, (void*)0);
            }
        }
    }
    glBindVertexArray(0);
}

构造函数中有一个生成算法。这可能是任何事情:噪声,随机等。算法通过并将blocks数组中的元素设置为1(意思是:渲染块)或0(意思是:不渲染)

问题

如何将这些三角形条带组合在一起以最大限度地减少绘制调用?我可以想一些算法来找到应该在绘图调用中合并在一起的三角形,但我很困惑如何将它们合并在一起。我是否需要将其添加到顶点数组并再次调用glBufferData?每帧多次调用glBufferData是不是很糟糕?

我并没有真正渲染那个很多三角形,是吗?我想我已经听说过那些能够以最少的CPU使用率(或者甚至数百万)绘制一万个三角形的人。那么我目前的绘画方式有什么问题呢?

修改

Andon M. Coleman chat中向我提供了大量信息。我现在切换到使用实例数组;我无法相信它在性能方面有多大的不同,有一分钟我认为Linux的top命令出现故障。它非常重要。而不是只能渲染说60个三角形,我可以渲染超过一百万,而CPU使用率几乎没有任何变化。

0 个答案:

没有答案