Как использовать многопоточное приложение OpenGL для обновления VBO и их одновременного использования?

11

У меня есть простое приложение. У него есть два потока, каждый со своим собственным контекстом рендеринга, но они совместно используют один VBO (это работает, я проверял это).

Теперь то, что я хочу: один поток рендерит некоторые данные из первой половины VBO, а второй поток обновляет вторую часть VBO.

Когда я не обновляю VBO, он работает нормально.

Но у меня есть некоторые странные проблемы при обновлении. Когда я использую glMapBufferдля обновления VBO (во втором потоке), в первом потоке большую часть времени он ничего не рендерит - весь экран чист (после glClearвызова). Похоже, что он не может касаться данных из VBO (это понятно, потому что весь буфер сопоставлен, и поэтому его можно как-то заблокировать).

Я пытался использовать glMapBufferRange, который использует GL_MAP_UNSYNCHRONIZED_BIT. Это должно означать: «не ждите и используйте VBO, как хотите, я (программа) синхронизирую его сам». Кроме того, когда я отображаю диапазон VBO и визуализирую данные из другой части, это не должно ждать, но у меня возникают те же проблемы, что и у меня glMapBuffer.

Кто-нибудь может мне помочь исправить это или объяснить, почему это происходит?

zacharmarz
источник

Ответы:

6

Если кто-то заинтересован в этой проблеме, вы можете найти решение на форуме OpenGL . По сути, буферы не могут быть доступны двум потокам или контекстам одновременно, ни для чтения, ни для записи. Следовательно, необходим такой механизм блокировки std::mutex.

zacharmarz
источник
Спасибо за указание на решение. Я отредактировал ваш ответ, чтобы подвести итог.
Данияр