从非主线程加载的VAO崩溃

时间:2013-08-28 16:00:49

标签: c++ multithreading opengl vao openglcontext

在我的代码中,我有一个由两个缓冲区对象和一个顶点数组对象支持的对象的包装类。我在构造函数中使用它生成它们(略微简化):

glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(1, &ibo);
glGenBuffers(1, &vbo);
printf("Ind buffers %d %d %d\n", vao, ibo, vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

printf在主线程的前几个创建中给出了这个。

Ind buffers 1 1 2
Ind buffers 3 4 5
Ind buffers 4 6 7
Ind buffers 5 8 9
Ind buffers 6 10 11
Ind buffers 7 12 13

在它们之间有一个非索引的,它采用VAO#2和缓冲区#3。这对我来说很好看。每个数组对象都附加两个唯一的缓冲区。

我稍后也会使用此代码加载后台资源(而不是生成它们)。每个线程都有自己的上下文,使用glfwCreateContext创建,并与主窗口共享资源。首次创建这些资源时,此输出将出现:

Ind buffers 1 14 15
Ind buffers 1 16 17
Ind buffers 1 18 19
Ind buffers 1 20 24
Ind buffers 1 21 23
Ind buffers 1 22 25
Ind buffers 1 26 27
Ind buffers 1 28 29
Ind buffers 2 30 31
Ind buffers 2 32 33
Ind buffers 2 34 35
Ind buffers 2 36 37
Ind buffers 2 39 40
Ind buffers 2 38 41
Ind buffers 2 42 43
Ind buffers 2 44 45

在此之后很快,VAO#1用于使用不同数量的顶点绘制9次,并且不可避免地会出现段错误。

我的问题是,这是一个错误还是我做错了什么?我正在使用Nvidia卡运行戴尔笔记本电脑的Linux Ubuntu上进行测试。

1 个答案:

答案 0 :(得分:4)

OpenGL规范明确禁止共享VAO对象。

但维也纳人民共和国仍然是共享的。您只需在每个线程中使用轻量级VAO。