背景
代码
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使用率几乎没有任何变化。