2012-03-22 27 views
0

VAOとVBOを使用してメッシュを管理するバッチ処理クラスを作成しています。しかし、glDrawElementsを使用しようとすると、VAOにバインドするときにEXEC_BAD_ACCESSとGL_INVALID_OPERATIONを取得します。ここでは、コードは次のようになります。glDrawElements iOSでのVAO/VBOクラッシュ

glGenVertexArraysOES(1, &arrayID);  
glBindVertexArrayOES(arrayID); // Bind INTO VAO, opening state 

// Load shaders and textures and bind them using glUseProgram etc. 

glGenBuffers(1, &vboID); 
glBindBuffer(GL_ARRAY_BUFFER, vboID); 
glGenBuffers(1, &indexID); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexID); 
glBindVertexArrayOES(0); // Bind AWAY from VAO, saving state 

Glfloat data[length]; 

glBindVertexArrayOES(arrayID); // Bind INTO VAO, open state 

unsigned int glfloatsize = sizeof(GLfloat); 
unsigned int stride = kStride * glfloatsize; 

// Fill Vertex information 
glBufferData(GL_ARRAY_BUFFER, vertCount * glfloatsize * kStride, NULL, GL_STATIC_DRAW); 
glBufferSubData(GL_ARRAY_BUFFER, 0, vertCount * glfloatsize * kStride, data); 

glEnableVertexAttribArray(kPositionLocation); 
glVertexAttribPointer(kPositionLocation, 3, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(0)); 

glEnableVertexAttribArray(kNormalLocation); 
glVertexAttribPointer(kNormalLocation, 3, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(3)); 

glEnableVertexAttribArray(kColorLocation); 
glVertexAttribPointer(kColorLocation, 4, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(6)); 

glClientActiveTexture(GL_TEXTURE0); 
glEnableVertexAttribArray(kTextureLocation); 
glVertexAttribPointer(kTextureLocation, 2, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(10)); 

// Fill Index information 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * sizeof(GLushort), NULL, GL_STATIC_DRAW); 
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indexCount * sizeof(GLushort), index); 

glBindVertexArrayOES(0); // Bind AWAY from VAO, saving state 

// DO OTHER STUFF 

/** RENDER (EXPLODES WITH EXEC_BAD_ACCESS) **/ 
glBindVertexArrayOES(arrayID); 
glDrawElements(renderMode, indexCount, GL_UNSIGNED_SHORT, 0); 
glBindVertexArrayOES(0); 

/** RENDER (WORKS CORRECTLY [index is a scoped array of GLushorts that are uploaded to the VBO above...]) **/ 
glBindVertexArrayOES(arrayID); 
glDrawElements(renderMode, indexCount, GL_UNSIGNED_SHORT, index); 
glBindVertexArrayOES(0); 

GL_ELEMENT_ARRAY_BUFFER VBOを使用しようとしたとき、私はEXEC_BAD_ACCESSを受け付けておりますなぜ任意のアイデア?

+0

'glBindVertexArrayOES(0)'を呼び出すと状態が保存されることはわかりませんでしたが、それについては本当ですか?私の理解は、 'GL_ARRAY_BUFFER'に対して' glVertexAttribPointer'が呼び出され、 'GL_ELEMENT_ARRAY_BUFFER'の場合に' glBufferData'が呼び出されたときに節約が行われるということでした。このチュートリアルをご覧ください:http://www.arcsynthesis.org/gltut/Positioning/Tutorial%2005.html – Vinzzz

+0

これを解決しましたか? –

+0

私はレンダリングパイプラインのかなりの部分を書き直しました。本当に(もしあれば)解決策が出てきたとは本当に言えません。ごめんなさい! – Grimless

答えて

1

次のような記述が正しいですか?

  • すべてのOpenGL関数はエラーを設定しません - glXYZ関数のそれぞれの後にglGetErrorを呼び出し、その結果を確認してください。
  • kStride> = 24
  • 長== vertCount * kStride
  • インデックス配列は、他のglEnableVertexAttribArrayコールがない
  • インデックス配列の
  • すべての要素がvertCount値未満の値を有するGLushortタイプのINDEXCOUNT要素を有します
+0

@Martins Mozeiko - はい、私はEXEC_BAD_ACCESSまでglGetErrorを追跡しました、glDrawArraysはsigabortingの前にGL_INVALID_OPERATIONを設定します。 kStrideは12(3 vert、3 norm、4 color、2 texuv)です。後者の部分は真であり、そうでない場合は、ポインタ置換が機能する可能性は低い(元の投稿の最後の部分)。しかし、健全性チェックをありがとう! – Grimless