使用 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
的索引缓冲区来对构成您的世界的块的顶点执行相同的操作
我正在尝试通过实施类似于 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