2014-10-09 52 views
0

我想在60 fps的CWnd窗口中做一些opengl 1.0动画。我创建了一个子类的CWnd:MFC:如何从不同的线程绘制opengl?

类COpenGLControl:公众的CWnd { ... }

我发现,如果我使用内置的定时器“SetTimer的()”,并将其设置为开枪每1000/60毫秒,所有的opengl命令都能正确渲染。但是,如果我使用单独的线程实现自己的计时器,则不会绘制任何内容。我得到的只是一个黑屏。

有没有办法从其他线程发出opengl命令?

+1

请阅读:http://stackoverflow.com/questions/11097170/multithreaded-rendering-on-opengl – xMRi 2014-10-09 09:00:15

+0

感谢您的答复。看完这篇文章后,看起来我所做的有点不同。我不想多线程渲染器。我只想在除了CWnd线程和跨平台之外的单个线程中完成所有的opengl调用。这就是为什么我正在做我自己的计时器 – 2014-10-09 09:38:09

+1

也许错误代码可能有助于调查。上下文必须绑定在您从中调用命令的线程中。 – Raki 2014-10-09 10:40:19

回答

1

即使您不打算从多个线程发出GL调用,您也必须考虑OpenGL的线程规则:OpenGL上下文一次最多只能有一个线程使用。 (并且,每个线程在任何时候最多只能有一个活动的GL上下文)。这并不意味着你不能在多个线程中使用相同的上下文,或者在一个线程中创建它并在另一个线程中使用它,你只需要明确地将上下文从一个线程“交付”到另一个线程。

我不知道你是否使用一些进一步的图书馆为GL上下文处理,所以我假设你正在使用您的操作系统的本地API - 在这种情况下,wgl。相关功能是wglMakeCurrent()。因此,为了将线程A中的“当前”上下文移交给线程B,线程A必须在线程B通过wglMakeCurrent(someDC, myGLCtx)获得上下文之前首先调用wglMakeCurrent(NULL,NULL)。您当然可以随意多次切换GL上下文,但这会带来巨大的同步开销,应该避免。

从您的评论:

会的工作。如果我在计时器线程也创建上下文?

是的,它会。

只是一个侧面说明:创建是不是这里的问题可言,因为创建一个GL上下文不会自动使“当前”的话题 - 所以你可以在线程A创建事后使它当前直接线程B.

+0

非常感谢。这解决了我的问题。至于性能,所有的绘图都将在计时器线程上完成。只有一些初始设置将在UI线程上完成,这将在定时器被触发之前完成。所以我相信这应该没问题。 – 2014-10-13 23:28:47