我正在尝试绘制一个简单的三角形并按如下方式设置缓冲区;
triangle t;
point3f vertices[] = { t.p1(), t.p2(), t.p3() };
GLushort indices[] = { 0, 1, 2 };
gl_vertex_array vao{ 3 };
vao.bind_vertex_array();
gl_vertex_buffer position_vbo{ buffer_type::array_buf };
position_vbo.bind_vertex_buffer();
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), &vertices[0],
GL_STATIC_DRAW);
position_vbo.unbind_vertex_buffer();
gl_vertex_buffer index_vbo{ buffer_type::element_array_buf };
index_vbo.bind_vertex_buffer();
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), &indices[0],
GL_STATIC_DRAW);
index_vbo.unbind_vertex_buffer();
vao.unbind_vertex_array();
我认为设置缓冲区和VAO很好,我在每个阶段都使用glGetError
进行检查,一切似乎都正常。在我的渲染功能中,我执行以下操作:
glClearColor(0.4f, 0.3f, 0.6f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
o.vao.bind_vertex_array();
o.sp.use_program();
GLenum error = glGetError();
assert(error == GL_NO_ERROR);
//glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
error = glGetError();
assert(error == GL_NO_ERROR);
o.sp.unuse_program();
o.vao.unbind_vertex_array();
使用glDrawArrays
进行此渲染调用很好但是当我尝试使用glDrawElements
进行渲染时,我会抛出异常。而且,这是一个很难的例外。我无法转到下一行查看错误代码。我不知道OpenGl调用可能会抛出。我被困在这里。可能是什么问题?
以下是类似的讨论
答案 0 :(得分:1)
问题在于VAO设置代码。在VAO未绑定之前,索引缓冲区未绑定:
index_vbo.unbind_vertex_buffer();
vao.unbind_vertex_array();
由于VAO始终存储绑定GL_ELEMENT_ARRAY_BUFFER
的最后一个状态,因此这实际上取消了索引缓冲区的绑定。然后发生异常是因为您尝试从未绑定的索引缓冲区读取。解决方案应该是交换这两行并首先取消绑定VAO:
vao.unbind_vertex_array();
index_vbo.unbind_vertex_buffer();
正如Nicol Bolas在评论中提到的:你实际上可以完全放弃元素缓冲区的解除绑定。当VAO未绑定时,不再绑定元素缓冲区。