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

C++ OpenGL合并顶点数据以最小化绘制调用,c++,performance,opengl,C++,Performance,Opengl,背景 分块的二维无限世界 每个区块一个VAO和VBO/EBO 嵌套为块渲染中的循环;每个区块一次抽签。 代码 void Chunk::Render/*…*/{ glBindVertexArrayvao; 对于int x=0;x

背景

分块的二维无限世界 每个区块一个VAO和VBO/EBO 嵌套为块渲染中的循环;每个区块一次抽签。 代码

void Chunk::Render/*…*/{ glBindVertexArrayvao; 对于int x=0;x<64;x++{ 对于int y=0;y<64;y++{ 如果块[x][y]==1{ /*…制服*/ GLDRAILEMENTSGL_三角形_带,6,GL_无符号_INT,void*0; } } } glBindVertexArray0; } 构造函数中有一个生成算法。这可以是任何内容:噪波、随机等。该算法将遍历并将块数组中的元素设置为1表示:渲染块或0表示:不渲染

问题

我如何将这些三角形条带组合在一起,以尽量减少绘制调用?我可以想出一些算法来找到应该在draw调用中合并在一起的三角形,但我对如何将它们合并在一起感到困惑。是否需要将其添加到顶点数组并再次调用glBufferData?每帧调用glBufferData这么多次是否不好

我不是真的画了那么多三角形,是吗?我想我听说过这样的人,他们可以很容易地用最少的CPU使用率画出一万个三角形,或者。。甚至上百万。那么我现在的画法有什么问题

编辑
_[Andon M.Coleman][1]u在[chat][2]中给了我很多信息。我现在已经切换到使用实例阵列;我无法相信它在性能上有多大的不同,有一分钟我认为Linux的'top'命令出现了故障。这很有意义。而不是只会说。。60个三角形,我可以在CPU使用率几乎没有任何变化的情况下渲染100多万个三角形。我不是真的渲染那么多三角形,是吗?这就是你的问题。您的绘制算法为O N^2,一次绘制4个三角形。由于这是一个三角形条带,您是否考虑过使用退化三角形原语重新启动一次完成整个绘制?一次绘制4个三角形?我相信我的建议只是画两个三角形来组成一个正方形。我还没有尝试过使用原始重启。我是否应该尝试将每个块的所有顶点数据合并到一个VBO中并使用primitive restart?具有6个索引的三角形条带是N-2=4个三角形。将顶点数据合并到单个缓冲区中会给您带来巨大的性能提升,但我不确定/*中会发生什么事情。。。制服…*/代码的第节。要做到这一点,您可能需要将这些设置为顶点属性,因为可用的制服数量有限。如果我将模式更改为GL_三角形,它是2个三角形,还是4个?我正在“制服”部分设置世界位置数据。glUniform2funiWorldPosition,position.x*64+x,position.y*64+y;其中位置是块位置。也许我可以在块绘制之前设置一个统一的“chunkPosition”来指定块位置,然后为块内三角形的位置设置一个属性?如果使用GL_三角形,则根本不需要重新启动原语。GL_三角形未连接-每3个索引定义一个单独的三角形。但是你需要重新排列你的顶点。当然,你不能只是从一个条带变成一个三角形列表。实际上,我在这里开始得到这样的印象:你想要的是——如果这些三角形中的每一个都有一套定义其位置的制服,那么这就是一个完美的用例。你可能想看看它是否合适。