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

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 閱讀(1016) 評論(0)  編輯 收藏 引用 所屬分類: OpenGL

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2012年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用鏈接

留言簿(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>
            国产精品红桃| 亚洲免费伊人电影在线观看av| 欧美激情免费在线| 亚洲一级片在线看| 久久久久久**毛片大全| 亚洲国产免费| 国产精品久久久久久久久久久久久| 国产精品国产福利国产秒拍| 欧美成人xxx| 欧美日韩成人| 国产精品免费电影| 国内成人在线| 在线欧美不卡| 一区二区三区四区五区在线| 亚洲午夜未删减在线观看| 亚洲欧美网站| 欧美国产免费| 一区二区三区日韩在线观看 | 国产亚洲精品资源在线26u| 国产日韩在线一区| 黄色欧美成人| 99国产精品久久久久老师| 亚洲欧美综合精品久久成人| 久久亚洲一区二区三区四区| 亚洲精品久久久久久一区二区| 亚洲一区久久久| 另类av一区二区| 亚洲精品日韩在线观看| 午夜亚洲视频| 欧美日韩国产小视频| 久久久久久久精| 午夜精品久久久久久久白皮肤 | 欧美国产先锋| 9i看片成人免费高清| 亚洲精品一区二区三区樱花| 欧美私人网站| 国产精品av久久久久久麻豆网| 欧美成人综合一区| 国产精品乱人伦中文| 欧美午夜影院| 亚洲国产一区二区三区a毛片| 一区二区三区在线观看国产| 亚洲美女精品久久| 亚洲乱码精品一二三四区日韩在线 | 日韩视频在线观看一区二区| 篠田优中文在线播放第一区| 欧美日韩不卡视频| 亚洲精品乱码久久久久久蜜桃麻豆| 91久久精品一区| 午夜免费在线观看精品视频| 亚洲精品美女| 欧美国产综合| 亚洲激情电影在线| 欧美xx视频| 久久免费视频一区| 一区二区自拍| 欧美91视频| 麻豆av一区二区三区| 黄色成人片子| 媚黑女一区二区| 老牛影视一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了中文| 亚洲国产日韩在线一区模特| 欧美一区激情| 欧美成人dvd在线视频| 久久久人成影片一区二区三区| 欧美精品系列| 99精品视频免费全部在线| 亚洲日本视频| 欧美性一区二区| 欧美一区二区三区在线播放| 欧美国产成人精品| 免播放器亚洲一区| 国产精品视频| 久久激情久久| 久久亚洲综合网| 亚洲精品欧美日韩| 日韩一区二区精品| 国产乱码精品一区二区三区av| 亚洲国产欧美一区二区三区久久 | 美日韩精品视频免费看| 国产自产在线视频一区| 欧美福利视频在线观看| 免费成人黄色片| 一区二区三区四区五区在线| 欧美一级黄色网| 亚洲在线观看| 欧美精品免费视频| 中国成人亚色综合网站| 亚洲午夜精品一区二区三区他趣| 乱中年女人伦av一区二区| 亚洲人成网站精品片在线观看| 亚洲欧美日韩另类| 亚欧美中日韩视频| 91久久在线播放| 一区二区三区高清在线观看| 国产三区二区一区久久| 亚洲第一福利视频| 国产精品日韩在线| 欧美成人精品一区二区| 国产精品乱码一区二区三区| 亚洲综合首页| 久久九九热re6这里有精品| 亚洲老司机av| 久久久久久噜噜噜久久久精品 | 在线一区二区三区做爰视频网站| 久久亚洲综合色一区二区三区| 国产日韩欧美在线播放| 一区二区三区欧美在线| 欧美成人精精品一区二区频| 国产精品久久久久久久久免费樱桃| 一本久久综合| 久久av在线| 一区二区三区日韩| 久久女同互慰一区二区三区| 激情成人av在线| aa级大片欧美三级| 亚洲黄色视屏| 久久人人九九| 久久久激情视频| 国产精品欧美精品| 欧美专区中文字幕| 欧美日韩午夜精品| 亚洲经典三级| 亚洲成人资源| 久久偷窥视频| 久久婷婷麻豆| 国模套图日韩精品一区二区| 亚洲图片自拍偷拍| 中文国产成人精品| 欧美日韩国产高清视频| 亚洲电影免费观看高清完整版在线观看 | 亚洲一区三区电影在线观看| 国产精品久久久| 亚洲精品黄网在线观看| 亚洲精品孕妇| 欧美国产大片| 亚洲国产第一页| 欧美亚洲综合久久| 免费观看在线综合| 99人久久精品视频最新地址| 久久久精品日韩| 久久精品日产第一区二区三区| 久久亚洲视频| 亚洲午夜电影网| 欧美精品一线| 一本色道久久综合亚洲精品按摩| 国内精品久久久久影院色| 午夜久久电影网| 久久久青草婷婷精品综合日韩| 欧美成人tv| 日韩视频在线一区| 亚洲欧美成人一区二区在线电影| 久久婷婷综合激情| 亚洲电影在线免费观看| 99热在这里有精品免费| 久久精品国产综合精品| 麻豆乱码国产一区二区三区| 在线观看欧美一区| 欧美精品电影| 亚洲欧美久久久| 美女在线一区二区| 一卡二卡3卡四卡高清精品视频| 久久国产精品网站| 欧美暴力喷水在线| 国产视频在线一区二区| 亚洲黄色天堂| 亚洲在线中文字幕| 国产在线高清精品| 日韩视频一区二区三区| 亚洲欧美高清| 黄色精品一二区| 欧美伦理在线观看| 亚洲第一在线视频| 亚洲一区在线播放| 欧美日韩极品在线观看一区| 国产精品99久久久久久久vr | 亚洲一卡二卡三卡四卡五卡| 国产精品露脸自拍| 欧美高清视频在线播放| 欧美大秀在线观看| 亚洲一区二区在线| 亚洲国产美女精品久久久久∴| 久久亚洲精品欧美| 99av国产精品欲麻豆| 久久综合综合久久综合| 亚洲一区二区三区影院| 欧美视频在线一区| 久久久久www| 免费在线成人av| 亚洲成人在线网| 国产精品亚洲аv天堂网| 欧美激情视频给我| 亚洲精品久久久久久久久久久久| 日韩视频在线观看国产| 国产日韩欧美综合精品| 国产精品扒开腿做爽爽爽软件| 中国日韩欧美久久久久久久久| av成人激情| 亚洲国产日韩欧美在线动漫|