OpenGL: несколько VAO для одного VBO

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

...

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);
}

...

person Corvinus    schedule 20.07.2016    source источник


Ответы (1)


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

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)); 
person SurvivalMachine    schedule 20.07.2016