資源描述:
《vc環(huán)境下opengl多視圖窗口的實現(xiàn)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、軟件報/2006年/10月/23日/第019版開發(fā)編程應(yīng)用實例VC環(huán)境下OpenGL多視圖窗口的實現(xiàn)編程語言:VisualC++6.0重慶龔勛摘要:本文在VisualC++環(huán)境下,以4個OpenGL窗口為例,介紹多個OpenGL窗口的實現(xiàn),在此框架的基礎(chǔ)上,可以實現(xiàn)類似3DSMax多視角3D軟件編程。關(guān)鍵字:OpenGL;三維;多視角;多視圖;OpenGL是在SGI等多家世界聞名的計算機公司的倡導下,以SGI的GL三維圖形庫為基礎(chǔ)制定的一個通用共享的開放式三維圖形標準。很多著名的產(chǎn)品包括動畫制作軟件SoftImage和3DS
2、tudioMAX等都是在它的基礎(chǔ)上實現(xiàn)的。從本質(zhì)上說,OpenGL是一個完全可移植并且速度很快的3D圖形和建模庫。在Windows平臺上,OpenGL可以方便地與VisualC++(在下文中簡稱VC)結(jié)合,創(chuàng)建精致漂亮的3D圖形。通常在VC環(huán)境下編寫OpenGL程序都是單視圖的模式,本文介紹如何把單個視圖拆分為多個,如何在各個視圖上進行切換繪圖。1.OpenGL繪圖1.1.OpenGL繪圖簡介具有Windows編程經(jīng)驗的人都知道,在Windows下用GDI繪圖必須通過設(shè)備上下文(DeviceContext簡稱DC)調(diào)用相應(yīng)的
3、繪圖函數(shù);用OpenGL繪圖也是類似,OpenGL函數(shù)也通過“渲染上下文”(RenderingContext簡稱RC)完成三維圖形的繪制。正如設(shè)備上下文DC要存儲GDI的繪制環(huán)境信息如筆、刷和字體等,渲染上下文RC也必須存儲OpenGL所需的渲染信息如像素格式等。DC調(diào)用每個GDI函數(shù)都需要一個DC句柄,而RC不同,所有的OpenGL函數(shù)都是在當前RC(當前RC概念見1.2節(jié))下進行的,故不需要傳入RC句柄。Windows系統(tǒng)支持OpenGL渲染,Win32庫提供了用于初始化像素格式、控制渲染和使用OpenGL擴展的函數(shù)(w
4、gl打頭的函數(shù))。下面對幾個常用的wgl函數(shù)的功能進行簡單介紹。(1)HGLRCwglCreateContext(HDChdc)該函數(shù)用來創(chuàng)建一個OpenGL可用的渲染上下文RC。(2)BOOLwglDeleteContext(HGLRChglrc)該函數(shù)刪除一個RC。(3)HGLRCwglGetCurrentContext(void)該函數(shù)返回線程的現(xiàn)行RC,如果線程無現(xiàn)行RC則返回NULL。(4)HDCwglGetCurrentDC(void)該函數(shù)返回與線程現(xiàn)行RC關(guān)聯(lián)的DC,如果線程無現(xiàn)行RC則返回NULL。(5)B
5、OOLwglMakeCurrent(HDChdc,HGLRChglrc)該函數(shù)把hdc和hglrc關(guān)聯(lián)起來,并使hglrc成為調(diào)用線程的當前RC。1.2.OpenGL多視圖渲染的原理上文提到,用OpenGL繪圖首先必須創(chuàng)建一個RC,在創(chuàng)建RC時與一個DC建立聯(lián)系(RC也只能通過DC來創(chuàng)建),然后再將其設(shè)置為當前RC,這樣,OpenGL的函數(shù)就可以通過RC對應(yīng)的DC畫到相應(yīng)的顯示設(shè)備上。一個RC是否是當前RC,這是針對調(diào)用線程而言的,一個線程在擁有現(xiàn)行RC進行繪圖時,第1頁共5頁別的線程將無法同時繪圖。一個線程一次只能擁有一個
6、現(xiàn)行RC,但是可以擁有多個RC;一個RC也可以由多個線程共享,但是它每次只能在一個線程中是現(xiàn)行RC;一個RC可以對應(yīng)多個DC,但在繪圖時,只能同時與一個DC掛鉤。本文實現(xiàn)多視圖采用多個RC和多個DC的模式,其中每個視圖對應(yīng)一個DC,每個DC對應(yīng)一個RC,故4個視圖就有4個DC,4個RC,當需要在某個視圖上繪圖時,就將該RC切換為當前RC。下文將結(jié)合作者的工作經(jīng)驗,以實例的方式介紹如何在VC6.0下創(chuàng)建多個(以4個窗口為例)OpenGL繪圖窗口的程序。2.實現(xiàn)窗口的拆分首先用VC6.0AppWizard創(chuàng)建一個SDI的MFC應(yīng)
7、用程序MultiWindow,然后通過一個CSplitterWnd對象將窗口用靜態(tài)拆分的方式劃分為4部分,如圖1。實現(xiàn)拆分過程如下:(1)為CMainFrame添加一個CSplitter-Wnd類型的對象m_wndSplitter;(2)添加3個視圖類:CTopLeftView,CBottomLeftView,CBottomRightView,這樣,加上CMutiWindowView,一共有4個視圖類;(3)為CMainFrame重載OnCreate-Client()函數(shù),在函數(shù)體添加代碼為4個子窗口關(guān)聯(lián)相應(yīng)的視圖,如下:m
8、_wndSplitter.CreateStatic(this,2,2);//為每個窗口生成視圖m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTopLeftView),CSize(100,100),pContext);m_wndSplitter.Cr