Eclipse CDT を使用して、Ubuntu 9.04 で SDL と OpenGL を使用して 3D ゲームを開発しています。各タイプのベクトルでメッシュ データを保持するクラスがあります。Vertex、Normal、UVcoord (テクスチャ座標)、面のベクトルなど。各面には、他のデータへのインデックスを保持する 3 つの int ベクトルがあります。これまでのところ、私のゲームは適切な速度でレンダリングされており、非常にうまく機能しています。しかし、ここでも、テスト目的で 2 つのオブジェクト間で 100 未満の頂点しかありませんでした。
このデータにアクセスするループは次のようになります。
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
ます。マイナス 1 は、Wavefront .obj ファイルのインデックスが 1 であるためです (c++ 0 インデックスではなく)。とにかく、約 30,000 個の顔があると、これらすべての呼び出し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 関数を呼び出す代わりに、データを 3 つの配列に追加するだけです。
キッカーは次のとおりです。
三角形で作られた典型的な立方体を読み込んでいます。
関数UV_Verts
からベクトルの要素 16 (0 インデックス) にアクセスすると、12 が得られます。RenderFace()
しかしUV_Verts
、関数から同じベクトルの要素 16 (0 インデックス) にアクセスするとOnLoad()
、3045472189 のような結果が得られます。
私はとても混乱しています。
誰がこれを引き起こしているのか知っていますか? もしそうなら、それを解決する方法は?