2013-03-31 3 views
1

Я пытаюсь отобразить два разных треугольника с IBOs. Я сохранил шесть вершин в одном VBO и попытался получить к ним доступ через два отдельных IBOs. Проблема в том, что первый IBO делает, а второй - нет. При инициализации вызывается createVertices и createIndices.Как связать несколько IBO с одного VBO в OpenGL

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.75, 0.5f, 1.0f, 
       0.0f, -0.75, 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); 
    } 

ответ

1

Это не имеет смысла:

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

Параметр glDrawElements с привязкой IBO является смещением в буфере так же, как и с gl ... Указатель и VBOs. Вы, наверное, просто хотите это

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

для обоего вашего НП и просто связать сам IBO с

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO[…]); 
+0

Спасибо за вашу помощь, я бы не видел, что в противном случае. – Emcy

Смежные вопросы