2012-05-11 4 views
2

私は修正にかなり時間がかかっていたバグがありました。 次の行をコメントするまで、私はEXC_BAD_ACCESSとそれ以上の説明なしでmemmoveエラーへの参照を取得し続けました。GL_ELEMENT_ARRAY_BUFFERを0にバインドするとmemmoveエラーが発生するのはなぜですか?

[self loadShaders];

glGenVertexArraysOES(1, &_vao); 
glBindVertexArrayOES(_vao); 

// Vertex Buffer 
glGenBuffers(1, &_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); 

glEnableVertexAttribArray(ATTRIB_VERTEX); 
glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); 

glEnableVertexAttribArray(ATTRIB_TEXTURE); 
glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 7)); 

// Index Buffer 
glGenBuffers(1, &_indexBuffer); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW); 

glBindBuffer(GL_ARRAY_BUFFER,0); 

////////// COMMENTED THIS ONE ////////////// 
//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);// 
//////////////////////////////////////////// 

glBindVertexArrayOES(0); 

私は0にバッファを結合すると、そのバインド解除意味と思ったので、私は本当にそれが私のアプリのクラッシュをしただろうか理解して傾けます。

ありがとうございました!この関数は取得あなたの属性データを初期化し、いくつかの初期化ルーチン、であるかのように見え、あなたのコードから

const Vertex Vertices[4] = { 
    {{0.75, -1, 0}, {1, 0, 0, 1},  {0.125, 0.833496}}, 
    {{0.75, 1, 0}, {0, 1, 0, 1},  {0.125, 1}}, 
    {{-0.75, 1, 0}, {0, 0, 1, 1},  {0,  1}}, 
    {{-0.75, -1, 0}, {0, 0, 0, 1}, {0,  0.833496}}, 
}; 

const GLushort Indices[6] = 
{ 
    0, 1, 2, 
    2, 3, 0 
}; 
+0

ほとんどの場合、問題はコード内の他の場所にあります。この呼び出しをコメントアウトするだけで、異なる方法で問題が顕在化します。しかし、あなたが投稿したコードを見ると、Verticesの構造には少なくとも9人のフロートメンバーがいるのですか?私はあなたがそれらのうちの5つだけを使用しているのを見るので、ATTRIB_TEXUREに7をオフセットしています(データのために+2)。 –

+0

はい、私はそれもどこか他の場所だと思っていましたが、この単一の行だけで問題は解決しました。私はreallllly理由を理解できません。 thx – Pochi

答えて

8

:私はちょうど

私の構造...この懸念に滞在していません。バインドされたVAOに格納されているため、描画時にVAOをバインドするだけで済みます。

A VAOは、順番に(gl(En/Dis)ableVertexAttribArrayによって設定された)あなたの属性の有効フラグをあるVBOs、(glVertexAttribPointerで設定)属性源と性質、現在バインドされているインデックスバッファを描画するために必要なすべての状態をカプセル化します(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ...)で設定)。この情報は属性状態に格納されるため、現在バインドされている頂点バッファは格納されません。

インデックスバッファを作成してバインドし、そのデータを設定してからバインドを解除し、VAOを有効にしているとします。したがって、VAO状態は0GL_ELEMENT_ARRAY_BUFFERバインディングを格納します。あなたは今

glBindVertexArrayOES(_vao); 
glDrawElements(...); 

で何かを描くときにバインドされたバッファが存在しないとVAOsは、クライアント側の配列で動作しないようglDrawElementsは、失敗します。インデックスデータにVBOを使用するか、インデックスなしのプリミティブ(glDrawArrays)を描画する必要があります。

どちらそれは(その索引バッファ0である)が結合されます場合、結合したインデックスバッファがVAOによって上書きされるため、

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); 
glBindVertexArrayOES(_vao); 
glDrawElements(...); 

が動作します。最初にVAOとインデックスバッファをバインドするとうまくいくが、それは問題を回避するに過ぎない。

バインドされたGL_ELEMENT_ARRAY_BUFFERはVAO状態の一部なので、VAO初期化ルーチンの0にバインドしないでください(インデックスデータが必要ない場合のみ)。また、VAOを使用するときにインデックスまたは頂点データにクライアントサイド配列を使用することも許可されていません。インデックス付きのジオメトリを描画したくない場合は、glDrawElementsの代わりにglDrawArraysを使用しますが、インデックスバッファは廃止されています。

+0

ああ、私はVAOが設定の一部としてそれを保存するのか分からなかった。ありがとう! – Pochi

+0

私はそれについても考えていませんでした。それ以来、glをコーディングしています。素晴らしいxplanation。非常にhelfull quesrion/answer – PeeS

関連する問題