我在MSVC 2010下使用OpenGL进行编程。
我的目标之一是在场景中挑选对象。我设计它的方式就像为每个对象分配一个独特的颜色,在帧缓冲区中渲染它们,然后读取光标所在的颜色,并且可以获取相应的对象。
现在采摘效果很好。但是,只要拣选发生,内存就会迅速增加。具体来说,以下代码将对象呈现为帧缓冲区:
for (unsigned i = 0; i < objects.size(); ++i)
{
//some code computing color;
Color color;
for (unsigned j = 0; j < objects[i].listOfPrimitives.size(); ++j)
{
objects[i].listOfPrimitives[j]->color = color;
}
objects[i].Render();
for (unsigned j = 0; j < objects[i].listOfPrimitives.size(); ++j)
{
objects[i].listOfPrimitives[j]->color = colorStorage[i][j];
}
}
其中对象是要渲染的对象。由于每个对象都有一定数量的基元(可能是圆柱体,球体等),因此这段代码只是将每个对象的基元颜色更改为唯一的计算基元,渲染对象,然后更改它返回( colorSotrage 存储原始颜色)。以下是处理对象的一些代码,我确定这个问题与此问题无关。
对于大多数对象, render 方法实现如下:
glColor3ub(color[0], color[1], color[2]);
glBegin(GL_TRIANGLES);
for (unsigned i = 0; i < mesh.faces.size(); ++i)
{
glNormal3d(mesh.faces[i].normal.x, mesh.faces[i].normal.y, mesh.faces[i].normal.z);
for (unsigned j = 0; j < 3; ++j)
{
glVertex3d(mesh.vertices[mesh.faces[i].verts[j]].x,
mesh.vertices[mesh.faces[i].verts[j]].y,
mesh.vertices[mesh.faces[i].verts[j]].z);
}
}
glEnd();
但对于某些物体,有一些凹面多边形(即使有孔),所以我使用GLU中的 gluTess * 组函数来渲染它们,并加快渲染过程,我用显示该部分的列表。
现在,正如我所提到的那样。这种拣选程序会迅速增加内存成本。还有两个我无法解释的现象:
所以我想知道哪个部分可能是这个问题的原因?显示清单? gluTess *()调用?甚至是与framebuffer相关的东西?