【发布时间】:2009-07-14 05:27:08
【问题描述】:
我正在使用 Eclipse CDT 在 Ubuntu 9.04 上使用 SDL 和 OpenGL 开发 3D 游戏。我有一个类来保存每种类型的向量中的网格数据。比如Vertex、Normal、UVcoord(纹理坐标),以及一个面的向量。每个面都有 3 个 int 向量,它们保存其他数据的索引。到目前为止,我的游戏在以不错的速度渲染方面运行良好。但话又说回来,我在两个对象之间只有不到一百个顶点用于测试目的。
访问此数据的循环如下所示:
void RenderFace(oFace face)
{
/*
* More Stuff
*/
oVertice gvert;
oUVcoord tvert;
oNormal nvert;
for (unsigned int fvIndex = 0; fvIndex < face.GeoVerts.size(); fvIndex++)
{
gvert = obj.TheMesh.GetVertice(face.GeoVerts[fvIndex] - 1);
tvert = obj.TheMesh.GetUVcoord(face.UV_Verts[fvIndex] - 1);
nvert = obj.TheMesh.GetNormal(face.NrmVerts[fvIndex] - 1);
glNormal3f(nvert.X, nvert.Y, nvert.Z);
glTexCoord2f(tvert.U, tvert.V);
glVertex3f(scale * gvert.X, scale * gvert.Y, scale * gvert.Z);
}
/*
* More Stuff
*/
}
有一个循环调用renderFace() 函数,其中包括上述for 循环。减一是因为 Wavefront .obj 文件是 1 索引(而不是 c++ 0 索引)。无论如何,我发现一旦你有大约 3 万张左右的面孔,所有这些对glVertex3f() 等的调用都会将游戏速度降低到大约 10 FPS。这是我不能允许的。所以我了解了顶点数组,它需要指向数组的指针。按照 NeHe 教程的示例,我继续使用我的 oVertice 类和其他类。其中只有floats x、y、z 或 u、v。所以我在我的OnLoad() 函数中添加了上面相同的函数来构建只是“oVertice*”和类似的数组。
代码如下:
bool oEntity::OnLoad(std::string FileName)
{
if (!obj.OnLoad(FileName))
{
return false;
}
unsigned int flsize = obj.TheMesh.GetFaceListSize();
obj.TheMesh.VertListPointer = new oVertice[flsize];
obj.TheMesh.UVlistPointer = new oUVcoord[flsize];
obj.TheMesh.NormListPointer = new oNormal[flsize];
oFace face = obj.TheMesh.GetFace(0);
oVertice gvert;
oUVcoord tvert;
oNormal nvert;
unsigned int counter = 0;
unsigned int temp = 0;
for (unsigned int flIndex = 0; flIndex < obj.TheMesh.GetFaceListSize(); flIndex++)
{
face = obj.TheMesh.GetFace(flIndex);
for (unsigned int fvIndex = 0; fvIndex < face.GeoVerts.size(); fvIndex++)
{
temp = face.GeoVerts[fvIndex];
gvert = obj.TheMesh.GetVertice(face.GeoVerts[fvIndex] - 1);
temp = face.UV_Verts[fvIndex];
tvert = obj.TheMesh.GetUVcoord(face.UV_Verts[fvIndex] - 1);
temp = face.NrmVerts[fvIndex];
nvert = obj.TheMesh.GetNormal(face.NrmVerts[fvIndex] - 1);
obj.TheMesh.VertListPointer[counter].X = gvert.X;
obj.TheMesh.VertListPointer[counter].Y = gvert.Y;
obj.TheMesh.VertListPointer[counter].Z = gvert.Z;
obj.TheMesh.UVlistPointer[counter].U = tvert.U;
obj.TheMesh.UVlistPointer[counter].V = tvert.V;
obj.TheMesh.NormListPointer[counter].X = nvert.X;
obj.TheMesh.NormListPointer[counter].Y = nvert.Y;
obj.TheMesh.NormListPointer[counter].Z = nvert.Z;
counter++;
}
}
return true;
}
unsigned int temp 变量用于调试目的。显然,我没有 oFace 的默认构造函数,它没有可以初始化的东西。无论如何,正如你所看到的,这几乎是完全相同的例程。我只是将数据添加到三个数组中,而不是调用 gl 函数。
这是踢球者:
我正在加载一个由三角形组成的典型立方体。
当我从 RenderFace() 函数访问 UV_Verts 向量的元素 16(索引 0)时,我得到 12。
但是当我从 OnLoad() 函数访问同一 UV_Verts 向量的元素 16(索引为 0)时,我得到类似 3045472189 的内容
我很困惑。
有人知道这是什么原因吗?如果是,如何解决?
【问题讨论】:
-
我无法理解您的问题。你能把代码减少到触发错误的最小表达式吗?我认为这不是问题,但您正在使用 temp 变量从数组中提取未初始化的元素。