2016-11-25 39 views
0

顯示渲染全球OpenGL上下文我想在許多QOpenGLWidget是在同一個窗口(具有了QSplitter架構分離)以顯示與不同的觀點的場景。 重要的是,我想我的存儲場景數據(幾何形狀和紋理),只在GPU上一次。 但是,每個QOpenGLWidget,有自己的QOpenGLContext。用於FBO在許多QOpenGLWidget

我的想法是創建一個場景渲染成FrameBufferObject(不QFrameBufferObject)一個獨立的情況下,並在有關QOpenGLWidget使用所產生的紋理。

更技術性的,我的方法是創建一個新的QOpenGLContext和QOffscreenSurface。 但是,當我想用​​我的QOpenGLContext給出的產生QOpenGLFunctions,它即使我檢查了,我的創造QOpenGlContext有效分割故障停止。

在更普遍的方式,這是很難我理解QOpenGLContext的作用,表面(QOffscreenSurface在我的情況)和makeCurrent功能。

我的要求是要了解什麼是做到這一點的好辦法,爲什麼我得到一個分段錯誤。

+0

需要注意的是在同一個頂層窗口的所有QOpenGLWidgets已經與對方分享,因爲他們與使用Qt來辦窗口本身的「合成」(組裝爲2D紋理QOpenGLWidgets內部GL上下文共享,其他小部件等)。所以你不需要做任何特殊的事情來分享這些情境之間的東西。更重要的是,甚至還有一個標誌可以讓應用程序的所有頂級窗口都共享這些上下文。 – peppe

+0

是的,但即使共享,頂點數組對象不是!我真的想避免處理這類問題。你不認爲渲染紋理是集中渲染的好辦法嗎? –

+0

當然,如果你願意,你可以這樣做。同樣,FBO不會被共享,但支持貼圖或渲染緩衝區會。 – peppe

回答

0

我回來與我的問題的答案。

其實我用我的第一次初始化QOpenGLWidget的上下文作爲全球範圍內,以避免創建一個新的。

棘手的部分是讓需要它的(加GPU的數據或使用FBO)在全球範圍內目前的每次。

的paintGL步驟很簡單: - 使全球範圍內的電流。 - 開始fbo錄製。 - 渲染場景。 - 停止fbo錄製。 - 使QOpenGLWidget當前上下文。 - 在屏幕上渲染fbo結果。

我使用gDEBugger檢查了我的記憶,我所有的記憶是在全球範圍內(並且只存儲一次)。