使用索引缓冲区绘制两个三角形

Drawing two triangles using index buffer

我正在关注 Cherno 关于 OpenGL 的精彩系列,但遇到了一个问题。我已经从仅使用顶点缓冲区转向现在使用顶点缓冲区和索引缓冲区。

我想要的是让我的程序使用给定的位置和索引绘制两个三角形,但是当我 运行 我的程序时我只得到一个黑屏。当仅从顶点缓冲区绘制时,我的着色器工作正常,但引入索引缓冲区会使它失败。以下是代码的相关部分:

float positions[] {
    -0.5, -0.5,
     0.5, -0.5,
     0.5,  0.5,
    -0.5,  0.5
};

unsigned int indices[] {
    0, 1, 2,
    2, 3, 0
};

unsigned int VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, 4*2*sizeof(float), positions, GL_STATIC_DRAW);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float)*2, 0);

unsigned int IBO;
glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6*sizeof(unsigned int), indices, GL_STATIC_DRAW);

ShaderProgramSource source = parseShader("res/shaders/Basic.glsl");

unsigned int shader = createShader(source.vertexSource, source.fragmentSource);
glUseProgram(shader);

/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
    /* Render here */
    glClear(GL_COLOR_BUFFER_BIT);
    
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);
    

    /* Swap front and back buffers */
    glfwSwapBuffers(window);

    /* Poll for and process events */
    glfwPollEvents();
}

我非常确定我的代码与 Cherno 的代码相同,但他在屏幕上得到了一个漂亮的正方形,而我什么也没有。你能发现错误吗?

这是我系统的一些信息:

与使用 Linux 或 Windows 不同,Mac 不支持兼容性配置文件 OpenGL Context。您必须使用核心配置文件 OpenGL 上下文。如果您使用核心配置文件,则必须创建一个顶点数组对象,因为核心配置文件没有默认的顶点数组对象。

GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float)*2, 0);