• <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>

            蕙麓

            Email:oxionghui@gmail.com

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
            OpenGL.h,OpenGL.cpp主要是圖形處理相關的操作。main.cpp主程序


             
            OpenGL.h: interface for the OpenGL class.
             2 //
             3 //////////////////////////////////////////////////////////////////////
             4 
             5 #if !defined(AFX_OPENGL_H__7078166F_1240_4FB7_8CD9_A3E45C609EF5__INCLUDED_)
             6 #define AFX_OPENGL_H__7078166F_1240_4FB7_8CD9_A3E45C609EF5__INCLUDED_
             7 
             8 #if _MSC_VER > 1000
             9 #pragma once
            10 #endif // _MSC_VER > 1000
            11 
            12 #include <windows.h>
            13 #include <gl/gl.h>
            14 #include <gl/glu.h>
            15 
            16 class OpenGL  
            17 {
            18 private:
            19     HDC        hDC;            // 
            20     HGLRC    hRC;            // 
            21 public:
            22     OpenGL();
            23     virtual ~OpenGL();
            24     BOOL    SetupPixelFormat(HDC hDC);   
            25     void    ReSizeGLScene(int Width, int Height);  //初始化視口
            26     void    Render();      //渲染
            27     void    CleanUp();
            28 
            29 };
            30 
            31 #endif // !defined(AFX_OPENGL_H__7078166F_1240_4FB7_8CD9_A3E45C609EF5__INCLUDED_)
            32 

            OpenGL.cpp   
             1 // OpenGL.cpp: implementation of the OpenGL class.
             2 //
             3 //////////////////////////////////////////////////////////////////////
             4 #include "OpenGL.h"
             5 
             6 //////////////////////////////////////////////////////////////////////
             7 // Construction/Destruction
             8 //////////////////////////////////////////////////////////////////////
             9 
            10 OpenGL::OpenGL()
            11 {
            12 
            13 }
            14 
            15 OpenGL::~OpenGL()
            16 {    
            17     CleanUp();
            18 }
            19 
            20 BOOL OpenGL::SetupPixelFormat(HDC hDC0)  //設置像素格式
            21 {    
            22     int nPixelFormat;                                // 象素點格式
            23     hDC = hDC0;
            24     PIXELFORMATDESCRIPTOR pfd = { 
            25         sizeof(PIXELFORMATDESCRIPTOR),    // pfd結構的大小 
            26             1,                                          // 版本號 
            27             PFD_DRAW_TO_WINDOW |         // 支持在窗口中繪圖 
            28             PFD_SUPPORT_OPENGL |           // 支持 OpenGL 
            29             PFD_DOUBLEBUFFER,                // 支持雙緩存模式 
            30             PFD_TYPE_RGBA,                    // RGBA 顏色模式 
            31             24,                                      // 24 位顏色深度 
            32             000000,                     // 忽略顏色位 
            33             0,                                        
            34             0,                                        
            35             0,                                     
            36             0000,                           
            37             16,                                   // 深度緩存     
            38             0,                                      
            39             0,                                     
            40             PFD_MAIN_PLANE,            
            41             0,                                   
            42             000                            
            43     }; 
            44     if (!(nPixelFormat = ChoosePixelFormat(hDC, &pfd))) 
            45     {
            46         MessageBox(NULL,"沒找到合適的顯示模式","Error",MB_OK|MB_ICONEXCLAMATION);
            47         return FALSE;
            48     }
            49     SetPixelFormat(hDC,nPixelFormat,&pfd);//設置當前設備的像素點格式
            50     hRC = wglCreateContext(hDC);           //獲取渲染描述句柄
            51     wglMakeCurrent(hDC, hRC);               //激活渲染描述句柄
            52     
            53     return TRUE;
            54 }
            55 
            56 void OpenGL::ReSizeGLScene(int Width, int Height)
            57 {    
            58     glViewport(0,0,Width,Height);      //重置當前的視口            
            59     glMatrixMode(GL_PROJECTION);   //選擇投影矩陣            
            60     glLoadIdentity();                      //重置投影矩陣        
            61     gluPerspective                         //設置視口的大小                        
            62         ( 54.0f,                             
            63         (GLfloat)Width/(GLfloat)Height,    
            64         0.1f,                                
            65         3000.0f                        
            66         );
            67     
            68     glMatrixMode(GL_MODELVIEW);       //選擇模型觀察矩陣            
            69     glLoadIdentity();                         //重置模型觀察矩陣
            70     
            71 }
            72 
            73 void OpenGL::Render()                                   //OpenGL圖形渲染
            74 {    
            75     glClearColor(0.0f0.0f0.3f1.0f);              // 設置刷新背景色
            76     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // 刷新背景
            77     glLoadIdentity();                                    // 重置模型觀察矩陣
            78     
            79     //畫矩形
            80     glBegin(GL_QUADS);
            81     glVertex3f(-1.0f,-1.0f,-5.0f);
            82     glVertex3f(1.0f,-1.0f,-5.0f);
            83     glVertex3f(1.0f,1.0f,-5.0f);
            84     glVertex3f(-1.0f,1.0f,-5.0f);
            85     glEnd();
            86 
            87     SwapBuffers(hDC);                                 // 切換緩沖區
            88 }
            89 void OpenGL::CleanUp()
            90 {    
            91     wglMakeCurrent(hDC, NULL);                       //清除OpenGL
            92     wglDeleteContext(hRC);                            //清除OpenGL
            93 }
            94 

            main.cpp
              1 #include "OpenGL.h"
              2 
              3 OpenGL* m_OpenGL;
              4 HDC        hDC;         //窗口的設備環境句柄 
              5 HWND    hWnd = NULL; //窗口句柄 
              6 int        Width = 800// 窗口寬
              7 int        Height = 600;// 窗口高
              8 int        bits  = 24;     // 顏色深度
              9 
             10 void GameLoop()
             11 {   
             12     MSG msg;    //消息結構
             13     BOOL fMessage;
             14     PeekMessage(&msg, NULL, 0U0U, PM_REMOVE);
             15     while(msg.message != WM_QUIT)    // 
             16     {   
             17         fMessage = PeekMessage(&msg, NULL, 0U0U, PM_REMOVE);
             18         if(fMessage)                      //
             19         { 
             20             TranslateMessage(&msg);
             21             DispatchMessage(&msg);
             22         }
             23         else  
             24             m_OpenGL->Render();    //無消息
             25     }
             26 }
             27 
             28 LRESULT WINAPI MsgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam )// 消息響應處理
             29 {    
             30     switch(message)
             31     {
             32     case WM_CREATE:                        // 建立窗口
             33         hDC = GetDC(hWnd);                // 獲取當前窗口的設備句柄
             34         m_OpenGL->SetupPixelFormat(hDC);// 調用顯示模式安裝功能
             35         break;
             36 
             37     case WM_CLOSE:                        // 關閉窗口
             38         m_OpenGL->CleanUp();            // 結束處理
             39         PostQuitMessage(0);
             40         break;
             41 
             42     case WM_SIZE:                         // 窗口尺寸變化
             43         Height = HIWORD(lParam);      // 窗口的高
             44         Width  = LOWORD(lParam);     // 窗口的寬
             45         if (Height == 0)                   // 防止被零除
             46             Height = 1;                   
             47         m_OpenGL->ReSizeGLScene(Width,Height);  //重置窗口
             48         break;
             49 
             50     case WM_DESTROY:                    // 退出消息
             51         PostQuitMessage(0);
             52         break;
             53         
             54     case WM_KEYUP:                        // 按ESC退出
             55         switch (wParam)
             56         {
             57         case VK_ESCAPE:
             58             m_OpenGL->CleanUp();    // 結束處理
             59             PostQuitMessage(0);
             60         
             61             break;
             62         } 
             63         default:        
             64             break;
             65     }
             66     return (DefWindowProc(hWnd, message, wParam, lParam));
             67 }
             68 
             69 INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT )// WinMain程序入口
             70 {
             71     // 注冊窗口類
             72     bool fullScreen = TRUE;      //全屏標志,默認全屏
             73     DWORD    dwExStyle;        // Window 擴展風格
             74     DWORD    dwStyle;           // Window 窗口風格
             75     RECT    windowRect;        // 窗口尺寸
             76     int        nX = 0,nY = 0;
             77     if (MessageBox(NULL,"使用全屏模式嗎?""選擇顯示模式",
             78         MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL) == IDNO)//選擇窗口模式
             79     {
             80         fullScreen = false;
             81     }                                    
             82     if (fullScreen)                                  // 選擇全屏模式
             83     {
             84         DEVMODE dmScreenSettings;         // 設備模式
             85         memset(&dmScreenSettings,0,sizeof(dmScreenSettings));    // 確保內存分配
             86         dmScreenSettings.dmSize = sizeof(dmScreenSettings);        // Devmode 結構的大小
             87         dmScreenSettings.dmPelsWidth = Width;          // 屏幕寬
             88         dmScreenSettings.dmPelsHeight = Height;        // 屏幕高
             89         dmScreenSettings.dmBitsPerPel = 16;             // 色彩深度
             90         dmScreenSettings.dmDisplayFrequency = 75;   // 
             91         dmScreenSettings.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;
             92         if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
             93         {
             94             fullScreen = FALSE;
             95         }
             96         dwExStyle = WS_EX_APPWINDOW; // Window 擴展風格
             97         dwStyle = WS_POPUP;                // Window 窗口風格
             98         ShowCursor(FALSE);                   // 隱藏鼠標
             99     }
            100     else
            101     {
            102         dwExStyle = WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;    // 使窗口具有3D外觀
            103         dwStyle = WS_OVERLAPPEDWINDOW;                // 使用標準窗口    
            105         int wid = GetSystemMetrics(SM_CXSCREEN);        // 獲取當前屏幕寬
            106         int hei = GetSystemMetrics(SM_CYSCREEN);        // 獲取當前屏幕高
            107         nX = (wid-Width)/2;nY = (hei-Height)/2;            // 計算窗口居中用
            108     }
            109     //-------------------------------------------------------------------
            110     AdjustWindowRectEx(&windowRect,dwStyle,FALSE,dwExStyle);//調整窗口尺寸
            111     
            112     char className[] = "TApplicationGL";
            113     
            114     //窗口類型結構
            115     WNDCLASSEX wc = { sizeof(WNDCLASSEX),
            116         CS_HREDRAW | CS_VREDRAW | CS_OWNDC,//
            117         MsgProc, 
            118         0L
            119         0L
            120         GetModuleHandle(NULL),
            121         NULL, 
            122         NULL, 
            123         NULL, 
            124         NULL,
            125         className,
            126         NULL };   
            127     
            128     RegisterClassEx( &wc ); //注冊該窗口類型
            129 
            130     m_OpenGL = new OpenGL();//
            131     hWnd = CreateWindowEx(NULL,
            132                           className,
            133                           "OpenGL",
            134                           dwStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
            135                           nX,
            136                           nY,
            137                           Width, 
            138                           Height,
            139                           NULL,
            140                           NULL,
            141                           hInst,
            142                           NULL);   
            143     ShowWindow(hWnd, SW_SHOW);  // 顯示窗口
            144     UpdateWindow(hWnd);               // 刷新窗口
            145     GameLoop();                            // 進入消息循環
            146     return 0
            147 }

            注:OpenGL類處理圖形相關的操作,main.cpp管理主窗口,處理消息

            結果如下:
            posted on 2012-05-22 11:54 蕙麓 閱讀(627) 評論(2)  編輯 收藏 引用 所屬分類: 計算機圖像學(OpenGL)

            評論

            # re: OpenGL程序框架 2012-06-10 13:08 eryar
            可以使用OpenSceneGraph,
            比直接用OpenGL要方便點...  回復  更多評論
              

            # re: OpenGL程序框架 2012-06-17 17:14 蕙麓
            嗯,我可以試試看。Thank you @eryar
              回復  更多評論
              

            亚洲国产精品综合久久网络| 伊人久久大香线蕉无码麻豆| 久久久久人妻精品一区二区三区| 久久无码人妻一区二区三区午夜| 国产91色综合久久免费分享| 久久九九亚洲精品| 久久妇女高潮几次MBA| 国产91久久精品一区二区| 久久精品无码av| 国产成人久久激情91| 国产成人综合久久精品红| 久久最新精品国产| 亚洲av成人无码久久精品| 久久精品亚洲乱码伦伦中文| 亚洲AV无一区二区三区久久| 久久久精品日本一区二区三区 | 久久香蕉综合色一综合色88| 久久狠狠一本精品综合网| 日韩久久久久久中文人妻| 婷婷久久五月天| 久久影院久久香蕉国产线看观看| 久久99国产精品久久99| 亚洲香蕉网久久综合影视| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 欧美噜噜久久久XXX| 综合久久一区二区三区| 久久996热精品xxxx| 亚洲国产精品久久久久久| 日日躁夜夜躁狠狠久久AV| 婷婷综合久久中文字幕蜜桃三电影| 久久人妻少妇嫩草AV无码蜜桃| 99热都是精品久久久久久| 7777久久亚洲中文字幕| 国产精品久久亚洲不卡动漫| 久久久久人妻一区二区三区vr| 国产美女亚洲精品久久久综合| 久久精品国产99国产精品导航| 久久无码中文字幕东京热| 久久综合一区二区无码| 久久婷婷五月综合国产尤物app| 香蕉99久久国产综合精品宅男自 |