我正在尝试在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();
}
启动程序后,它不会绘制三角形。它只会绘制一个空的灰色屏幕。
答案 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
当前绑定的顶点数组对象用于所有修改顶点数组状态的命令,例如
VertexAttribPointer
和EnableVertexAttribArray
;所有来自顶点数组的命令,例如DrawArrays
和DrawElements
;