使用不同的VAO和VBO绘制多个三角形

时间:2017-05-26 21:33:30

标签: c++ opengl glfw vbo vao

我试图使用单独的VAO和VBO绘制两个三角形,但在执行时我看到只渲染了一个三角形。以下是我的代码段。我不确定我搞砸了。

我正在使用glfw和glew。

.....
//initialization and creating shader program
.....
GLfloat vertices[] = {
    -0.9f, -0.5f, 0.0f,  // Left 
    -0.0f, -0.5f, 0.0f,  // Right
    -0.45f, 0.5f, 0.0f,  // Top 
};

GLfloat vertices2[] = {
    0.0f, -0.5f, 0.0f,  // Left
    0.9f, -0.5f, 0.0f,  // Right
    0.45f, 0.5f, 0.0f   // Top 
};


GLuint VBO1, VAO1, EBO;
glGenVertexArrays(1, &VAO1);
glGenBuffers(1, &VBO1);
glGenBuffers(1, &EBO);

GLuint VBO2, VAO2;
glGenBuffers(1, &VAO2);
glGenBuffers(1, &VBO2);

glBindVertexArray(VAO1);
glBindBuffer(GL_ARRAY_BUFFER, VBO1);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
//glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)nullptr);
glEnableVertexAttribArray(0);

//glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);



glBindVertexArray(VAO1);
glBindBuffer(GL_ARRAY_BUFFER, VBO2);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices2), vertices2, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)nullptr);
glEnableVertexAttribArray(0);

//glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

while (!glfwWindowShouldClose(window))
{
    glfwPollEvents();


    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT);

    glUseProgram(ShaderProgramID);

    glBindVertexArray(VAO1);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    //glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    //glBindVertexArray(0);

    glBindVertexArray(VAO2);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    //glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    //glBindVertexArray(0);

    glfwSwapBuffers(window);
}
glDeleteVertexArrays(1, &VAO1);
glDeleteVertexArrays(1, &VAO2);

glDeleteBuffers(1, &VBO1);
glDeleteBuffers(1, &VBO2);

glfwTerminate();
...

虽然如果我将VAO和VBO创建为如下所示的数组并相应地更改代码,我会看到两个三角形。我不明白为什么会这样?

GLuint VAO[2], VBO[2];

1 个答案:

答案 0 :(得分:2)

GLuint VBO2, VAO2;
glGenBuffers(1, &VAO2);

...

glBindVertexArray(VAO2);

您已将VAO2初始化为缓冲区,而不是VAO。