VBOを使い始めたばかりですが、頂点インデックスバッファを除いてすべて問題ないようです。インデックスバッファを有効にした後でglDrawElementsを呼び出すと、アクセス違反エラーが発生し(インデックスが見つかりません)、メモリ内のインデックス配列の先頭へのポインタを使用して呼び出すだけで機能します。
//DOESN'T WORK
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices);
glDrawElements(GL_TRIANGLES, stripIndices.size(), GL_UNSIGNED_INT, 0);
//WORKS
glDrawElements(GL_TRIANGLES, stripIndices.size(), GL_UNSIGNED_INT, &stripIndices[0]);
私はそれを設定するときにすべてを正しく行っていると思いますが、それでも私はいくつかのコードを投稿します:
glGenBuffers(1,&vtxBuffer);
glGenBuffers(1,&nrmBuffer);
glGenBuffers(1,&clrBuffer);
glGenBuffers(1,&indices);
glBindBuffer(GL_ARRAY_BUFFER, vtxBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*vertices.size(),
&vertices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, nrmBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*normals.size(),
&normals[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, clrBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*colors.size(),
&colors[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*stripIndices.size(),
&stripIndices[0], GL_STATIC_DRAW);
そして描くために私はします:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glPushMatrix();
glRotatef(25.f,0.f,1.f,0.f);
s->draw();
glPopMatrix();
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
s-> draw()行は次を呼び出します。
glBindBuffer(GL_ARRAY_BUFFER, vtxBuffer);
glVertexPointer(3,GL_FLOAT,0,&vertices[0]);
glBindBuffer(GL_ARRAY_BUFFER, clrBuffer);
glNormalPointer(GL_FLOAT,0,&colors[0]);
glBindBuffer(GL_ARRAY_BUFFER, clrBuffer);
glColorPointer(3,GL_FLOAT,0,&clrVtx[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices);
glDrawElements(GL_TRIANGLES, stripIndices.size(), GL_UNSIGNED_INT, &stripIndices[0]);
(注:すべてのpointer / drawElements呼び出しで、最後の&.. [0]ポインターの代わりに、頂点バッファーの添え字を使用したいのですが、使用できません)。
ここで問題が発生します。理解できません。バッファオブジェクトを生成し、インデックスデータで埋めますが、描画に関しては、それを見つけていないようです。誰かがこの問題を解決する方法について何か考えがありますか?
ありがとう
編集:コンパイラは、バッファオブジェクトへのオフセット「0」をメモリ内の位置「0」へのポインタとして解釈しているようです。これにより、アクセス違反エラーがスローされます。