4

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

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 上对此进行测试。

4

1 回答 1

5

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

但是 VBO 仍然是共享的。您只需要在每个线程中使用轻量级 VAO。

于 2013-08-28T16:18:01.427 回答