0

うーん.. メッシュ (var m) を印刷するためにこのコードを書きましたが、うまく動作しています。

glBegin(GL_TRIANGLES);
for (unsigned i : m.vtIndex)
{
    const aiVector3D *pv = &m.pMesh->mVertices[i];
    const aiVector3D *pvn = &m.pMesh->mNormals[i];
    glNormal3fv((const GLfloat *)pvn);
    glVertex3fv((const GLfloat *)pv);
}
glEnd();

そして、これがもう1つです

glVertexPointer(3, GL_FLOAT, 0, m.pMesh->mVertices);
glNormalPointer(GL_FLOAT, 0, m.pMesh->mNormals);
glDrawElements(GL_TRIANGLES, m.vtIndex.size(), GL_UNSIGNED_INT, &m.vtIndex[0]);

しかし、2件目はアクセス違反が発生しました 意見をいただけませんか?

4

2 に答える 2

1

この例では非推奨の OpenGL を使用しており、クライアント メモリを使用して頂点データを格納しています。非推奨の OpenGL では、適切なクライアント状態を有効にする必要があります。

glEnableClientState (GL_VERTEX_ARRAY);
glEnableClientState (GL_NORMAL_ARRAY);

これを描画呼び出しの前にコードに追加すると、クラッシュが修正されるはずです。


プログラムの実行中は常に有効のままにしておくことが安全ですが、メッシュが実際に使用する頂点ポインターに応じて、GL_VERTEX_ARRAY他の配列を有効/無効にする必要がある場合があります。GL_NORMAL_ARRAY

于 2013-08-29T17:02:53.213 に答える
0

わかります。

glEnableClientState(GL_INDEX_ARRAY); // Oops!!
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

ハハ....

于 2013-08-29T23:18:08.050 に答える