使用VBO进行OpenGL贪婪网格划分

时间:2015-04-22 02:29:09

标签: opengl merge greedy voxel

我试图通过实现类似于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
};

1 个答案:

答案 0 :(得分:1)

  

由于我使用VBO为每个立方体绘制每个三角形,我对如何合并相邻立方体的三角形感到困惑。

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

以这组4个三角形为例

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

你可以画

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

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

GL_TRIANGLES: 0 1 5

通过适当填充传递给glDrawElements

的索引缓冲区,你可以对形成你的世界的块的顶点做同样的事情