1

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クラスと他のクラスを引き続き使用しました。floatsx、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 のような結果が得られます。

私はとても混乱しています。

誰がこれを引き起こしているのか知っていますか? もしそうなら、それを解決する方法は?

4

1 に答える 1