Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


Don't forget to read Tuesday's email newsletter for your chance to win a free copy of Construct 2!


#Actualsothro

Posted 25 March 2014 - 11:41 AM

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.


#2sothro

Posted 24 March 2014 - 02:45 PM

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:\\Users\\Sander\\Documents\\RTS idee\\idee\\engine\\GameEngine\\Debug\\cube.obj");
    Model_3D *m= new Model_3D();
    (*m).CreateVertices("C:\\Users\\Sander\\Documents\\RTS idee\\idee\\engine\\GameEngine\\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;

    //camera->TranslateX(0.01);

    Matrix ModelMatrix2=model->GetMatrix();

    RotateAboutY(&ModelMatrix2, CubeAngle);
    //RotateAboutX(&ModelMatrix, CubeAngle);

    glUseProgram( model->GetShaderIdProgram());
    ExitOnGLError("ERROR: Could not use the shader program");

    glUniformMatrix4fv(model->GetModelMatrixUniformLocation(), 1, GL_FALSE,ModelMatrix2.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.

 

If someone can tell me how to fix that would be very helpfull.

Thank you for the help in advance.


#1sothro

Posted 23 March 2014 - 07:03 AM

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.

 

i'm using following code for the creation part:

    Model_3D *mo= new Model_3D();
    (*mo).CreateVertices("C:\\Users\\Sander\\Documents\\RTS idee\\idee\\engine\\GameEngine\\Debug\\cube.obj");
    Model_3D *m= new Model_3D();
    (*m).CreateVertices("C:\\Users\\Sander\\Documents\\RTS idee\\idee\\engine\\GameEngine\\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;

    //camera->TranslateX(0.01);

    Matrix ModelMatrix2=model->GetMatrix();

    RotateAboutY(&ModelMatrix2, CubeAngle);
    //RotateAboutX(&ModelMatrix, CubeAngle);

    glUseProgram( model->GetShaderIdProgram());
    ExitOnGLError("ERROR: Could not use the shader program");

    glUniformMatrix4fv(model->GetModelMatrixUniformLocation(), 1, GL_FALSE,ModelMatrix2.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.

 

If someone can tell me how to fix that would be very helpfull.

Thank you for the help in advance.


PARTNERS