[英]store matrix from gl_triangles
我刚刚开始游戏编程,并改编了适合自己需要的行军立方体示例。 我正在使用行进的多维数据集渲染Goursat的Surface 。 目前,我正在使用稍稍适应的行军多维数据集版本。 我正在查看的代码调用:
gl_pushmatrix();
glBegin(GL_TRIANGLES);
vMarchingCubes(); // generate the mesh
glEnd();
glPopMatrix();
每次渲染! 这给了我约20 fps的帧率。 由于我仅使用行进立方体来构建网格,因此我不想每次渲染时都重新构建网格。 我想保存矩阵(它的大小未知,尽管我可以根据需要计算大小)。
我找到了一种在另一个stackoverflow问题上存储和加载矩阵的方法,但它提到在openGL 4.0中这不是首选的方法。 我想知道现代的方式是什么。 如果相关,我希望它也可以在openGL ES中使用(如果可能的话)。
我想保存矩阵(它的大小未知,尽管我可以根据需要计算大小)。
您不想存储“矩阵”。 您要存储网格。 导致性能不佳的原因还在于立即模式(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
缓冲区对象中,并将faces_array
到GL_ELEMENT_ARRAY_BUFFER
缓冲区对象中。 将其放置到位后,您就可以执行通常的glVertex…Pointer
… glDrawElements
节来绘制整个内容。 有关详细信息,请参见http://www.opengl.org/wiki/VBO_-_just_examples和有关VBO的其他教程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.