OpenGL多线程/共享上下文和glGenBuffers

时间:2014-05-20 16:34:17

标签: c++ multithreading opengl

如果我计划在OpenGL中使用多线程,我是否应该为每个上下文分别使用缓冲区(来自glGenBuffers)?

我对OpenGL多线程还不太了解(现在我在“单一”线程中工作)。我需要知道是否可以共享已经推送到Video Memory的缓冲区(使用glBufferData / glBufferSubData),或者我必须保留另一个线程的缓冲区副本。

2 个答案:

答案 0 :(得分:6)

您不希望在多个线程中使用多个上下文。你真的没有。

虽然这听起来是个好主意,但在实践中,muli-context-multi-thread在驱动程序方面很复杂,很麻烦,并且支持得很差,而且只会略微改善(甚至可能降低!)性能。

真正想要的是只有一个线程与OpenGL交谈(显然有一个上下文),映射缓冲区,并将内存指针传递给另一个线程,最好使用3个缓冲区(3个)具有immutable storage and persistent mapping的3x大小缓冲区的子缓冲区,如果可用的话 那,并进行间接渲染调用,其中第二个线程提供间接调用从中读取的缓冲区。

关于持久性映射主题的更多信息:请参见本GDC2014 presentation的幻灯片22-25,这基本上是Cass Everitt 2013年SIGGRAPH演讲的翻版。
另见Everitt的原创演讲:Beyond porting

答案 1 :(得分:4)

Vaos没有共享,因此您需要为每个上下文为每个对象生成一个新的vao,否则在删除/创建新的行为时,该行为将变得不可预测且不正确一。 这可能是错误的主要来源。可以共享Vbos,因此每个对象只需要一个vbo。