Question

I am trying to render two different triangles with IBOs. I stored the six vertices in one VBO and tried to access them through two separate IBOs. The problem is the first IBO renders but the second doesn't. The createVertices and createIndices are called at initialization.

void createVertices()
{
    //Vertex Data
    GLfloat v[] = { 0.95f,  0.75f, 0.0f, 1.0f,
                    0.75f, -0.75f, 0.0f, 1.0f,
                    0.0f,  -0.75f, 0.0f, 1.0f, // END OF TRIANGLE 1
                   -0.75,  0.75f, 0.5f, 1.0f,
                   -0.75, -0.75f, 0.5f, 1.0f,
                    0.0f, -0.75f, 0.5f, 1.0f }; // END OF TRIANGLE 2

    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    glBufferData(GL_ARRAY_BUFFER, sizeof(v), v, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

//////////

void createIndices()
{
    GLushort i[] = { 0,1,2};

    glGenBuffers(2, IBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO[0]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(i), i, GL_STATIC_DRAW);
    size = (sizeof(i)/sizeof(GLushort)); // USED IN DRAWELEMENTS


    GLushort w[] = { 3,4,5};

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO[1]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(w), w, GL_STATIC_DRAW);
    size2 = (sizeof(i)/sizeof(GLushort)); // USED IN DRAWELEMENTS


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

/////////

void Render()
{
    glClear(GL_COLOR_BUFFER_BIT);

    glUseProgram(shader.SProgram);           
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glVertexAttribPointer(0,4, GL_FLOAT, GL_FALSE, 0, 0);


    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO[0]);
    glDrawElements(GL_TRIANGLES,size,GL_UNSIGNED_SHORT,(GLvoid*)IBO[0]);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO[1]);
    glDrawElements(GL_TRIANGLES,size2,GL_UNSIGNED_SHORT,(GLvoid*)IBO[1]);

    glUseProgram(0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
Was it helpful?

Solution

This doesn't make sense:

glDrawElements(GL_TRIANGLES,size,GL_UNSIGNED_SHORT,(GLvoid*)IBO[0]);
                                                   ^^^^^^^^^^^^^^

The parameter to glDrawElements with an IBO bound is an offset into the buffer just as it is with gl…Pointer and VBOs. You probably just want this

glDrawElements(GL_TRIANGLES,size,GL_UNSIGNED_SHORT,(GLvoid*)0);

for both your IBOs and just bind the IBO itself with

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO[…]);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top