为什么不显示三角形?

时间:2018-12-29 00:51:20

标签: c++ opengl

我正在尝试在GLFW中绘制一个三角形:

//... init GLFW, compiling and linking shaders, init float array with vertices
//-- all success
GLuint VBO, VAO;
glGenBuffers(1, &VBO);
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexTriangle), vertexTriangle, GL_DYNAMIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);

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

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

//scene loop
while(!glfwWindowShouldClose(window))
{
    glClear(GL_COLOR_BUFFER_BIT);
    glUseProgram(shaderProgram);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glfwSwapBuffers(window);
    glfwPollEvents();
}

启动程序后,它不会绘制三角形。它只会绘制一个空的灰色屏幕。

1 个答案:

答案 0 :(得分:1)

在进行绘制调用时,必须绑定vertex array object

glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);

在您的代码中,VAO尚未绑定,因为默认顶点数组对象(0)在主循环之前被glBindVertexArray(0);绑定。

有关顶点属性的信息存储在顶点数组对象中。 glDrawArrays使用存储在当前绑定的顶点数组对象中的属性信息来执行绘制。

请参见OpenGL 4.6 API Core Profile Specification - 10.3. VERTEX ARRAYS; page 347

  

当前绑定的顶点数组对象用于所有修改顶点数组状态的命令,例如VertexAttribPointerEnableVertexAttribArray;所有来自顶点数组的命令,例如 DrawArrays DrawElements;