Hi,
I'm currently trying to draw two different models, but when i draw 2 models where i put two different meshes in.
I only see the last mesh for the 2 models. It's using the same mesh for both of the models, so i think i'm overwriting something.
i'm using following code for the creation part:
Model_3D *mo= new Model_3D();
(*mo).CreateVertices("C:\\..\\Debug\\cube.obj");
Model_3D *m= new Model_3D();
(*m).CreateVertices("C:\\..\\Debug\\strange.obj");
models->push_back(mo);
m->TranslateX(-3);
models->push_back(m);
GLuint programId= glCreateProgram();
for(GLuint var=0;var<models->size();var++)
{
models->at(var)->CreateObject();
CreateObject(models->at(var),programId);
}
GLuint BufferIdsTemp[3] = { 0 };
model->SetShaderIdFragment(LoadShader("C:\\Users\\Sander\\Documents\\RTS idee\\idee\\engine\\GameEngine\\Debug\\SimpleShader.fragment.glsl", GL_FRAGMENT_SHADER));
model->SetShaderIdVertex( LoadShader("C:\\Users\\Sander\\Documents\\RTS idee\\idee\\engine\\GameEngine\\Debug\\SimpleShader.vertex.glsl", GL_VERTEX_SHADER));
model->SetShaderIdProgram(glCreateProgram());
//ShaderIds[0] = glCreateProgram();
ExitOnGLError("ERROR: Could not create the shader program");
glAttachShader(model->GetShaderIdProgram(), model->GetShaderIdFragment());
glAttachShader(model->GetShaderIdProgram(), model->GetShaderIdVertex());
glLinkProgram(model->GetShaderIdProgram());
ExitOnGLError("ERROR: Could not link the shader program");
ModelMatrixUniformLocation = glGetUniformLocation(model->GetShaderIdProgram(), "ModelMatrix");
ExitOnGLError("ERROR: Could not get the shader uniform locations for modelmatrix");
ViewMatrixUniformLocation = glGetUniformLocation(model->GetShaderIdProgram(), "ViewMatrix");
ExitOnGLError("ERROR: Could not get the shader uniform locations for viewmatrix");
ProjectionMatrixUniformLocation = glGetUniformLocation(model->GetShaderIdProgram(), "ProjectionMatrix");
ExitOnGLError("ERROR: Could not get the shader uniform locations for projectionMatrix");
// bufferIds must be local array of gluints i think
GLuint buffer=0;
glGenVertexArrays(1, &BufferIdsTemp[0]);//&buffer);//
//model->SetBufferId(BufferIdsTemp, 0);
ExitOnGLError("ERROR: Could not generate the VAO");
glBindVertexArray(BufferIdsTemp[0]);//model->GetBufferId(0));//
ExitOnGLError("ERROR: Could not bind the VAO");
//cube 1
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
ExitOnGLError("ERROR: Could not enable vertex attributes");
GLuint buffer2=0;
glGenBuffers(2, &BufferIdsTemp[1]);//&buffer2 );//
ExitOnGLError("ERROR: Could not generate the buffer objects");
//model->SetBufferId(buffer, 1);
int sizeVertex=sizeof(model->GetVertices().front());
int vertexEllements=(model)->GetVertices().size();
int sizeVertexes=sizeVertex*vertexEllements;
glBindBuffer(GL_ARRAY_BUFFER,BufferIdsTemp[1]);// BufferIds[1]);//BufferIdsTemp
//glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES), VERTICES, GL_STATIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, sizeVertexes, &model->GetVertices().front(), GL_STATIC_DRAW);
ExitOnGLError("ERROR: Could not bind the VBO to the VAO");
//glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(VERTICES[0]), (GLvoid*)0);
//glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(VERTICES[0]), (GLvoid*)sizeof(VERTICES[0].Position));
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(model->GetVertices().front()), (GLvoid*)0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(model->GetVertices().front()), (GLvoid*)sizeof(model->GetVertices().front().Position));
ExitOnGLError("ERROR: Could not set VAO attributes");
int size=sizeof(model->GetIndices().front());
int ellements=model->GetIndices().size();
int sizeIndices=size*ellements;
GLuint bufferId3=0;
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,BufferIdsTemp[2] );//bufferId3);
//glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(INDICES), INDICES, GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeIndices,&model->GetIndices().front(), GL_STATIC_DRAW);
//model->SetBufferId(bufferId3,2);//
ExitOnGLError("ERROR: Could not bind the IBO to the VAO");
model->SetBufferId(BufferIdsTemp);
glBindVertexArray(0);
And the drawing part is done by this code:
void DrawObject(Model_3D* model)
{
float CubeAngle;
clock_t Now = clock();
if (LastTime == 0)
LastTime = Now;
//CubeRotation += 45.0f * ((float)(Now - LastTime) / CLOCKS_PER_SEC);
CubeAngle = DegreesToRadians(CubeRotation);
LastTime = Now;
glUseProgram( model->GetShaderIdProgram());
ExitOnGLError("ERROR: Could not use the shader program");
glUniformMatrix4fv(model->GetModelMatrixUniformLocation(), 1, GL_FALSE,model->GetMatrix().m);
glUniformMatrix4fv(model->GetViewMatrixUniformLocation(), 1, GL_FALSE, camera->GetCamera().m );
ExitOnGLError("ERROR: Could not set the shader uniforms");
glBindVertexArray(model->GetBufferIds(0));//BufferIds[0]);
ExitOnGLError("ERROR: Could not bind the VAO for drawing purposes");
glDrawElements( GL_TRIANGLES, model->GetIndices().size(), GL_UNSIGNED_INT, (GLvoid*)0);
ExitOnGLError("ERROR: Could not draw the cube");
glBindVertexArray(0);
glUseProgram(0);
}
I have one other problem and that is that i'm trying to put the code of createobject to my model class but when i try to draw the objects then i don't see anything. But this is a secondary problem the first thing i want to understand is to draw 2 different objects.
Can it be that i need a different shader for every object?
If someone can tell me how to fix that would be very helpfull.
Thank you for the help in advance.