我正在使用OpenGL來加速GUI渲染。它工作正常,但是當用戶將窗口拖入不同的顯示器(可能連接到不同的GPU)時,它會開始渲染黑色內部。當用戶將窗口移回原始顯示時,它會再次開始工作。 我有Windows XP的這份報告,我很抱歉現在無法檢查Win 7/8和Mac OS X. 任何想法該怎麼辦?當用戶將窗口移動到不同的顯示器時,OpenGL上下文停止工作
回答
在當前的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
- 1. selenium webdriver停止工作,當點擊不同的窗口
- 2. OpenGL在移動窗口時停止繪圖lwjgl
- 3. C#窗體不會加載,直到OpenGL動畫停止工作
- 4. 窗口停止移動時檢測?
- 5. 當用戶移動地圖時,停止MKMapView移動到用戶當前位置
- 6. 自舉窗體當屏幕寬度減小時,下拉窗口停止工作
- 7. 當移動到包中時,getResources()停止工作
- 8. 調試器停止工作,並停止顯示活動進程
- 9. 當顯示粘貼導航時,保持窗口不移動
- 10. 當用戶移動窗口時,PushFrame鎖定WPF窗口
- 11. 如何使用OpenCV在不同的顯示器上顯示不同的窗口
- 12. jQuery的窗口滾動停止擊發作爲用戶滾動
- 13. Javascript倒數計時器,當窗口不在焦點時停止
- 14. 在調整窗口大小時停止移動文字
- 15. 如何停止用戶在vb.net中移動控制檯窗口
- 16. 當導航欄顯示時,使用Bootstrap:JS函數停止工作
- 17. 控制器在移動到不同的包之後停止工作
- 18. 當我將我的網站移動到測試服務器上時,「加入購物車」按鈕停止工作
- 19. 當模式被激活時,如何停止主窗口顯示滾動條?
- 20. jquery移動彈出窗口不顯示。
- 21. 當用戶註銷時,Excel COM自動停止工作
- 22. Android:停止顯示LogCat窗口
- 23. 當AcionListener啓動時,keyListener停止工作
- 24. 當使用鼠標懸停來顯示文本時,文本向下移動
- 25. 使用ubuntu在不同的顯示器上共享opengl上下文
- 26. 停止作爲最上方的窗口
- 27. opengl glut停止工作
- 28. 當你移動Tkinter窗口停止程序
- 29. 當移動.jar時Java保存方法停止工作
- 30. 將窗口移動到左上角
Aaaaah,所以在大多數情況下,它應該沒問題,只要有人構建這樣的混合型計算機......對我來說沒問題。謝謝你的答案datenwolf! –