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を受け付けておりますなぜ任意のアイデア?
'glBindVertexArrayOES(0)'を呼び出すと状態が保存されることはわかりませんでしたが、それについては本当ですか?私の理解は、 'GL_ARRAY_BUFFER'に対して' glVertexAttribPointer'が呼び出され、 'GL_ELEMENT_ARRAY_BUFFER'の場合に' glBufferData'が呼び出されたときに節約が行われるということでした。このチュートリアルをご覧ください:http://www.arcsynthesis.org/gltut/Positioning/Tutorial%2005.html – Vinzzz
これを解決しましたか? –
私はレンダリングパイプラインのかなりの部分を書き直しました。本当に(もしあれば)解決策が出てきたとは本当に言えません。ごめんなさい! – Grimless