使用索引缓冲区绘制两个三角形
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 的代码相同,但他在屏幕上得到了一个漂亮的正方形,而我什么也没有。你能发现错误吗?
这是我系统的一些信息:
- macOS 12.2.1
- OpenGL 版本 4.1
- GLSL 版本 3.3
- 在Xcode
中编写和编译
- 静态链接到 GLEW 和 GLFW
与使用 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);
我正在关注 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 的代码相同,但他在屏幕上得到了一个漂亮的正方形,而我什么也没有。你能发现错误吗?
这是我系统的一些信息:
- macOS 12.2.1
- OpenGL 版本 4.1
- GLSL 版本 3.3
- 在Xcode 中编写和编译
- 静态链接到 GLEW 和 GLFW
与使用 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);