4

私のコードでは、2 つのバッファー オブジェクトと頂点配列オブジェクトによってサポートされるオブジェクトのラッパー クラスがあります。コンストラクターでこれを使用してそれらを生成します (少し簡略化されています)。

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 を使用する 1 つのインデックスのないものがあります。これは私には問題ないように見えます。各配列オブジェクトには、2 つの固有のバッファーがアタッチされています。

このコードは、後でバックグラウンド リソースを読み込む (むしろ生成する) ためにも使用します。このそれぞれのスレッドには、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カードを搭載したDellラップトップを実行しているLinux Ubuntuでこれをテストしています。

4

1 に答える 1

5

OpenGL 仕様では、VAO オブジェクトの共有を明示的に禁止しています。

ただし、VBO は引き続き共有されます。すべてのスレッドで軽量の VAO が必要なだけです。

于 2013-08-28T16:18:01.427 に答える