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


11

我有一个简单的应用程序。它有两个线程,每个线程都有自己的呈现上下文,但是它们共享一个VBO(这是有效的,我已经对其进行了测试)。

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

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

但是更新时我遇到了一些奇怪的问题。当我glMapBuffer用来更新VBO(在第二个线程中)时,在大多数情况下,在第一个线程中,它什么都不呈现-整个屏幕清晰(glClear调用后)。看起来它无法触摸来自VBO的数据(这是可以理解的,因为整个缓冲区已映射,因此可以某种方式锁定)。

我尝试使用glMapBufferRange,它使用GL_MAP_UNSYNCHRONIZED_BIT。这意味着,“不要等待并根据需要使用VBO,我(程序)将自己同步它”。另外,当我映射一系列VBO并从另一部分渲染数据时,它不应该等待,但是遇到的问题与相同glMapBuffer

谁能帮我解决这个问题或解释为什么会发生吗?

Answers:


6

如果有人对此问题感兴趣,可以在OpenGL论坛上找到解决方案。基本上,两个线程或上下文不能同时访问缓冲区,无论是读取还是写入。因此,std::mutex需要类似的锁定机构。


感谢您指出解决方案。我编辑了您的答案以进行总结。
danijar 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.