麻烦简单的VBO示例

我试图让一个超级简单的GLFW和VBO示例运行,但我被卡住了。 我已经将glBeginglEnd用于其他项目,但我正在尝试更新我的代码以使用OpenGL ES 2,但是现在我只想尽可能向前兼容。

从网上的一些例子中,我提出了以下代码:

 #include  #include  #include  #define bool int #define true 1 #define false 0 const int width = 800; const int height = 600; bool opened = true; GLuint glTriangle; GLfloat triangle[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, }; void init() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glGenBuffers(1, &glTriangle); glBindBuffer(GL_ARRAY_BUFFER, glTriangle); glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW); } void display() { glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, glTriangle); glVertexAttribPointer(0L, 3, GL_FLOAT, GL_FALSE, 0, 0); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableVertexAttribArray(0); } int windowClose(GLFWwindow window) { opened = false; return GL_TRUE; } void main() { if (!glfwInit()) { printf("glfwInit didn't work\n"); return; } GLFWwindow window = glfwCreateWindow(width, height, GLFW_WINDOWED, "Test", 0); glfwMakeContextCurrent(window); init(); glfwSetWindowCloseCallback(window, windowClose); glfwSwapInterval(1); while(opened) { display(); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); } 

这段代码运行,但是当我期望看到一个白色三角形时,我得到的只是一个黑屏。 我试图避免像着色器/纹理这样的任何东西,直到我至少得到一些画在屏幕上的东西。

如果重要的话,我正在通过Mesa驱动程序在Linux上使用OpenGL 2.1版编译: gcc -o test -lGL -lglfw -lm test.c

我究竟做错了什么? 如果我需要指定颜色信息,有什么简单的方法呢?

您不应该将glEnableVertexAttribArray / glVertexAttribPointer与固定管道一起使用。 它可能有效(我不是正面的,我认为attrib 0可能是顶点attrib数组的别名,但不确定)。 这样做并不正确。

如果没有着色器,则应使用glEnableClientStateglVertexPointer作为顶点数据。

默认颜色是(1,1,1,1),所以我觉得你现在应该对颜色没问题了。