2014-04-05 19 views

回答

2

在當前的Windows和Linux驅動程序模型中,OpenGL上下文與特定的圖形掃描幀緩衝區綁定。如果GPU架構允許(例如NVidia SLi和AMD CrossFire),掃描幀緩衝區完全可能跨越多個連接的顯示器甚至GPU。

然而,不同廠商的GPU(例如NVidia和Intel)不能共用一個掃描輸出緩衝器。或者如果所有NVidia或AMD未使用SLI或CrossFire連接GPU。

因此,如果顯示器連接到不同的顯卡,那麼這可能發生。

但這只是一個軟件設計限制。從顯示掃描中分離圖形渲染是完全可能的。這實際上形成了混合圖形的技術基礎,其中一個快速GPU渲染到由不同GPU(例如NVidia Optimus)管理的掃描緩衝存儲器中。

解決這個問題的低懸水果將會在窗口傳遞到與不同GPU相關的屏幕上時重新創建上下文。但是這有一個問題:如果窗口在其中一個屏幕上的屏幕之間分裂,它將保持黑色。同時重新創建上下文以及上傳所有數據可以是長度操作。而且在您的情況下,其他屏幕上的設備通常與原始上下文的功能集不兼容。

解決方法是在屏幕外的幀緩衝區對象(FBO)上執行所有的渲染,然後將內容複製到CPU內存,然後使用GDI操作將內容複製到目標窗口。然而,這種方法有一個巨大的缺點,即涉及到完整的內存往返和增加的延遲。

設置此步驟將是:

  • 識別屏幕與您要使用

  • 創建集中在該屏幕上隱藏窗口的GPU。 (即,不要在CreateWindow中將WS_VISIBLE作爲樣式,也不要在其上調用ShowWindow)。

  • 在這個窗口中創建一個OpenGL上下文;它不一定是雙緩衝PIXELFORMAT,但通常雙緩衝提供更好的性能。

  • 創建目標,用戶可見窗口;不要將OpenGL上下文綁定到此窗口。

  • 設置在OpenGL上下文一個幀緩衝區對象(FBO)

    • 此FBO的渲染目標是要創建以匹配目標窗口的客戶RECT大小;當窗口被調整大小時,調整FBO渲染緩衝區的大小。用於雙緩衝操作
  • 設置該renderbuffers的尺寸

    • 當renderbuffers'大小的變化,所以需要PBO相匹配的像素緩衝器對象(PBO)
    • 設置2渲染對象
  • 在OpenGL中呈現到FBO,則像素內容傳輸到PBO(glBindBuffer,glReadPixels)

  • 映射PBO使用glMapBuffer處理內存,並使用SetDIBitsToDevice函數將數據從映射的內存區域傳輸到目標窗口設備上下文;然後取消映射PBO

+0

Aaaaah,所以在大多數情況下,它應該沒問題,只要有人構建這樣的混合型計算機......對我來說沒問題。謝謝你的答案datenwolf! –

相關問題