存储gl_triangles矩阵



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

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

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

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

我想保存矩阵(它的大小未知,尽管如有必要我可以计算大小)。

您不想存储"矩阵"。您想要存储网格。导致性能不佳的原因是使用即时模式(glBegin,glVertex,glEnd)。

你需要的是一个所谓的顶点缓冲区对象,保存所有三角形数据。等轴测表面需要顶点共享,因此您需要对数据进行一些预处理。首先,将所有顶点放入一个键→值结构(例如C++ std::map)中,顶点是键,或者放入一个集合boost::set),这实际上与映射相同,但对于这样的任务具有更好的内存结构。每次遇到新的唯一顶点时,您都会为其分配一个索引,并将该顶点附加到顶点数组中。此外,对于您附加到面数组的每个顶点,它被分配的索引(可能已经更早):

按照这个(伪代码)的思路:

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缓冲区对象中,faces_array上传到GL_ELEMENT_ARRAY_BUFFER缓冲区对象中。有了这个,您就可以执行通常的glVertex…Pointer... glDrawElements节来绘制整个事情。有关详细信息,请参阅 VBO 的 http://www.opengl.org/wiki/VBO_-_just_examples 和其他教程。

相关内容

  • 没有找到相关文章

最新更新