PDA

View Full Version : Loading VBOs at runtime



killermud
07-30-2013, 04:48 PM
I am trying to load models in at run time, say when a user presses a button. However when it comes round to draw the loaded model, I get the following exception and nothing gets drawn:
First-chance exception at 0x54E37020 (nvoglv32.dll) in OpenGLProject.exe: 0xC0000005: Access violation reading location 0x00000000

If however I use the same code before I call glutMainLoop() its all fine

Is there some kind of limitation as to how and when you can create VBOs and what not? This is the code I use to load my models:


for(MeshNonProcessed m_unProcessed : meshes)
{
Mesh mesh;
glGenBuffers(1, &mesh.Vertex_VBO);
glBindBuffer(GL_ARRAY_BUFFER, mesh.Vertex_VBO);
glBufferData(GL_ARRAY_BUFFER, m_unProcessed.Vertices.size() * sizeof(Vertex), m_unProcessed.Vertices.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glGenBuffers(1, &mesh.Element_VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh.Element_VBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_unProcessed.Elements.size() * sizeof(unsigned int),
m_unProcessed .Elements.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
mesh.Element_Count = m_unProcessed.Elements.size();

glGenVertexArrays(1, &mesh.VAO);
glBindVertexArray(mesh.VAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh.Element_VBO);
glBindBuffer(GL_ARRAY_BUFFER, mesh.Vertex_VBO);
// bind vertex attributes
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(0));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 3));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 6));
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 8));
glEnableVertexAttribArray(4);
glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 11));
glEnableVertexAttribArray(5);
glVertexAttribPointer(5, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 14));

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}

GClements
07-30-2013, 05:29 PM
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

This leaves GL_ELEMENT_ARRAY_BUFFER unbound within the VAO, so any subsequent glDrawElements() (or similar) call while the VAO is bound will interpret its pointer argument as a pointer to client memory, not as a buffer offset.

The behaviour of GL_ELEMENT_ARRAY_BUFFER is different from that of GL_ARRAY_BUFFER, which isn't part of the VAO state. Instead, the buffer bound to GL_ARRAY_BUFFER is stored as part of the VAO state for that attribute whenever glVertexAttribPointer() is called.