glDrawElements抛出一个没有错误代码的异常

时间:2017-12-19 11:55:09

标签: c++ opengl

我正在尝试绘制一个简单的三角形并按如下方式设置缓冲区;

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调用可能会抛出。我被困在这里。可能是什么问题?

以下是类似的讨论

nvoglv32.dll throws the exception

1 个答案:

答案 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未绑定时,不再绑定元素缓冲区。