4

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」へのポインタとして解釈しているようです。これにより、アクセス違反エラーがスローされます。

4

2 に答える 2

2

試してみてください:

glBindBuffer(GL_ARRAY_BUFFER, vtxBuffer);
glVertexPointer(3,GL_FLOAT,0,0L);

glBindBuffer(GL_ARRAY_BUFFER, clrBuffer);
glColorPointer(3,GL_FLOAT,0,0L);

バッファがバインドされている場合、gl*Pointer呼び出しの最後の引数はGPUバッファのオフセットであり、メモリアドレスではありません。

編集

インデックスはint型(glBufferDataを見る)のようですが、で符号なしとして使用しますglDrawElements

于 2011-02-06T15:33:32.580 に答える
-2

への電話に出られない可能性があります

glEnableClientState(GL_INDEX_ARRAY)

...

glDisableClientState(GL_INDEX_ARRAY)

これにより、gl は、インデックスが直接ポインターではなく、オブジェクトから取得されていることを認識できます。
神よ、私はこれらの機能が嫌いです。

于 2011-02-06T21:50:33.427 に答える