天天看點

OpenGL與MFC程式設計思想

from http://hi.baidu.com/xdwu/blog/item/a7f466dfcb385c1b4954038a.html

花了兩天時間終于把MFC與OpenGL的相關技術學會了,現在可以友善的繪制三維圖形了,小結一下。 一、資料的選取 網上的資料多如牛毛,但精華較少,錯誤百出,誤人子弟。經過精心挑選選擇以下幾項足以。 1、 MSDN上的CUBE示例:說明OpenGL應用程式。這個最有研究價值,但就是缺少注釋和理論說明,需要自己一點點咀嚼代碼。       這個demo雖然比較小,但制作的比較精細,很多細節處理的較好,很多技巧非常值得學習。microsoft bull-man! 2、用Visual C++ 6實作OpenGL程式設計, http://www.yesky.com/185/1817185.shtml     這個例子說的比較詳細,連怎樣操作VC都有了,初級的理論也說了一些,适合入門。但後面說3D的好像有點錯誤,另外螢幕閃爍的解決方法不徹底,沒有完全消除(不是openGL的問題,是MFC消息循環的問題沒處理好)。 3、OpenGL輕松入門: http://soft.yesky.com/lesson/374/2410874.shtml 一本講述基本原理的書 看過以上幾個資料,再見上MSDN的手冊,就可以輕松使用OpenGL繪制三維圖形了! 二、使用OpenGL與MFC繪圖的基本思路 1、繪圖環境的建立(最好放在OnCreate(LPCREATESTRUCT lpCreateStruct)中) WINDOWS的GDI是通過裝置句柄(Device Context以下簡稱"DC")來繪圖,而OpenGL則需要繪制環境(Rendering Context,以下簡稱"RC")來繪圖。GDI中的每一個指令需要傳給它一個DC,而OpenGL是使用目前繪制環境(RC)。一旦在一個線程中指定了一個目前RC,所有在此線程中的OpenGL指令都使用相同的目前RC。這樣我們要做的工作就是建立OpenGL的RC,并把RC同GDI的DC連接配接起來,這樣OpenGL就可以開始繪圖了。步驟如下: A:設定視窗像素格式。(使用PIXELFORMATDESCRIPTOR、ChoosePixelFormat()、DescribePixelFormat()、SetPixelFormat()等完成) B:産生RC。(使用wglCreateContext()完成) C:設定目前的RC,并同DC連接配接起來。(使用wglMakeCurrent()完成) 産生RC是非常耗費資源和時間的一件事情,是以最好系統啟動時産生,關閉時釋放。 釋放RC的操作如下(最好放在OnDestroy()中): HGLRC hrc=wglGetCurrentContext();

if(hrc!=NULL)

{ // make the rendering context not current

   wglMakeCurrent(NULL, NULL) ;

   wglDeleteContext(hrc);

} 至此,繪圖環境準備好了,可以開始繪圖了! 2、三維圖繪制的過程 三維圖繪制好後,要在二維的螢幕上顯示,是以要經過幾次變換才能達到這樣的結果。OpenGL多使用矩陣變換來實作。過程如下: A:進行視點變換,選擇一個觀察點來觀察物體。 B:進行模型變換,把要觀察的模型(物體)通過平移、旋轉、縮放等操作放置到一個合适的觀察位置 C:進行投影變換,觀察點和物體都設定好後,就可以投影在一個平面上。 D:進行視口變換,對投影的結果進行裁剪,決定顯示的大小、位置等。 以上變換都是以矩陣的運算實作的,OpenGL會自己完成,我們隻要通過函數把每種變換的參數設定好就可以了。 每種變換都通過哪些函數完成,查閱OpenGL相關資料即可,網上很多。 3、圖形的繪制及顯示 我們真正要做的工作就是利用OpenGL提供的指令,來繪制各種三維圖形,然後選取合适的視角來觀察并顯示物體即可。 OpenGL繪制圖形的指令很多,也非常豐富,隻有不斷地積累才能繪出适用的三維圖形。 4、MFC下螢幕顯示的閃爍問題 我們知道,在視窗中拖動一個圖形的時候,由于邊畫邊顯示,會出現閃爍的現象。在GDI中解決這個問題較為複雜,通過在記憶體中生成一個記憶體DC,繪畫時讓畫筆在記憶體DC中畫,畫完後一次用Bitblt将記憶體DC“貼”到顯示器上,就可解決閃爍的問題。在OpenGL中,我們是通過雙緩存來解決這個問題的。一般來說,雙緩存在圖形工作軟體中是很普遍的。雙緩存是兩個緩存,一個前台緩存、一個背景緩存。繪圖先在背景緩存中畫,畫完後,交換到前台緩存,這樣就不會有閃爍現象了。 A:将像素格式定義成支援雙緩存的    pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_STEREO_DONTCARE; B:在物體繪制完成後加入這樣一行代碼SwapBuffers(hDC),到此OpenGL繪圖已經沒有閃爍了,但MFC還會反複的重繪背景産生閃爍 C:處理消息循環OnEraseBkgnd,使其不要重繪背景 BOOL CoglView::OnEraseBkgnd(CDC* pDC)

{

// TODO: 在此添加消息處理程式代碼和/或調用預設值

return TRUE;

//return CView::OnEraseBkgnd(pDC);

} 這樣就徹底解決了閃爍問題! 至此,OpenGL已經能與MFC一起很好的工作了。接下來就是使用OpenGL的一些進階特性(光照、紋理等)來增強圖形的顯示效果了! 路漫漫其修遠矣! show一個執行個體看看!

OpenGL與MFC程式設計思想

繼續閱讀