Eclipse CDTを使用してUbuntu 9.04でSDLとOpenGLを使用して3Dゲームを開発しています。私は、各タイプのメッシュデータをベクトルで保持するクラスを持っています。 Vertex、Normal、UVcoord(テクスチャ座標)、および面のベクトルなど)。各面には、他のデータへのインデックスを保持する3つのintベクトルがあります。これまでのところ、私のゲームは素敵なレートでレンダリングするのがとてもうまくいっています。しかし、やはり私はテスト目的のために2つのオブジェクトの中の頂点数が100以下でした。異なる時間にアクセスするとC++のベクトル要素が異なる
このデータにアクセスするループは次のようになります。
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
*/
}
上記for
ループを含むrenderFace()
関数を呼び出すループがあります。マイナス1は、Wavefront .objファイルが(C++ 0インデックスの代わりに)1つのインデックスが付けられているためです。とにかく、あなたが約30,000人の顔を持っていれば、glVertex3f()
などのすべてのコールは、ゲームを約10FPSにまで遅くすることを発見しました。私は許すことができない。そこで、配列へのポインタを必要とする頂点配列について学びました。 NeHeチュートリアルの例に続いて、私は自分のoVertice
クラスと他のクラスを使い続けました。これはちょうどfloats
x、y、z、またはu、vを持っていますので、上記の関数をOnLoad()
関数に追加して、 ""などの配列を作成します。
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つの配列にデータを追加します。私は三角形で作られた典型的なキューブをロードしています
:
はここでキッカーです。
IはRenderFace()
関数からUV_Verts
ベクトルの要素16(0がインデックス)にアクセスすると、私は私が得るOnLoad()
関数から同じUV_Verts
ベクトルの要素16(0がインデックス)にアクセスするとき、私は12
を取得しかし3045472189
私はとても混乱しています。
原因を知っている人はいますか?そしてもしそうなら、それを解決する方法は?
一つの可能な理由は、あなたがサイズflsize
で配列を作成していることが考えられ
私はあなたの質問を理解するのに苦労しています。エラーを引き起こす最小限の式にコードを縮小できますか?これは問題ではないと思いますが、一時変数を使用して配列から初期化されていない要素を抽出しています。 –