I’ve been working on a program for a while now but I’ve been away from it for a long while now. The program reads a file for different objects’ coordinates and shows them on the screen. The objects must be dealt with individually, so they are best placed in different buffers. However, obviously they must be dealt with equally by the shaders. So I did the following:
void MyNGLWidget::OpenFile()
{
//...
Environment.GenAttribArrays(NumFaults);
//...
}
void NOpenGLEnvironment::GenAttribArrays(int NumFaults)
{
//Each object will have its own Color, Geometry and Index buffers.
VertexColorAttrib = new unsigned int[NumFaults];
VertexGeometryAttrib = new unsigned int[NumFaults];
VIO = new unsigned int[NumFaults];
}
// The program then goes on to generate the buffers
void MyNGLWidget::GenBuffers()
{
cout << "NGLWidget::GenBuffers" << endl;
const NFault* faults = Faults.GetFaults();
for(int i=0;i<Faults.GetNumFaults();i++)
{
glGenBuffers(1, &Environment.VertexGeometryAttrib[i]);
glGenBuffers(1, &Environment.VertexColorAttrib[i]);
glGenBuffers(1, &Environment.VIO[i]);
}
UpdateFaultGeometry();
UpdateFaultColors();
for(int i=0;i<Faults.GetNumFaults();i++) //send index list of each fault to GPU
{
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,Environment.VIO[i]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*faults[i].GetNumIndexes(), faults[i].GetIndexes(),GL_STATIC_DRAW);
}
}
void MyNGLWidget::UpdateFaultGeometry()
{
const NFault* faults = Faults.GetFaults();
for(int i=0;i<Faults.GetNumFaults();i++)
{
glBindBuffer(GL_ARRAY_BUFFER, Environment.VertexGeometryAttrib[i]);
glBufferData(GL_ARRAY_BUFFER, faults[i].GetNumVertexes()*sizeof(NVertexGeometry), faults[i].GetGeometry(), GL_STATIC_DRAW);
glEnableVertexAttribArray(0); //VERTEX COORDINATES
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(NVertexGeometry), BUFFER_OFFSET(0));
glEnableVertexAttribArray(1); //NORMALS
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(NVertexGeometry), BUFFER_OFFSET(12));
}
}
void MyNGLWidget::UpdateFaultColors()
{
const NFault* faults = Faults.GetFaults();
for(int i=0;i<Faults.GetNumFaults();i++)
{
glBindBuffer(GL_ARRAY_BUFFER, Environment.VertexColorAttrib[i]);
glBufferData(GL_ARRAY_BUFFER, faults[i].GetNumVertexes()*sizeof(NVertexColors), faults[i].GetColors(), GL_STATIC_DRAW);
glEnableVertexAttribArray(2); //VERTEX COLORS
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(NVertexColors), BUFFER_OFFSET(0));
glEnableVertexAttribArray(3); //MESH COLORS
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(NVertexColors), BUFFER_OFFSET(12));
}
}
If I run this with a file containing data for only one object, it runs perfectly. However, if I try it with with a file with two objects, I get what is clearly a “garbage” result.
I’d understood that I could create multiple buffers and use glEnableVertexAttribArray() to “unite” their attributes, but I’m clearly misunderstanding or doing it wrong. Any help or hints?