Сбой VAO, загруженных из неосновного потока

В моем коде у меня есть класс-оболочка для объекта, поддерживаемого двумя буферными объектами и объектом массива вершин. Я генерирую их, используя это в конструкторе (немного упрощенно):

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 раз, используя различное количество вершин и неизбежно что-то сбои.

У меня вопрос, это ошибка или я делаю что-то явно неправильно? Я тестирую это на Linux Ubuntu под управлением ноутбука Dell с картой Nvidia.

4

Решение

Спецификация OpenGL явно запрещает совместное использование объектов VAO.

Но VBOs по-прежнему являются общими. Вам просто нужен легкий VAO в каждой теме.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]