1

.3ds ファイルからモデルをレンダリングするクラスを作成しようとしていますが、非常に厄介な問題が発生しています。整数から double のベクトルへのマップ マッピングがあります。

map<int, vector<double> >

異なるマテリアル プロパティを持つ頂点をマッピングするために使用しています。その後、すべてのキーを繰り返し処理し、OpenGL で次のようにレンダリングします。

glPushMatrix();
glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

for(map<int, vector<double> >::iterator iter = myMaterialVertices.begin(); iter != myMaterialVertices.end(); iter++)
{
    vector<double> test = iter->second;
    glVertexPointer(3, GL_DOUBLE, 0, test.data());
    //get the texture coords here
    glDrawArrays(GL_TRIANGLES, 0, iter->second.size() / 3);
}

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPopClientAttrib();
glPopMatrix();

残念ながら、これにより glDrawArrays 呼び出しで毎回エラーが発生し、アドレス 0 を読み込もうとしていることがわかります。これは、null ポインターの問題があることを意味すると解釈したので、データがそこにあることを確認するためにテスト ベクトルを入れました。 . ベクトルは正しくロードされますが、それでも同じエラーが発生します。私は何を間違っていますか?

4

1 に答える 1

1

コメントで提案されたので、私は答えを出します。への呼びかけ

glEnableClientState(GL_TEXTURE_COORD_ARRAY);

OpenGL がテクスチャ座標の配列へのポインタを期待するようにします。何も指定されていない場合、null ポインター例外がスローされました (0x00000000 を読み取ろうとしました)。ここでの教訓は、適切なポインターを定義する予定がない限り、クライアント状態を有効にしないことです。

于 2012-11-27T05:20:00.460 に答える