如何使用 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 个副本。)
如果需要的话,我对使用多个线程的想法持开放态度。
有人能告诉我如何构建我的主循环,以便我可以共享资源,但仍然以自己的刷新率和分辨率驱动显示器吗?