2017-02-17 101 views
0

背景:glCreateShader給出相同的ID

我有一個着色器類在我的C++/OpenGL3.1/GLSL/Qt的程序。我的程序使用基於不同GLSL源文件的幾個着色器。

我的應用程序可以運行基於該QGLWidget來繪圖執行多種不同的3D渲染,每一個創建自己的着色器。

當我創建我的第一個3d渲染器並初始化着色器時,在glCreateShader & glCreateProgram的幫助下生成着色器ID,沒有任何問題。

問題:

但是,當我創建第二個3D渲染中,OGL功能檢索ID給一模一樣的,但我希望能有新的。這意味着我的兩個渲染器會將數據發送到相同的GPU程序...

很明顯,在GPU程序中,統一變量是混合的,當運行第二個渲染器時,第一個顯示奇怪的渲染。

事實上,當我關閉兩個渲染器之一,所有着色器被殺害......而第二渲染器無法顯示任何內容。

主意?

我完全失去了,我的邏輯推理是glCreateShader & glCreateProgram給ID根據自己的線程ID。 QGLWidget來繪圖運行可能是它自己的線程調用渲染功能,那可就麻煩了持久...

如何解決這個問題的任何想法?

+0

它們是'QGLWidget'還是'QOpenGLWidget'?你還寫了「QGLOpenGL」。前者給出你描述的行爲很可能......? –

+0

我目前使用QGLWidget(這就是我的意思,滑)。 我首先調用'with glFormat'ctor,然後嘗試爲這兩個小部件創建一個上下文,並使用它們各自的上下文和不同的頂級父級(QWidget *動態實例化)調用QGLWidget ctor。我仍然有同樣的問題。 –

+0

我也嘗試使用'QOpenGLWidget'而不是QGLWidget,仍然有兩個不同的父母。在這一點上,它似乎有效,但我的OpenGL窗口小部件在可停靠的窗口小部件中,並且當它們脫離時,它變得很奇怪。看起來不穩定,背景變成黑色,並且沒有在鼠標事件上更新。 –

回答

3

如果同時你QOpenGLWidget共享相同的父窗口,則默認情況下它們共享相同的上下文。如果你不想這樣,更容易的可能是用你的第二個QOpenGLWidget創建一個新的頂層小部件(任何沒有父項的QWidget)。

請注意,這是從舊QGLWidget來繪圖類不同。 From Qt documentation

當多個QOpenGLWidgets作爲孩子加入到同一個頂層窗口小部件,它們的上下文將互相分享。這不適用於屬於不同窗口的QOpenGLWidget實例。

這意味着同一窗口中的所有QOpenGLWidget都可以訪問彼此的可共享資源,如紋理,並且不需要額外的「全局共享」上下文,就像QGLWidget一樣。

+0

這最終完美的作品。謝謝。 –

+0

快樂它幫助!不要猶豫,告訴你是否有其他值得一提的事情可以幫助你。 –

+0

我發現glReadPixels在OpenGLWidget類中沒有像預期的那樣工作。它從左下角返回應用程序中拾取的圖像,而不是讀取OGL canevas。這個ftn不應該意識到全局應用程序 - 像素 - 但僅限於OGL wdgt。而且它不會讀取好的緩衝區,並從顯示的緩衝區中選擇圖像而不是後端圖像,而不管glReadBuffer調用。在ccl中,我沒有按預期使用OGL小部件,但文檔並不清楚如何處理緩衝區,或者仍需要進行一些修改。 –

2

還有就是要解決沒有問題。

每個QGLWidget來繪圖都有自己的OpenGL context。而且,除非你是他們之間明確共享對象,每個上下文對象都有其自己單獨的列表。

您只能使用OpenGL的對象與創建它的OpenGL上下文。只要你保持對象不同,並且只在創建它的上下文中使用它們,你應該沒問題。