В моем коде у меня есть класс-оболочка для объекта, поддерживаемого двумя буферными объектами и объектом массива вершин. Я генерирую их, используя это в конструкторе (немного упрощенно):
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.
Спецификация OpenGL явно запрещает совместное использование объектов VAO.
Но VBOs по-прежнему являются общими. Вам просто нужен легкий VAO в каждой теме.
Других решений пока нет …