繁体   English   中英

从gl_triangles存储矩阵

[英]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_arrayGL_ELEMENT_ARRAY_BUFFER缓冲区对象中。 将其放置到位后,您就可以执行通常的glVertex…PointerglDrawElements节来绘制整个内容。 有关详细信息,请参见http://www.opengl.org/wiki/VBO_-_just_examples和有关VBO的其他教程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM