具有不同刷新率的OpenGL多头vsync

时间:2012-11-12 20:51:40

标签: windows winapi opengl

如何使用OpenGL(在Windows 7上)以不同分辨率和刷新率驱动多个显示器(多头),并且仍然能够在设备之间共享纹理?

我有一个多头gpu。它驱动4个头。 (碰巧是AMD FirePro V7900,如果它很重要。)磁头都共享一个“场景”(顶点和纹理数据等),但我希望每次在显示器上发生vsync时渲染这个场景(每个头本质上是一个不同的视口)。但问题是不同的头部可能处于不同的刷新率。例如,某些显示器可能是60Hz,有些可能是30Hz,有些可能是24Hz。

当我呼叫SwapBuffers呼叫阻止时,我无法确定哪个头需要渲染到下一个。我希望Direct3D9的IDirect3DSwapChain9::Present带有D3DPRESENT_DONOTWAIT标志,以及相关的D3DERR_WASSTILLDRAWING返回值。使用这种方法,我可以确定要渲染到下一个头。通过循环轮询不同的头,直到一个成功。但我不知道OpenGL中的等效方法是什么。

我已经发现wglSwapIntervalEXT(1)使用vsync。我可以在HDC之间切换,通过单个HGLRC渲染到不同的窗口。但刷新率差异让我感到困惑。

我不知道如何让单个HGLRC以不同的刷新率渲染所有这些显示器。我认为它必须是单个HGLRC才能有效利用共享纹理(和其他资源)......如果我错了,请纠正我。如果资源与多个HGLRC重复,那对我来说并不重要,因为我希望这会将我的内存减少到25%(1个GPU上的4个头:所以我不想要任何资源的4个副本。)

我愿意使用多个线程,如果这就是它。

有人可以告诉我如何构建我的主循环,以便我可以共享资源,但仍以自己的刷新率和分辨率驱动显示器吗?

2 个答案:

答案 0 :(得分:0)

您可以通过共享上下文来共享承载数据的OpenGL缓冲区。 Windows中的调用名称为wglShareLists

使用它可以为每个窗口提供在自己的线程中运行的自己的渲染上下文,同时所有上下文共享其数据。多窗口V-Sync实际上是多线程OpenGL有意义的少数情况之一。

答案 1 :(得分:0)

我之前没有做过这样的事情。

看起来你需要多个线程才能获得独立的刷新率。

OpenGL渲染上下文只能在一个线程中激活。一个线程只能有一个活动的渲染上下文。因此,有多个线程需要多个渲染上下文。

OpenGL上下文之间可能share resources。有了这个,没有必要多次存储资源。