我试图在60 fps的CWnd窗口中做一些opengl 1.0动画。我创建了CWnd的子类:
类COpenGLControl:public CWnd { ... }
我发现是否使用了内置计时器" setTimer()"并将其设置为每1000/60毫秒触发一次,所有opengl命令都能够正确渲染。但是,如果我使用单独的线程实现自己的计时器,则不会绘制任何内容。我得到的只是一个黑屏。
有没有办法从不同的线程发出opengl命令?
答案 0 :(得分:1)
即使您不打算从多个线程发出GL调用,您也必须考虑OpenGL的线程规则:OpenGL上下文一次最多只能由一个线程使用。 (并且,每个线程,任何时候最多只能有一个活动的GL上下文)。这并不意味着您不能在多个线程中使用相同的上下文,或者在一个线程中创建它并在另一个线程中使用它,您只需要明确地"交出"从一个线程到另一个线程的上下文。
我不知道你是否在GL上下文处理中使用了一些进一步的图书馆,所以我假设你正在使用你的操作系统的本机API - 在这种情况下是wgl。相关功能是wglMakeCurrent()
。因此,交出一个当前"在线程A到线程B中,线程A必须首先调用wglMakeCurrent(NULL,NULL)
,然后线程B才能通过wglMakeCurrent(someDC, myGLCtx)
获取上下文。您当然可以多次切换GL上下文,但这会带来巨大的同步开销,应该避免使用。
来自您的评论:
可行吗?如果我也在计时器线程中创建了上下文?
是的,它会的。
只是旁注:创建根本不是问题,因为创建GL上下文不会自动使其成为当前的"到一个线程 - 所以你可以在线程A中创建它,然后直接将它当前线程B。