从gl_triangles存储矩阵

时间:2013-11-07 19:29:22

标签: c++ opengl graphics

我刚刚进入游戏编程并调整了行军立方体示例以满足我的需求。我使用行进立方体渲染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中使用(如果可能的话)。

1 个答案:

答案 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的教程。