2012-03-22 2 views
0

Я создаю класс дозирования, который использует VAO и VBOs для управления сетками. Однако при попытке использовать glDrawElements я получаю EXEC_BAD_ACCESS и GL_INVALID_OPERATION при привязке к моему VAO. Вот код:glDrawElements VAO/VBO crash on iOS

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

Любая идея, почему я получаю EXEC_BAD_ACCESS при попытке использовать GL_ELEMENT_ARRAY_BUFFER VBO?

+0

Я не знал, что вызов 'glBindVertexArrayOES (0)' сохранит любое состояние ... Вы уверены в этом? Мое понимание заключалось в том, что сохранение происходит при вызове 'glVertexAttribPointer'is для' GL_ARRAY_BUFFER', и это происходит, когда вызывается 'glBufferData', в случае' GL_ELEMENT_ARRAY_BUFFER'. См. Этот учебник: http://www.arcsynthesis.org/gltut/Positioning/Tutorial%2005.html – Vinzzz

+0

Вы решили это? –

+0

Я переписал хорошую часть моего конвейера рендеринга и не могу сказать, что (если есть) решение, к которому я пришел. Сожалею! – Grimless

ответ

1

Вы уверены, что следующие утверждения верны?

  • вся функция OpenGL не устанавливает ошибку - вызовите glGetError после функции EACH функции glXYZ и проверьте результат.
  • kStride> = 24
  • длина == vertCount * kStride
  • индекс массива имеет indexCount элементы с типом GLushort
  • все элементы индекса массива имеет значение меньше, чем значение vertCount
  • нет никаких других вызовов glEnableVertexAttribArray
+0

@Martins Mozeiko - да, я проследил glGetError до тех пор, пока EXEC_BAD_ACCESS, glDrawArrays не установит GL_INVALID_OPERATION перед сигабортированием. kStride 12 (3 верт., 3 норма, 4 цвета, 2 тексув). Последние части верны, и если бы это было не так, маловероятно, что замена указателя будет работать (последняя часть исходного сообщения). Спасибо за проверку здравого смысла! – Grimless