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

标签 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];

最佳答案

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

...

glBindVertexArray(VAO2);

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

关于c++ - 使用不同的 VAO 和 VBO 绘制多个三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44210412/

相关文章:

c++ - 头文件中类型名称的显式限定

java - 调用 glTexImage2D 清除数据缓冲区

c++ - 在 OpenGL/GLFW 3.2 中在窗口和全屏之间切换

c++ - ubuntu Linux 中的数组复制实际上不起作用

d - 使用 GLFW 设置 Derelict3

c++ - openCV库调用不存在的本地路径

c++ - sockaddr_in6 没有声明?

c++ - Qt5-QML : Button does not show up after triggered

c++ - 错误 : vector iterators incompatible

c++ - 实现opengl球体示例代码