青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 12,  comments - 6,  trackbacks - 0

   馬馬虎虎的看完了《3D數學基礎:圖形與游戲開發》和《OpenGL編程指南》,感覺沒看明白的跟看明白的一樣多...但還是算入門了吧!辭職以后,在家玩的甚歡,太過得以忘形了。這兩天收斂了許多,做了一個簡單的程序,這里想做一些相應的總結。

   文章根據網絡上同名《Visual C++下OpenGL開發框架與應用》改寫,主要是問了節省時間,并且總結一下OpenGL在MFC中的多文檔框架下的搭建過程,加以備忘。下面是這兩天做的程序的截圖,特此留念!

                  

   以下是《Visual C++下OpenGL開發框架與應用》內容:

   OpenGL全稱"開放式圖形庫",是由SGI公司開發的低層三維圖形API,目前在圖形開發領域已經成為工業標準。現今市面上關于OpenGL方面的書籍不在少數,但是大多是講解句法和實例,缺乏對其整個程序開發框架的總結與把握,所以總體上顯得比較凌亂。本篇文章主要針對初學者(最好要有圖形方面的基礎知識)而制作的,旨在通過對OpenGL 的整個知識結構的介紹,來具體剖析其內在運行機制,并且結合實際開發經驗總結出在VC平臺下的OpenGL開發框架,最后給出一個例程來說明這一框架的具體應用。

一、OpenGL基礎知識

  OpenGL是一種開放式的圖形軟件開發包,它采用C語言風格,提供大量的函數來進行圖形方面的處理,一般編程使用的函數庫包括:

  OpenGL圖形庫-----函數以gl開頭,可以實現比較簡單的繪制功能,核心函數共115個。這些函數可以運行在現在任何主流操作系統中。

  OpenGL實用庫-----函數以glu開頭,其函數功能更高級一些,如繪制復雜的曲線曲面、高級坐標變換、多邊形分割等,共有43個。這些函數可以運行在現在任何主流操作系統中。

  OpenGL輔助庫-----函數以aux開頭,它們是一些特殊的函數,包括簡單的窗口管理、輸入事件處理、某些復雜三維物體繪制等函數,共有31個。它只能在Win32平臺下運行。

  OpenGL實用工具開發庫----函數以glut開頭,它們提供更為復雜的繪制功能,此函數由glut.dll來負責解釋執行。

  Windows專用函數庫-----以wgl開頭,負責OpenGL與Windows窗口系統的連接,共有6個。

  Win32函數------無專用前綴,實際上為API函數,共5個,用來處理比如象素格式的選擇及雙緩沖等功能。

  OpenGL提供的函數一般是以客戶機/服務器的模式來運行的,即執行繪制圖形功能的應用程序作為客戶機,而OpenGL函數庫(實際上是一些動態鏈接庫,比如opengl32.dll,glu.dll等)作為服務器,當應用程序發出繪制請求時,服務器負責對這些繪制請求進行解釋,然后把這些處理過的請求發送給圖形顯示硬件,這樣就實現了繪圖的目的。另外由于它這種特有的運行機制也實現了網絡的透明性,即當應用程序與核心圖形庫不在同一臺機器上時,其程序的代碼完全跟它們在同一臺機器上的一樣,節約了通訊開銷。

  那么在Windows操作平臺下,如果使用OpenGL圖形庫函數來開發應用程序呢?我們知道,使用GDI(圖形設備接口)開發應用程序時,首先需要獲得一個Device Context(設備描述表,簡稱DC),然后才能在這個DC下完成繪圖工作,這一過程就類似于現實生活中紙和筆的關系,DC就是紙,而象刷子、畫筆這樣的GDI對象就是筆。從Windows內部運行機制來分析,DC應該理解為狀態保持器,就是它可以而且必須保存當前系統的狀態,這些狀態包括:當前的畫筆、刷子等GDI的具體類型(顏色、粗細等),當前的調色板類型以及系統的其他信息。當用戶開始在DC上進行繪制工作時,系統就會先查看DC中相應的當前狀態值,然后利用這些狀態值進行圖形繪制,如果用戶希望改變當前狀態值,那么可以通過SelectObject這樣的Win32函數來將指定的狀態或者對象選入DC即可。

  實際上基于OpenGL的應用程序也是這樣的,只是這里不是直接在DC上進行繪制工作,而是通過Render Context(渲染描述表或者繪制描述表,簡稱為RC)這樣一個橋梁在DC上進行繪制工作,對于程序來說實際上可以理解為就是在RC上繪制圖形。另外只要RC不被釋放(有效),那么就可以進行繪制工作;相比之下,DC卻需要不斷的創建和釋放。

  所以要使用OpenGL圖形庫進行圖形應用開發,首先要獲得RC,然后要將其設置為"當前RC",最后后面所有的繪制工作都是在"當前RC"下面進行的,直到"當前RC"無效為止。

二、VC下的OpenGL的程序框架

  在目前眾多的Windows應用程序開發工具中,微軟公司的VC6.0已經成為OpenGL圖形應用的首選開發工具。而要使用OpenGL圖形庫來開發2D/3D的應用程序,就必須解決程序框架的問題。由前面介紹的基礎知識可以清楚的看到,不能直接象利用GDI開發圖形程序那樣使用OpenGL,以下就介紹多文檔應用程序情況下的開發框架,其步驟為:

  1. 首先在視圖類的PreCreateWindow函數內設置窗口類型,防止在窗口重疊時把圖形繪制到子窗口和兄弟窗口。實現代碼如下:

cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;

  2. 然后在視圖類的OnCreate函數下面進行OpenGL的初始化工作,這部分是此框架里最主要的代碼,具體包括:獲取視圖設備描述表、設置合適的象素格式和調色板、創建繪制描述表并將其設置為當前RC。其實現代碼見后面的例程(這部分的代碼基本上所有的程序都一致)。這一步完成后即可進行圖形的繪制工作。

  3. 在視圖類的OnSize函數下面進行視口變換,代碼見后面例程。

  4. 如果需要定時器的數據驅動,那么可以在視圖類的OnTimer下修改數據并調用OnDraw函數即可。

  5. 在OnDestroy函數執行RC及DC的銷毀工作,釋放資源。詳見后面的代碼。

  由上面的框架可以看出,所有的關于OpenGL的程序操作都是在指定的視圖類中完成的,核心就是OnCreate內的函數代碼,而這部分的代碼在大部分程序里面是雷同的,所以后面例程的代碼具有很大的通用性。另外,雖然上面只是討論了多文檔的情況,實際上單文檔的開發框架與其完全類似,這里就不多贅述了。

三、例程分析

  3D游戲里面經常會出現地形這一三維實體,下面的例程就是在一個單文檔應用程序下實現3D地形的顯示。大概思路是建立OpenGL的程序框架,然后初始化地形數據,在此框架上繪制3D地形,由于為了介紹框架,所以程序中涉及到地形數據的初始化和繪制部分都比較簡單,詳見本文的源代碼部分。另外這里也沒有涉及到紋理映射、材質等高級內容,但是實際編程中,為了使3D圖形更生動,往往要應用這些技術。

  此例程的核心代碼及分析如下:

BOOL CTrafficView::PreCreateWindow(CREATESTRUCT& cs)
{
    
// TODO: 在此處通過修改 CREATESTRUCT cs 來修改窗口類或
    
// 樣式
    
//  OpenGL的要求:設置窗口類型
    cs.style |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
 
    
//  MDI 應用的要求:
    
//    cs.lpszClass = AfxRegisterWndClass(CS_OWNDC | CS_HREDRAW | CS_VREDRAW);

    
return CView::PreCreateWindow(cs);
}

void CTrafficView::OnPaint()
{
    CPaintDC dc(
this); // device context for painting
    
// TODO: 在此處添加消息處理程序代碼
    
// 不為繪圖消息調用 CView::OnPaint()
    RenderScene();
}

int CTrafficView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    
if (CView::OnCreate(lpCreateStruct) == -1)
        
return -1;

    
// TODO:  在此添加您專用的創建代碼
    
//獲取客戶區的設備描述表
    m_pDC=new CClientDC(this); 
    
//初始化OpenGL
    InitializeOpenGL(m_pDC); 
    
//初始化OpenGL的一些狀態參數并對地形數據進行初始化
    InitGL(); 
    
return 0;
}

BOOL CTrafficView::InitializeOpenGL(CDC *pDC)
{
    
//進行opengl的初始化工作
    m_pDC=pDC; 
    
//首先把DC的象素格式調整為指定的格式,以便后面對DC的使用
    SetupPixelFormat(); 
    
//根據DC來創建RC
    m_hRC=::wglCreateContext(m_pDC->GetSafeHdc()); 
    
//設置當前的RC,以后的畫圖操作都畫在m_pDC指向的DC上
    ::wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC); 
    
//下面可以進行畫圖操作了
    return TRUE;
}


BOOL CTrafficView::SetupPixelFormat()
{
    
//初始化象素格式以及選取合適的格式來創建RC
    PIXELFORMATDESCRIPTOR pfd = 
        
sizeof(PIXELFORMATDESCRIPTOR), // pfd結構的大小 
            1// 版本號 
            PFD_DRAW_TO_WINDOW | // 支持在窗口中繪圖 
            PFD_SUPPORT_OPENGL | // 支持 OpenGL 
            PFD_DOUBLEBUFFER, // 雙緩存模式 
            PFD_TYPE_RGBA, // RGBA 顏色模式 
            24// 24 位顏色深度 ,color depth
            000000// 忽略顏色位 
            0// 沒有非透明度緩存 
            0// 忽略移位位 
            0// 無累加緩存 
            0000// 忽略累加位 
            32// 32 位深度緩存 
            0// 無模板緩存 
            0// 無輔助緩存 
            PFD_MAIN_PLANE, // 主層 
            0// 保留 
            000 // 忽略層,可見性和損毀掩模 
    }

    
//在DC中選擇合適的象素格式并返回索引號
    int pixelformat;
    pixelformat
=::ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd);
    
if (pixelformat==0)
    
{
        AfxMessageBox(
"no matched pixelformat!");
        
return FALSE;
    }

    
//設置指定象素格式
    if (::SetPixelFormat(m_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)
    
{
        AfxMessageBox(
"can't set specified pixelformat!");
        
return FALSE;
    }

    
return TRUE;
}

BOOL CTrafficView::InitGL()
{
    
//初始化整個場景和OpenGL的狀態變量
    
//初始化地形、圖形等相關數據以便于繪制
    
    
// OpenGL場景初始化(光照、霧化等〕
    glShadeModel(GL_SMOOTH); // Enable Smooth Shading
    glClearColor(0.0f0.0f0.0f0.5f); // Black Background
    glClearDepth(1.0f); // Depth Buffer Setup
    glEnable(GL_DEPTH_TEST); // Enables Depth Testing
    glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do 
    return TRUE; // Initialization Went OK
}

BOOL CTrafficView::RenderScene()
{
    wglMakeCurrent(m_pDC
->GetSafeHdc(), m_hRC);  // 尤為重要,MDI必不可少
    glClearColor(0.0f0.0f0.0f1.0f);
    glClear(GL_COLOR_BUFFER_BIT 
| GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity();
    gluLookAt(
0,7,0,4,4,4,0,1,0); //視圖變換

    
// 場景繪制
    

    glFlush();        
    ::SwapBuffers(m_pDC
->GetSafeHdc()); //交互緩沖區

    
return TRUE;
}

void CTrafficView::OnDestroy()
{
    CView::OnDestroy();

    
// TODO: 在此處添加消息處理程序代碼
    
//刪除當前的RC
    ::wglMakeCurrent(NULL,NULL);
    
//刪除RC
    ::wglDeleteContext(m_hRC); 

    
//刪除DC
    if (m_pDC)
        delete m_pDC; 

}

void CTrafficView::OnSize(UINT nType, int cx, int cy) 
{
    CView::OnSize(nType, cx, cy); 
    
//添加窗口縮放時的圖形變換函數,即視口變換
    glViewport(0,0,cx,cy);
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(
45.0f,(GLfloat)cx/(GLfloat)cy,0.1f,100.0f);
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
}
  

四、小結

  前面介紹了VC下的OpenGL應用程序的開發框架,借助此框架,使得開發人員象使用Win32函數一樣來使用OpenGL提供的圖形庫函數,減輕了開發的難度,增強了程序代碼的魯棒性,因此對使用OpenGL進行圖形應用開發具有較高的借鑒意義。

 

posted on 2010-10-20 00:24 vic.MINg 閱讀(1000) 評論(0)  編輯 收藏 引用 所屬分類: OpenGL

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(1)

隨筆分類(13)

隨筆檔案(12)

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产日本| 亚洲综合色在线| 香蕉成人啪国产精品视频综合网| 亚洲精品美女免费| 亚洲精选中文字幕| 亚洲亚洲精品三区日韩精品在线视频| 亚洲伦理精品| 亚洲欧美日韩成人| 久久一区二区三区国产精品 | 亚洲成人在线观看视频| 亚洲第一区色| 亚洲网站在线| 久久综合给合久久狠狠色 | 欧美精品一区二区三区在线播放| 欧美理论电影在线播放| 国产美女搞久久| 亚洲国产天堂久久综合| 亚洲女同在线| 欧美国产日韩亚洲一区| 亚洲新中文字幕| 欧美国产综合| 狠狠噜噜久久| 亚洲综合日韩中文字幕v在线| 久久中文字幕一区二区三区| 亚洲老司机av| 媚黑女一区二区| 国产精品色婷婷| 亚洲美女中出| 免费在线成人av| 亚洲在线观看视频| 欧美精品一区在线播放| 在线免费观看一区二区三区| 亚洲一区二区综合| 亚洲电影在线观看| 午夜精品一区二区三区在线| 欧美黄色一区| 在线看成人片| 欧美手机在线| 亚洲大胆美女视频| 久久不见久久见免费视频1| 亚洲区第一页| 久久久91精品| 国产片一区二区| 亚洲一区观看| 99国产精品国产精品久久| 欧美成人有码| 91久久精品国产91久久性色| 久久嫩草精品久久久久| 午夜国产欧美理论在线播放 | 在线精品亚洲| 久久先锋资源| 久久爱www| 国产综合自拍| 久久米奇亚洲| 久久精品国产亚洲一区二区三区| 国产精品天天看| 亚洲欧美日韩一区二区在线 | 国产欧美日韩视频| 亚洲欧美成人综合| 亚洲一区二区三区高清| 欧美日韩在线视频一区二区| 一区二区欧美在线观看| 亚洲久久成人| 国产精品av久久久久久麻豆网| 一区二区免费在线观看| 亚洲精品在线观看免费| 欧美三级电影精品| 午夜精品国产| 午夜一区不卡| 亚洲成人影音| 亚洲区一区二区三区| 欧美日韩影院| 欧美在线欧美在线| 久久久精品日韩欧美| 激情综合色综合久久| 欧美成人午夜77777| 欧美精品九九99久久| 亚洲欧美日韩直播| 欧美一区二区私人影院日本| 在线播放亚洲| 亚洲人成网站999久久久综合| 欧美午夜宅男影院在线观看| 欧美在线观看日本一区| 免费欧美电影| 校园春色综合网| 久久综合色88| 亚洲一区二区三区久久| 欧美在线999| 亚洲日韩中文字幕在线播放| 一区二区日本视频| 国外成人在线视频网站| 亚洲国产欧美日韩精品| 国产精品久久久久久久久久三级 | 亚洲欧美日韩国产综合| 久久九九热免费视频| 亚洲视频视频在线| 欧美在线亚洲综合一区| 9国产精品视频| 久久不射电影网| 亚洲在线视频免费观看| 久久在线视频| 性做久久久久久免费观看欧美| 美女成人午夜| 久久久久久久久久看片| 欧美三级午夜理伦三级中视频| 久久亚洲国产精品日日av夜夜| 欧美日韩无遮挡| 欧美国产日韩一区二区三区| 国产视频丨精品|在线观看| 亚洲日本欧美天堂| 亚洲国产精品123| 欧美一区二区大片| 亚洲一区中文| 欧美日韩免费观看一区=区三区| 蜜桃伊人久久| 国产专区欧美专区| 亚洲综合三区| 亚洲综合日韩中文字幕v在线| 欧美电影免费观看高清完整版| 久久夜精品va视频免费观看| 国产欧美日韩精品丝袜高跟鞋 | 欧美日韩一区二区三区在线 | 嫩草影视亚洲| 免费观看成人网| 国产一区二三区| 香蕉亚洲视频| 欧美一区亚洲二区| 国产精品日日摸夜夜添夜夜av | 久久精品国产96久久久香蕉| 国产精品国产一区二区| 一区二区精品| 亚洲影院污污.| 国产精品久久久久aaaa樱花| 在线视频欧美精品| 亚洲女人天堂成人av在线| 欧美日韩一区二区三区在线观看免| 亚洲黄色三级| 99精品国产高清一区二区| 欧美日韩国产高清| aⅴ色国产欧美| 亚洲欧美激情诱惑| 国产精品视频精品视频| 亚洲欧美日韩一区二区三区在线观看| 亚洲一区精品视频| 国产精品天天看| 欧美一区网站| 欧美大片91| 一区二区三区免费在线观看| 欧美日韩中文另类| 久久精品视频一| 国产专区综合网| 久久―日本道色综合久久| 欧美成人免费小视频| 中文精品视频| 国产精品日本一区二区| 久久久久久久久久久久久女国产乱| 欧美99在线视频观看| 99国产精品视频免费观看一公开 | 欧美国产视频在线观看| 一区二区三区欧美| 国产日产欧产精品推荐色| 久久视频国产精品免费视频在线 | 久久精品视频va| 亚洲精品美女久久久久| 欧美一区二区三区视频在线观看 | 亚洲日本中文字幕| 欧美特黄一级大片| 久久精品国产69国产精品亚洲| 欧美成熟视频| 午夜精品久久久久影视| 亚洲国产欧美日韩| 国产欧美日本一区二区三区| 老司机午夜精品视频| 在线亚洲精品福利网址导航| 免费人成精品欧美精品| 亚洲一区二区日本| 亚洲国产另类久久久精品极度 | 一区二区三区产品免费精品久久75 | 亚洲欧洲一区二区三区久久| 欧美在线3区| aa级大片欧美三级| 国语自产精品视频在线看| 你懂的网址国产 欧美| 先锋影音网一区二区| 亚洲精品中文字| 欧美gay视频| 久久国产精品久久精品国产| 一本久道综合久久精品| 影音国产精品| 国产一区二区av| 欧美午夜大胆人体| 欧美精品久久久久久久免费观看| 欧美在线91| 亚洲欧美视频在线观看视频| 一区二区av在线| 亚洲精品视频免费| 亚洲高清视频一区二区| 蜜臀99久久精品久久久久久软件| 午夜精品www| 午夜在线电影亚洲一区|