我刚刚进入游戏编程并调整了行军立方体示例以满足我的需求。我使用行进立方体渲染Goursat's Surface。目前我使用的是marching cubes稍微改编的版本。我正在看的代码叫:
gl_pushmatrix();
glBegin(GL_TRIANGLES);
vMarchingCubes(); // generate the mesh
glEnd();
glPopMatrix();
每次渲染!这给了我一个~20 fps的帧率。因为我只使用行进立方体来构造网格,所以我不希望每次渲染时都重建网格。我想保存矩阵(虽然我可以根据需要计算大小,但它有一个未知的大小。)
我找到了一种在另一个stackoverflow question上存储和加载矩阵的方法,但它提到它不是在openGL 4.0中执行此操作的首选方法。我想知道现代的做法是什么。如果它是相关的,我希望它也可以在openGL ES中使用(如果可能的话)。
答案 0 :(得分:1)
我想保存矩阵(虽然我可以根据需要计算大小,但它有一个未知的大小。)
您不想存储“矩阵”。您想要存储网格。导致性能不佳的原因是使用立即模式(glBegin,glVertex,glEnd)。
您需要的是一个所谓的顶点缓冲区对象,它包含所有三角形数据。等距曲面需要顶点共享,因此您需要对数据进行一些预处理。首先,将所有顶点放入键→值结构(例如C ++ std::map
)中,顶点为键,或者放入 set ({{ 1}}),它实际上与地图相同,但对于像这样的任务具有更好的内存结构。每次遇到新的唯一顶点时,都会为其指定一个索引,并将顶点附加到顶点数组中。此外,对于每个顶点,您附加到faces数组的索引(可能已经更早):
沿着这条线(伪代码):
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
节来绘制整个事物。有关详细信息,请参阅http://www.opengl.org/wiki/VBO_-_just_examples和其他有关VBO的教程。