使用 VBO 的 OpenGL 贪心网格划分

Posted

技术标签:

【中文标题】使用 VBO 的 OpenGL 贪心网格划分【英文标题】:OpenGL greedy meshing using VBO 【发布时间】:2015-06-29 11:14:36 【问题描述】:

我正在尝试通过实施类似于 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】:

由于我使用 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 2 5

您可以通过适当填充传递给glDrawElements的索引缓冲区来对构成您的世界的块的顶点执行相同的操作

【讨论】:

对于您的 4 个三角形示例,我了解如果将 VBO 设置为绘制一个 4 个三角形形状并合并该 VBO 的三角形,这将如何工作,但是我的问题是我的索引数组只能修改哪些顶点将从我的顶点数组(已经减少到可能的三角形数量最少的立方体)中绘制,并且我的顶点数组一次只能绘制 1 个立方体,所以我看不出这如何合并来自相邻立方体的三角形.感谢您的帮助。 @user4743748:一次只使用一个立方体是非常低效的。你希望你的三角形/绘图调用比率超过 1000。你应该将尽可能多的立方体打包到一个 VBO 中。 哦.. 所以现在为了绘制一个“块”立方体,我让每个立方体由同一个立方体 VBO 单独绘制,但是我应该制作一个包含所有顶点的 VBO立方体“块”中的所有立方体(1000 个顶点),然后根据我想从那个非常大的 VBO 渲染哪些面来更新我的索引缓冲区? @user4743748:没错。一个带有大量立方体的 VBO 和一个元素索引缓冲区,根据您想要显示的内容进行更新。

以上是关于使用 VBO 的 OpenGL 贪心网格划分的主要内容,如果未能解决你的问题,请参考以下文章

多个网格、多个 VBO、多个 VAO、OpenGL 4.1

为啥绘制我的 OpenGL-ES VBO 网格会阻止其他三角形显示?

将两个不同的网格放在同一个顶点 VBO 中的 OpenGL 最佳实践

两个不同的对象 OpenGL。 VAO VBO IBO 网格变形问题

使用 VBO 在 OpenGL 中渲染人群

OpenGL - 在 ubuntu 的线程上创建 vbo?