質問

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);
}
役に立ちましたか?

解決

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[…]);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top