绘制具有不同VAO和VBO的多个三角形

问题描述:

我试图绘制两个使用单独VAO和VBO的三角形,但执行时我只看到一个正在渲染的三角形。以下是我的代码片段。我不确定我在搞什么。绘制具有不同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]; 
+2

您将'VAO1'绑定了两次,但第二个应该可能是'glBindVertexArray(VAO2);'。 –

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

... 

glBindVertexArray(VAO2); 

你初始化VAO2作为缓冲,而不是一个VAO。

+1

另请注意,绑定到'VAO2'没有发生;相反,OP将绑定'VAO1'两次(可能是一个错字)。 –

+0

是的这解决了这个问题。两个小错别字和大量的头发拉。谢谢。 :) –