这个程序应该渲染一个单独的三角形,但只显示一个黑屏。
我已经更新了这段代码,以反映答案/评论中建议的更改。
[Ubuntu 16.04,GLFW,Glew]
# define GLEW_STATIC
# include <GL/glew.h>
# include <GLFW/glfw3.h>
# include <stdio.h>
int main(int argc, char* argv[])
{
glfwInit();
// glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
// glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
// glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
// glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
GLFWwindow *window = glfwCreateWindow(800, 600, "OpenGL Practice", NULL, NULL);
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
glewInit();
GLfloat verts[] = {
+0.0f, +1.0f,
-1.0f, -1.0f,
+1.0f, -1.0f
};
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
// glVertexPointer(2, GL_FLOAT, 0, 0);
// Main loop
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
{
glfwSetWindowShouldClose(window, GL_TRUE);
}
glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
}
glfwTerminate();
return 0;
}
[更新:此代码所基于的教程似乎使用的是更旧版本的OpenGL,其中不需要着色器。对于初学者来说,这是非常困难的,因为设置是完全相同的,没有编译或运行时错误。我已在下面将最接近此解释的答案标记为正确。]
2条答案
按热度按时间92vpleto1#
即使您创建了VBO和VAO并填充了它们,但您没有正确使用它们。
您首先需要绑定VAO,然后绑定VBO,然后将数据复制到缓冲区,并使用glVertex AttribPointer()函数,然后解除两个缓冲区的绑定。
然后在渲染之前,再次绑定Vao,并在绘制后解除绑定。
您还需要着色器
我在您的代码中没有看到任何着色器。
以下是一个有效的代码:
来源:https://learnopengl.com/code_viewer.php?code=getting-started/hellotriangle
我建议你从一开始就学习OpenGL。https://learnopengl.com/是学习OpenGL的好地方。
hc2pp10m2#
You have绘制->清除->交换。
在你画画之前清除,而不是在之后: