2

如何使用 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 个副本。)

如果需要的话,我对使用多个线程的想法持开放态度。

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

4

2 回答 2

0

您可以通过共享上下文来共享携带数据的 OpenGL 缓冲区。Windows 中的调用是 names wglShareLists

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

于 2012-11-12T21:24:44.517 回答
0

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

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

OpenGL 渲染上下文只能在一个线程中处于活动状态。一个线程只能有一个活动的渲染上下文。因此,对于多个线程,您将需要多个渲染上下文。

可以在 OpenGL 上下文之间共享资源。这样就不必多次存储资源。

于 2012-11-12T21:29:16.150 回答