2011-02-06 16 views
4

私はVBOを使い始めましたが、頂点インデックスバッファを除いてすべてがうまくいくようです。インデックスバッファを有効にした後にglDrawElementsを呼び出すと、アクセス違反エラー(インデックスを見つけることができません)が発生し、単にメモリ内のインデックス配列の先頭にポインタを置くと、それが動作します。OpenGL:頂点インデックスバッファの問題

私はそれを設定するとき、私は右のすべてをやっていると思いますが、それでも私はいくつかのコード投稿します:

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->ドロー()ラインコール:

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]); 

(注:すべてのポインタ/ drawElements呼び出しで、代わり&の.. [0]の終わりにポインタを私が頂点バッファの添字を使用したいが、私はできません)。

問題が発生する場所はどこですか。理解できません。私はバッファオブジェクトを生成し、インデックスデータで埋めますが、それは描画には、それを見つけるように見えないようになります。誰もがこの問題を解決する方法について考えている?

おかげ

EDIT:コンパイラはオフセット「0」アクセス違反エラーがスローされますメモリ内の位置に「0」ポインタとしてバッファオブジェクトに解釈しているように私には思えます。

+0

実際に使用しているコードで質問を更新できますか?たとえば、glVertexPointへの呼び出しをtiburの回答の候補に修正します。さらに、あなたのコードは通常のバッファを初期化します。カラーバッファを使用します。あなたのコードが不完全であると思われる間に何かを言うのは難しいです。 – rotoglup

+0

良い点、私はそれに気付かなかった – Zepee

答えて

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バッファ、およびないメモリアドレスにオフセットされます。

EDITは

あなたの指数は、(あなたのglBufferDataを見て)int型のように見えるが、あなたはあなたのglDrawElementsに符号なしとしてそれらを使用しています。

+0

もちろん、私はそれを逃した...それでも動作しません..もしそれが役立つ場合、プログラムがクラッシュすると、それは 'アクセス違反が場所を読み取る0x0000000 '例外(glDrawElements行で) – Zepee

+0

編集:問題は、オフセットと思われる..それはポインタの代わりにオフセットの任意のアイデア0の値を解釈しているようだ? – Zepee

+0

'indices!= 0'をチェックして、インデックスが0と' vertices.size()/ 3'の間にあることも確認してください。 – tibur

-2

は、おそらくこれは、GLはインデックスは直接ポインタをオブジェクトから来るとされていないかを知ることができます

glEnableClientState(GL_INDEX_ARRAY) 

... 

glDisableClientState(GL_INDEX_ARRAY) 

への呼び出しを逃しています。
神様私はこれらの機能が嫌いです。

+1

それはしなかった...そして、私が読んだところから、GL_INDEX_ARRAYは色分けされたインデックスに接続されているように見えますが、glDrawElementsで使用されるインデックスではありません私は間違っている)。 – Zepee

関連する問題