从另一个线程调用OpenGL函数

4

我的应用程序有两个线程:A和B。A是主线程,B是我的视频线程。 视频线程具有初始化的OpenGL上下文,其中OpenGL函数可以正常工作。 然而,当我从线程A调用OpenGL函数时,该函数会失败,并显示1282错误(GL_INVALID_OPERATION)。 是否可能从我的主线程(A)调用OpenGL函数?


我不确定你为什么想这样做。请详细说明一下。 - batbrat
2个回答

12
  1. 除非你正在进行实际的缓慢内容后台渲染,否则这可能不会使你的性能产生差异。

  2. 在 Windows 上,open gl 上下文是针对每个线程的。确保在尝试调用 open gl 函数之前从工作线程中调用 wglMakeCurrent。

  3. Open GL 不是线程安全的。如果你试图在多个线程上将同一上下文变为当前上下文,它不会阻止你,而是会导致异常。


我曾经遇到过同样的问题,glGenTexture()在不同的线程中调用时无法创建纹理ID。现在已经添加了一些防御性检查。但是我注意到的是,glGetError() 似乎 起作用;然而,它并没有清除错误,导致我陷入了一个无限循环中;while(glGetError()){...} 永远不会结束。 - Ruud van Gaal

3

GL不是线程安全的,因此您不能从2个不同的线程调用GL函数。您必须使用互斥锁来保护每个gl部分,这会消除您所期望的任何性能提升,并增加互斥锁定的开销和可能需要的上下文切换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接