【发布时间】:2016-11-17 10:50:00
【问题描述】:
我正在尝试在 OpenGL 3.3 的窗口中绘制两个三角形。我正在为窗口系统使用 GLFW 库。
据我了解,我应该有 两个 VBO(每个三角形一个)和包含这两个 VBO 的 一个 VAO。我就是这么做的。
但是,我不知道应该调用什么来渲染这两个 VBO。事实上,无论我做什么,只有 第一个 VBO(第一个三角形)被绘制。第二个永远不会出现。
int main()
{
GLFWwindow *window = setupWindow();
GLfloat triangle1Vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
GLfloat triangle2Vertices[] = {
0.f, -0.5f, 0.0f,
0.8f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
GLuint vao, vbo[2];
glGenVertexArrays(1, &vao);
glGenBuffers(2, vbo);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle1Vertices), triangle1Vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle2Vertices), triangle2Vertices, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
glClearColor(0.3f, 0.3f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
glfwSwapBuffers(window);
}
glDeleteVertexArrays(1, &vao);
glDeleteBuffers(2, vbo);
glfwTerminate();
return 0;
}
我显然错过了什么,但是什么?
【问题讨论】:
-
渲染循环中的
glVertexAttribPointer看起来非常可疑。使用 VAO 的部分原因在于,您只需设置管道的输入一次,然后您就执行bind vao; draw; bind another vao; draw;。你为什么要不断地重新设置属性(仍然是相同的缓冲区/格式)? -
第二,你的顶点着色器是什么样子的?它期望在哪个位置输入?着色器如何知道(如果这是您的全部代码)它需要处理来自一个位置而不是另一个位置的属性,具体取决于您要绘制哪个三角形?