2016-07-20 4 views
1

Я новичок в OpenGL, и я пытаюсь нарисовать два треугольника, используя два VAO и только один VBO. Даже если после некоторых исследований я пришел к лучшему пониманию VAO, VBO и того, как работают необходимые функции glew, я не знаю, почему в моей программе отображается только один треугольник вместо двух. Может ли кто-нибудь помочь?OpenGL: несколько VAO для одного VBO

... 

GLfloat points[] = { 
    0.5f, 0.5f, 0.0f, //First Triangle 
    -0.5f, 0.5f, 0.0f, 
    0.5f, -0.5f, 0.0f, 

    0.0f, 0.0f, 0.0f, //Second Triangle 
    -1.0f, 0.0f, 0.0f, 
    0.0f, -1.0f, 0.0f 
}; 

GLuint vbo; 
glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

GLuint vao1; 
glGenVertexArrays(1, &vao1); 
glBindVertexArray(vao1);   
    glBindBuffer(GL_ARRAY_BUFFER, vbo);   
     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); 
     glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindVertexArray(0); 

GLuint vao2; 
glGenVertexArrays(1, &vao2); 
glBindVertexArray(vao2); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo);   
     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (char*)NULL + 9);  
     glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindVertexArray(0); 

... 

while (!glfwWindowShouldClose(window)) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glUseProgram(shader_program); 

     glBindVertexArray(vao1); 
      glDrawArrays(GL_TRIANGLES, 0, 3); 
     glBindVertexArray(0);   

     glBindVertexArray(vao2); 
      glDrawArrays(GL_TRIANGLES, 0, 3); 
     glBindVertexArray(0); 

    glUseProgram(0); 

    glfwPollEvents(); 
    glfwSwapBuffers(window); 
} 

... 

ответ

2

Последний параметр для этого вызова функции неверен:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (char*)NULL + 9); 

Вы говорите это, чтобы добавить 9 байт, но ваши точки плавает

Попробуйте это:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (char*)NULL + 9 * sizeof(float));