0

我刚刚进入游戏编程领域,并且已经调整了一个行进立方体示例以满足我的需求。我正在使用行进立方体渲染Goursat 的表面。目前,我正在使用稍微改编的Marching cubes版本。我正在查看的代码调用:

gl_pushmatrix();
glBegin(GL_TRIANGLES);
    vMarchingCubes(); // generate the mesh
glEnd();
glPopMatrix();

每次它渲染!这给了我约 20 fps 的帧速率。由于我只使用行进立方体来构建网格,因此我不想在每次渲染时都重建网格。我想保存矩阵(虽然我可以在必要时计算大小,但它的大小未知)。

我已经找到了一种在另一个stackoverflow 问题上存储和加载矩阵的方法,但它提到它不是在 openGL 4.0 中执行此操作的首选方法。我想知道这样做的现代方式是什么。如果它是相关的,我希望它也可以在 openGL ES 中使用(如果可能的话)。

4

1 回答 1

1

我想保存矩阵(虽然我可以在必要时计算大小,但它的大小未知)。

您不想存储“矩阵”。您要存储网格。导致性能不佳的还有立即模式(glBegin、glVertex、glEnd)的使用。

您需要一个所谓的顶点缓冲区对象来保存所有三角形数据。等距曲面需要顶点共享,因此您需要稍微预处理数据。首先,您将所有顶点放入以顶点为键的键→值结构(例如 C++ )中std::map,或者放入集合boost::set每次遇到一个新的唯一顶点时,您都​​会为其分配一个索引并将该顶点附加到顶点数组中。此外,对于您附加到 faces 数组的每个顶点,它被分配的索引(可能已经更早):

沿着这条线(伪代码):

vertex_index = 0
vertex_array = new array<vertex>
vertex_set = new set<vertex, unsigned int>
faces_array = new array<unsigned int>

foreach t in triangles:
    foreach v in t.vertices:
        if not vertex_set.has_key(vertex):
           vertex_set.add( vertex, vertex_index )
           vertex_array.append( vertex )
           vertex_index += 1
        faces_array.append( vertex_set(v) )

您现在可以上传到vertex_array缓冲区GL_ARRAY_BUFFER对象和缓冲区对象。有了它,你就可以做通常的…节来画整个事情。有关详细信息,请参阅http://www.opengl.org/wiki/VBO__just_examples和其他有关 VBO 的教程。faces_arrayGL_ELEMENT_ARRAY_BUFFERglVertex…PointerglDrawElements

于 2013-11-07T21:49:43.783 回答