使用 VBO 的 OpenGL 贪心网格划分

OpenGL greedy meshing using VBO

我正在尝试通过实施类似于 Mikola 的贪心网格算法来减少在我的体素引擎中渲染的面孔数量 (http://0fps.net/2012/06/30/meshing-in-a-minecraft-game/)

由于我使用 VBO 为每个立方体绘制每个三角形,我想知道如何合并相邻立方体的三角形?

这里的参考是我的立方体顶点数组的样子(注意它是交错的以允许包含纹理坐标):

GLfloat cubeInterleaved[] =
{
    // Front face       u  v
    -0.5f, -0.5f, 0.5f, 0, 0,
    0.5f, -0.5f, 0.5f, 1, 0,
    0.5f, 0.5f, 0.5f, 1, 1,
    -0.5f, 0.5f, 0.5f, 0, 1,
    // Right face
    0.5f, -0.5f, 0.5f, 0, 0,
    0.5f, -0.5f, -0.5f, 1, 0,
    0.5f, 0.5f, -0.5f, 1, 1,
    0.5f, 0.5f, 0.5f, 0, 1,
    // Back face
    0.5f, -0.5f, -0.5f, 0, 0,
    -0.5f, -0.5f, -0.5f, 1, 0,
    -0.5f, 0.5f, -0.5f, 1, 1,
    0.5f, 0.5f, -0.5f, 0, 1,
    // Left face
    -0.5f, -0.5f, -0.5f, 0, 0,
    -0.5f, -0.5f, 0.5f, 1, 0,
    -0.5f, 0.5f, 0.5f, 1, 1,
    -0.5f, 0.5f, -0.5f, 0, 1,
    // Top Face
    -0.5f, 0.5f, 0.5f, 0, 0,
    0.5f, 0.5f, 0.5f, 1, 0,
    0.5f, 0.5f, -0.5f, 1, 1,
    -0.5f, 0.5f, -0.5f, 0, 1,
    // Bottom Face
    0.5f, -0.5f, 0.5f, 0, 0,
    -0.5f, -0.5f, 0.5f, 1, 0,
    -0.5f, -0.5f, -0.5f, 1, 1,
    0.5f, -0.5f, -0.5f, 0, 1
};

Since I am using a VBO to draw each triangle for every cube I am confused as to how I will be able to merge the triangles of adjacent cubes.

通过仅使用顶点的子集,这是通过正确填充用于绘制的索引缓冲区来完成的。

以这组4个三角形为例

      5
    /   \
   3 --- 4
 /   \  /  \
0 --- 1 --- 2

你可以画画

GL_TRIANGLES: 0 1 3 1 2 4 1 4 3 3 4 5

或者如果所有的顶点都是共面的,你可以只使用外边

GL_TRIANGLES: 0 2 5

并且您可以通过适当填充传递给 glDrawElements

的索引缓冲区来对构成您的世界的块的顶点执行相同的操作