Мое приложение разбивается на «glDrawElements» (и glDrawArrays).Crash on glDrawElements
Я хотел бы знать, что может быть причиной аварии?
В настоящее время у меня есть что:
Foreach mesh
- Bind VBO/VAO
if(VAO empty)
- bind VAO(id)
- bind VBO(id)
Foreach attribs
- glEnableVertexAttribArray
- glVertexAttribPointer
End foreach
- unbindVAO(0)
- unbindVBO(0)
Foreach attribs
- glDisableVertexAttribArray
End foreach
endif
- Bind IBO(id)
- Bind program/shader(id)
-> send uniforms
-> glDrawElements
End foreach
- Мое приложение аварии на glDrawElements, когда у меня есть много VBO/ВАО/IBO
- с различными устройствами, у меня странный артефакт когда у меня много VAO/VBO/IBO
Я думаю, что есть что-то странное с моими буферами (например, конфликт), каков правильный порядок привязок? Где мне нужно развязать VAO, VBO, IBO, программу, текстуру, ...?
EDIT:
Это выглядеть аварии появляются при удалении геометрии, его буферы удаляются из OpenGL (потому что я не использую их больше). Поэтому я думаю, что мои буферы всегда ограничены Oo.
OpenGL трассировки:
glBindBuffer(target = GL_ARRAY_BUFFER, buffer = 8)
glEnableVertexAttribArray(index = 2)
glVertexAttribPointer(indx = 2, size = 3, type = GL_FLOAT, normalized = false, stride = 20, ptr = 0x0)
glEnableVertexAttribArray(index = 0)
glVertexAttribPointer(indx = 0, size = 4, type = GL_UNSIGNED_BYTE, normalized = true, stride = 20, ptr = 0xc)
glEnableVertexAttribArray(index = 4)
glVertexAttribPointer(indx = 4, size = 2, type = GL_UNSIGNED_SHORT, normalized = true, stride = 20, ptr = 0x10)
glBindBuffer(target = GL_ARRAY_BUFFER, buffer = 0)
glBindBuffer(target = GL_ELEMENT_ARRAY_BUFFER, buffer = 7)
glUseProgram(program = 0)
glUseProgram(program = 6)
glUniformMatrix4fv(location = 2, count = 1, transpose = false, value = [1.6974937, 0.0, 0.0, 0.0, 0.0, 2.100419, -0.49304545, -0.49301255, 0.0, -1.1902374, -0.87008023, -0.8700222, -9.582167, -2.1815264, 15.627364, 15.64632])
glActiveTexture(texture = GL_TEXTURE0)
glBindTexture(target = GL_TEXTURE_2D, texture = 1)
glUniform1i(location = 8, x = 0)
glDisable(cap = GL_BLEND)
glBlendFunc(sfactor = GL_LINES, dfactor = GL_POINTS)
glEnable(cap = GL_DEPTH_TEST)
glUniformMatrix4fv(location = 7, count = 1, transpose = false, value = [50.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 50.0, 0.0, 0.0, -0.1, -150.0, 1.0])
glUniform3fv(location = 3, count = 1, v = [0.8235294, 0.8235294, 0.8235294])
glUniform2fv(location = 0, count = 1, v = [0.0, 0.0])
glUniform2fv(location = 1, count = 1, v = [1.0, 1.0])
glDrawElements(mode = GL_TRIANGLE_STRIP, count = 4, type = GL_UNSIGNED_BYTE, indices = 0x0)
Что вы загружаете на свой VBO, какие аргументы вы передаете glVertexAttribPointer и какие аргументы вы передаете в призывы рисования? Делают (glDrawArrays! = NULL) и (glDrawElements! = NULL)? – thokra
Спасибо за ваш ответ! Я думаю, что все это нормально, потому что я могу нарисовать свою сцену без проблем в большинстве случаев (на устройствах вроде nexus 10, какой-то элемент не появляется Oo). Я видел, что авария произошла, когда я удаляю геометрию/буферы. (Я отредактировал свой пост, чтобы получить трассировку OpenGL) – LongDuZboub
Подождите, вы фактически удалите один из VBOs, с которого вы пытаетесь извлечь данные? Что значит, вам больше не нужна геометрия? – thokra