我刚刚进入游戏编程,并改编了一个行进立方体示例以满足我的需求。我正在使用行进立方体渲染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 和其他教程。