2013-08-01 21 views
1

圖形用戶界面在其窗簾下隱藏着神祕的力學。它在單個屏幕上混合2D和3D上下文,並允許這兩個截然不同的世界無縫組合。但是他們以什麼方式和在哪個層面實際交錯?GTK +和OpenGL庫如何在單個X服務器上協作?

實踐表明,OpenGL上下文可以嵌入2D小部件庫中,因此整個2D接口可以用OpenGL支持。另外一些應用程序可能會探索硬件加速,而其他應用程序則不會(在同一屏幕上渲染時)。圖形卡是否「瞭解」屏幕上的2D和3D區域,窗口管理器是否創造了一個前後一致的幻覺? ...可以注意到加速的窗口(3D,視頻)「跳躍」以適應2D界面,例如,滾動網頁或在屏幕上移動視頻播放器。

這個問題似乎是微不足道的,但我還沒有遇到任何人能夠給我一個全面的答案。一個答案,可以讓我將OpenGL上下文嵌入到GTK +應用程序中,並理解它爲什麼以及如何工作。我已經嘗試了GtkGlExt和GLUT,但我想深入理解這個主題,並將自己的解決方案作爲學術項目的一部分編寫。我想知道X,GLX,GTK,OpenGL和窗口管理器之間的關係以及如何探索這個圖書館網絡來自覺地編程它。

我不指望有人會在這裏寫論文,但我會很感激任何有關該主題的文章,建議或鏈接。

+0

[GUI輸出如何從應用程序到硬件級別工作?](http://stackoverflow.com/questions/8777531/how-does-gui-output-work-from-application-to-hardware-級別) – datenwolf

+0

你覺得太複雜了。 OpenGL只是您可以用來繪製到常規X11窗口的另一個API。 GTK +本身(如果在X11上運行的話)將只使用由X服務器提供的圖形原語,它們是X核心,XRender和GLX/OpenGL。看到我的回答http://stackoverflow.com/a/8777891/524368所以徹底的解釋。 – datenwolf

+0

@datenwolf感謝您的回答 - 我抓住了繪圖的GTK +庫圖的總體思路。但是它是如何在相反的方向上工作的,即本地窗口事件如何傳播迴應用程序?我知道如何用Xlib或WinAPI本地捕捉它們;以及如何使用GLUT。但是,是否有非GLUT便攜式解決方案可供使用,例如:同時爲GTK +實現一個支持OpenGL的小部件? –

回答

5

你在想太多,太複雜了。像GTK +或Qt這樣的工具包對一些東西加了一層抽象,實際上很簡單:系統的圖形設備由一個處理器和一些可以操作的內存組成。在最簡單的情況下,處理器是常規的系統CPU,內存是正常的系統內存。現代計算機具有專用圖形處理器(GPU),但它具有自己的高帶寬內存。

內存容納幀緩衝區。從邏輯上講,幀緩衝區是一個二維數組值。 GPU可以被編程爲以某種方式處理幀緩衝器中的值。這可以用來繪製幀緩衝區。顯示畫面的監視器連接到一個特殊的電路,它將內存中某個幀緩衝器的數據連續輸入到屏幕(通常稱爲RAMDAC或CRTC)。所以在GPU的內存中有一個直接進入屏幕的幀緩衝區。如果您在那裏畫畫,事情會出現在屏幕上。

與X11服務器一樣,程序可以加載「知道」如何對GPU進行編程以繪製圖形基元的驅動程序。 X11本身定義了某些圖形基元,擴展模塊可以添加更多的圖元。 X11本身允許將GPU內存中的幀緩衝區分隔成稱爲Drawables的邏輯區域。屏幕上的framebuffer上的Drawables被稱爲Windows。由於邏輯Windows可以重疊,所以X服務器還管理Z堆棧,它用於對Windows進行重新排序。每當一個客戶想提請一些窗口,X11服務器會告訴GPU,繪製操作將修改只有那些幀緩存,它的窗口繪製的像素是可見的(這就是所謂的「像素所有權測試」)。 X11服務器還將創建不屬於屏幕幀緩衝區內存區域的Drawable(即幀緩衝區)。那些被稱爲X11術語或pbuffer而使像素映射(也有特殊的擴展其可以移動一個窗口關閉屏幕也)。

但是,所有這些Drawables只是內存。從技術上講,這些都是Canvas的東西。這被稱爲「圖形原語」。 X11本身提供了一個名爲X core的特定集合。還有一個名爲XRender的事實標準擴展,它提供了在X核心中找不到的原語。但是既不X11芯也不XRENDER提供其可生成3D繪圖的印象圖形基元。所以還有另一個擴展,稱爲GLX,它向X11服務器傳授另一組圖形原語,即以OpenGL的形式。但是X核心,XRender和GLX/OpenGL都是不同的鋼筆,畫筆和鉛筆,它們都運行在相同類型的畫布上,即由X11管理的簡單幀緩衝區。

那麼像Qt或GTK +這樣的工具包又有什麼用呢?那麼,他們使用X11和它提供的圖形基元來實際繪製小部件,比如按鈕,菜單和類似的東西,X11並不知道。

相關問題