如何使用multithreadingOpenGL应用程序更新VBO并同时使用它们?

我有一个简单的应用程序。 它有两个线程,每个都有自己的渲染上下文,但他们共享一个VBO(这是工作,我testing了它)。

现在我想要的是:一个线程从VBO的前半部分渲染一些数据,第二个线程正在更新VBO的第二部分。

当我不更新VBO,它工作正常。

但是在更新时我有一些奇怪的问题。 当我使用glMapBuffer来更新VBO(在第二个线程中),在第一个线程中,大部分时间,它什么也不渲染 – 整个屏幕清晰(在glClear调用之后)。 它看起来像无法触及VBO的数据(这是可以理解的,因为整个缓冲区被映射,所以它可以被locking)。

我试图使用glMapBufferRange ,它使用GL_MAP_UNSYNCHRONIZED_BIT 。 这应该意味着,“不要等待和使用VBO,只要你愿意,我(程序)会自己同步它”。 此外,当我映射一系列的VBO和渲染来自另一部分的数据时,它不应该等待,但我遇到同样的问题,因为我与glMapBuffer

任何人都可以帮我解决这个问题,或解释为什么会发生?

如果有人对这个问题感兴趣,可以在OpenGL论坛上find解决scheme。 基本上,缓冲区不能同时被两个线程或上下文访问,既不能读也不能写。 因此,需要像std::mutex这样的locking机制。