2017-01-11 17 views
-2

有两个上下文,一个工作者上下文和一个渲染上下文。在设置期间,工作线程创建并设置着色器和VBO。渲染线程然后使用VBO创建一个VAO并绘制它。我在屏幕上没有任何东西(或旧的顶点,见下文)。具有共享上下文的奇怪openGL行为,着色器是共享的,VBO有问题

如果我允许渲染线程在创建VAO之前也创建VBO,那么一切正常,我会看到一个三角形,用工作线程中创建的着色器程序渲染。

真的很奇怪的部分是它工作后,如果我切换回VBO在工作线程创建,我仍然看到三角形,但如果我改变三角形的几何它不会更新,直到我切换回到在渲染线程中创建VBO。

这是令人难以置信的奇怪。渲染上下文都使用在工作上下文中创建的着色器,但我似乎无法共享VBO,但是当工作上下文创建VBO时,顶点不会更新,并且前一个程序运行的三角形会绘制。

我在Ubuntu 16.这是发生在glew,现在glbinding和我自己编译的最新glfw3和Ubuntu包以及。

总之,VBO的创建和绘制工作从主线程与从工作线程创建的着色器。如果我尝试用工作线程(相同的功能)创建一个VBO,我似乎可以访问一个新的缓冲区,它在渲染线程中使用时会碰到旧数据...

+0

对你单独做什么的描述不足以诊断你的问题。 –

+0

@NicolBolas这对于那些有知识的人来说是完全足够的。我在5分钟内从一位真正的大师那里得到了答案。解释是完美的。 – RobC

+0

“*解释完美。*”但是你的描述并没有说你*不是绑定另一个线程中的缓冲区。从你的描述中,我将不得不猜测问题*可能会是什么。所以不,你的描述不是“完美的”;你的*源代码*很容易显示出这个缺陷。 –

回答

0

使用对象只需要绑定它。线程更新(在这种情况下工作线程)的对象必须使用

glFlush();

,以确保更新处理,可用于其他方面。