文章出處

     什么是繪制上下文(Rendering Context)

      初學OpenGL,打開紅寶書,會告訴你OpenGL是個狀態機,OpenGL采用了客戶端-服務器模式,那時覺得好抽象,直到后來了解了繪制上下文才把這些聯系起來。我們可以認為每一個硬件GPU是個服務器,每一個繪制上下文對應于申請的一個客戶端,一個客戶端維護著一套狀態機,如果兩個窗口分別對應兩個不同的繪制上下文,則兩個窗口彼此狀態獨立。申請繪制上下文,意味著系統資源的申請,每個繪制上下文還是需要不少資源的,記得曾經試過在chrome的TAB頁不斷加載WebGL頁面,由于WebGL使用的是OpenGL ES,同樣需要繪制上下文,當加載三十多個頁面的時候,Chrome整個崩潰了。

     所有的OpenGL調用,都需要指定是在哪個上下文環境下調用的。不同的上下文中,同樣的資源ID,可能對應于各自上下文中不同類型的資源。

     不同的操作系統,都有各自的繪制上下文創建、和設置當前繪制上下文的API。

     如何創建繪制上下文

     我們一般做Demo程序,都會使用GLUT,所以很多人可能并沒有自己創建過繪制上下文。GLUT的函數GlutCreateWindow除了創建了一個窗口,同時還創建了一個繪制上下文,并將創建的繪制上下文設置為當前的繪制上下文。對于Windows平臺,首先創建一個設備上下文(Device Context,DC),以DC為輸入,可以創建一個繪制上下文。創建繪制上下文以后,調用MakeCurrent,將創建的上下文設置為當前的繪制上下文。

     創建了繪制上下文,并設置為當前上下文以后,還不能使用OpenGL最新的特性,調用OpenGL 1.1以后的API仍然會崩潰。一般我們使用Glew庫,調用glewInit(),得到OpenGL隨顯卡驅動一起發布的新特性的函數入口地址。

    繪制上下文和線程

   兩個線程同時MakeCurrent到同一個繪制上下文,會導致程序崩潰。大型程序的一般做法是申請一條線程,專門用于繪制,創建線程時,為該繪制線程申請一個繪制上下文,一直作為當前的上下文。所有的繪制相關的操作,都在繪制線程完成。

   上下文之間的資源共享

   每個窗口一個上下文,優點是可以保證狀態機不互相影響。但多個窗口需要使用同一份紋理,如何避免重復的資源申請呢?答案是上下文之間的圖形資源可以共享,先創建上下文A,再以A為輸入,創建上下文B,則B可訪問在A上下文下創建的紋理資源。紋理、shader、Buffer等資源是可以共享的,但Frame Buffer Object(FBO)、Vertex Array Object(VAO)等容器對象不可共享,但可將共享的紋理和VBO綁定到各自上下文的容器對象上。

 
分類: OpenGL

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()