在OpenGL C++中渲染两个三角形[关闭]

6ju8rftf  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(70)

**已关闭。**此问题需要debugging details。目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答问题。
9天前关闭
Improve this question
我写的代码在openGL C中渲染两个三角形。三角形在每个GLFW窗口缓冲区中渲染一次。我知道我没有在主窗口循环中渲染任何东西。我只是在玩它,因为我是openGL和C的超级新手。
我的三角形顶点数组具有完全相同的布局。三个浮点数用于位置,三个浮点数用于其RGB值。我使用两个VBO,每个三角形一个,它们共享一个 VAO ,因为openGL可以以完全相同的方式解释数据。
下面是我感到困惑的代码片段:

//Create two VBOs and a VAO. VBOs data will be structured the same way so the same VAO should work on both
unsigned int VBO,VBO2, VAO;

glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &VBO2);

//Bind our VAO so that openGL knows where to store details abt how to interpret VBOs data
glBindVertexArray(VAO);

//Bind VBO to the array buffer and then send data down
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices1), vertices1, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT , GL_FALSE, 6 * sizeof(float), (void*)0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);

//Draw first triangle and swap buffer
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);

// Bind the second VBO and send its data
glBindBuffer(GL_ARRAY_BUFFER, VBO2);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices2), vertices2, GL_STATIC_DRAW);

 // Why do I need this section?
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
//

// Draw the second triangle and swap buffer
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);

字符串
我不明白为什么我需要做两次glVertexAttribPointer部分和两次属性的启用。这似乎是多余的。如果我不做两次,它将渲染相同的三角形两次。这让我感到困惑,因为我覆盖了GL_ARRAY_BUFFER绑定点与第二个三角形的数据,但它只是再次绘制第一个三角形。但当我做两组顶点属性指针和glEnableVertexAttrib程序按照我的意愿行事

j1dl9f46

j1dl9f461#

顶点缓冲区绑定(ARRAY_BUFFER)是一个全局状态。在VAOs状态向量中声明的每个属性可以引用不同的ARRAY_BUFFER。当glVertexAttribPointer被称为当前绑定到ARRAY_BUFFER目标的缓冲区时,与指定的属性索引相关联,缓冲区对象的ID存储在当前绑定的 VAO 的状态向量中。要使用glDraw*绘制网格,只需绑定 VAO 即可,但如果使用glVertexAttribPointer指定属性,则必须将具有属性值的缓冲区绑定到ARRAY_BUFFER目标。

相关问题