2016-07-20 10 views
1

Ich bin ein Neuling zu OpenGL und ich versuche, zwei Dreiecke mit zwei VAOs und nur einem VBO zu zeichnen. Auch wenn ich nach einigen Recherchen VAO, VBO und die benötigten Glew-Funktionen besser verstehen konnte, habe ich keine Ahnung, warum mein Programm nur ein Dreieck statt zwei anzeigt. Kann jemand helfen?OpenGL: mehrere VAOs für einen 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); 
} 

... 

Antwort

2

Der letzte Parameter für diesen Funktionsaufruf ist falsch:

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

Sie es doch sagen, hinzuzufügen 9 Bytes, aber die Punkte sind schwimmt diese

Versuchen:

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