![計(jì)算機(jī)圖形學(xué)編程練習(xí)8MFC-明暗處理實(shí)現(xiàn)_第1頁(yè)](http://file4.renrendoc.com/view/d831c5d7c71238a4f26ca194c026647f/d831c5d7c71238a4f26ca194c026647f1.gif)
![計(jì)算機(jī)圖形學(xué)編程練習(xí)8MFC-明暗處理實(shí)現(xiàn)_第2頁(yè)](http://file4.renrendoc.com/view/d831c5d7c71238a4f26ca194c026647f/d831c5d7c71238a4f26ca194c026647f2.gif)
![計(jì)算機(jī)圖形學(xué)編程練習(xí)8MFC-明暗處理實(shí)現(xiàn)_第3頁(yè)](http://file4.renrendoc.com/view/d831c5d7c71238a4f26ca194c026647f/d831c5d7c71238a4f26ca194c026647f3.gif)
![計(jì)算機(jī)圖形學(xué)編程練習(xí)8MFC-明暗處理實(shí)現(xiàn)_第4頁(yè)](http://file4.renrendoc.com/view/d831c5d7c71238a4f26ca194c026647f/d831c5d7c71238a4f26ca194c026647f4.gif)
![計(jì)算機(jī)圖形學(xué)編程練習(xí)8MFC-明暗處理實(shí)現(xiàn)_第5頁(yè)](http://file4.renrendoc.com/view/d831c5d7c71238a4f26ca194c026647f/d831c5d7c71238a4f26ca194c026647f5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)圖形學(xué)編程練習(xí)8:MFC+明暗處理實(shí)現(xiàn)MFC與OpenGL集成在Windows下編程,利用MFC是一個(gè)非常便捷的方法。本次練習(xí)的主要目的,是希望同學(xué)們?cè)贛FC應(yīng)用程序框架下進(jìn)行OpenGL編程。為此,需要對(duì)MFC生成的應(yīng)用程序進(jìn)行適當(dāng)?shù)某跏蓟?,關(guān)于這方面的內(nèi)容詳見:1 Crain, Dennis. Windows NT OpenGL: Getting Started. April 1994. (MSDN Library, Technical Articles)2 Rogerson, Dale. OpenGL I: Quick Start. December 1994. (MSDN Lib
2、rary, Technical Articles)3 D. Shreiner and The Khronos OpenGL ARB Working Group. OpenGL Programming Guide: The Official Guide to Learning OpenGL, Versions 3.0 and 3.1, 7th Ed., 2009. (附錄D)從設(shè)計(jì)目標(biāo)來說,OpenGL是流水線結(jié)構(gòu)(streamlined)、硬件無(wú)關(guān)(hardware-independent)、跨平臺(tái)的3D圖形編程API。但是,在實(shí)際應(yīng)用時(shí),OpenGL的具體實(shí)現(xiàn)是與操作系統(tǒng)以及圖形硬件相關(guān)的。
3、為此,操作系統(tǒng)需要提供像素格式(pixel format)與繪制上下文管理函數(shù)(rendering context managnment functions)。Windows操作系統(tǒng)提供了通用圖形設(shè)備接口(generic graphics device interface, GDI)以及設(shè)備驅(qū)動(dòng)實(shí)現(xiàn)。為了使OpenGL命令得到正確的執(zhí)行,需要調(diào)用WGL函數(shù),具體的步驟如下:Step 1: 添加成員變量在CView類(利用AppWizard生成)中添加如下成員變量:/ OpenGL Windows specificationHDC m_hDC;/ Device ContextHGLRC m_hG
4、LRC;/ Rendering ContextCPalette m_cGLLP;/ Logical PaletteStep 2: 設(shè)置像素格式創(chuàng)建CView類的WM_CREATE的消息響應(yīng)函數(shù),進(jìn)行像素格式的設(shè)置,例如:int COpenGLRenderView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: Add your specialized creation code hereint nPixelFormat;/ Pixel format
5、 indexHWND hWnd = GetSafeHwnd();/ Get the windows handlem_hDC = :GetDC(hWnd);/ Get the Device contextstatic PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR),/ Size of this structure1,/ Version of this structurePFD_DRAW_TO_WINDOW |/ Draw to Window (not to bitmap)PFD_SUPPORT_OPENGL |/ Support
6、 OpenGL calls in windowPFD_DOUBLEBUFFER,/ Double buffered modePFD_TYPE_RGBA,/ RGBA Color mode24,/ Want 24bit color 0,0,0,0,0,0,/ Not used to select mode0,0,/ Not used to select mode0,0,0,0,0,/ Not used to select mode32,/ Size of depth buffer0,/ Not used to select mode0,/ Not used to select modePFD_M
7、AIN_PLANE,/ Draw in main plane0,/ Not used to select mode0,0,0 ;/ Not used to select mode/ Choose a pixel format that best matches that described in pfdnPixelFormat = ChoosePixelFormat(m_hDC, &pfd);/ Set the pixel format for the device contextVERIFY(SetPixelFormat(m_hDC, nPixelFormat, &pfd);/ Create
8、 the rendering contextm_hGLRC = wglCreateContext(m_hDC);/ Create the palette if neededInitializePalette();/ Make the rendering context current, perform initialization, then deselect itVERIFY(wglMakeCurrent(m_hDC, m_hGLRC);GLSetupDef(m_hDC);wglMakeCurrent(NULL, NULL);return 0;上述步驟的具體含義參看參考文獻(xiàn)1-3.Step
9、3: 創(chuàng)建繪制上下文該步驟在Step 2中已完成,具體的就是:m_hGLRC = wglCreateContext(m_hDC);Step 4: 設(shè)置調(diào)色板創(chuàng)建CView類的一個(gè)成員函數(shù),進(jìn)行調(diào)色板的設(shè)置,例如:void CTriangularPatchView:InitializePalette(void)PIXELFORMATDESCRIPTOR pfd;/ Pixel Format DescriptorLOGPALETTE *pPal;/ Pointer to memory for logical paletteint nPixelFormat;/ Pixel format indexi
10、nt nColors;/ Number of entries in paletteint i;/ Counting variableBYTE RedRange,GreenRange,BlueRange;/ Range for each color entry (7,7,and 3)/ Get the pixel format index and retrieve the pixel format descriptionnPixelFormat = GetPixelFormat(m_hDC);DescribePixelFormat(m_hDC, nPixelFormat, sizeof(PIXE
11、LFORMATDESCRIPTOR), &pfd);/ Does this pixel format require a palette? If not, do not create a/ palette and just return NULLif (!(pfd.dwFlags & PFD_NEED_PALETTE)return;/ Number of entries in palette. 8 bits yeilds 256 entriesnColors = 1 palVersion = 0 x300;/ Windows 3.0pPal-palNumEntries = nColors; /
12、 table size/ Build mask of all 1s. This creates a number represented by having/ the low order x bits set, where x = pfd.cRedBits, pfd.cGreenBits, and/ pfd.cBlueBits. RedRange = (1 pfd.cRedBits) -1;GreenRange = (1 pfd.cGreenBits) - 1;BlueRange = (1 pfd.cBlueBits) -1;/ Loop through all the palette ent
13、riesfor (i = 0; i palPalEntryi.peRed = (i pfd.cRedShift) & RedRange;pPal-palPalEntryi.peRed = (unsigned char)(double) pPal-palPalEntryi.peRed * 255.0 / RedRange);pPal-palPalEntryi.peGreen = (i pfd.cGreenShift) & GreenRange;pPal-palPalEntryi.peGreen = (unsigned char)(double)pPal-palPalEntryi.peGreen
14、* 255.0 / GreenRange);pPal-palPalEntryi.peBlue = (i pfd.cBlueShift) & BlueRange;pPal-palPalEntryi.peBlue = (unsigned char)(double)pPal-palPalEntryi.peBlue * 255.0 / BlueRange);pPal-palPalEntryi.peFlags = (unsigned char) NULL;/ Create the palettem_cGLLP.CreatePalette(pPal);/ Go ahead and select and r
15、ealize the palette for this device contextSelectPalette(m_hDC,(HPALETTE)m_cGLLP,FALSE);RealizePalette(m_hDC);/ Free the memory used for the logical palette structurefree(pPal);至此,已經(jīng)可以調(diào)用OpenGL函數(shù)了,一定要記?。篛penGL命令只在獲取了正確的繪制上下文后才能正確執(zhí)行,即wglMakeCurrent(m_hDC, m_hGLRC);/ issue OpenGL commands .wglMakeCurren
16、t(m_hDC, NULL);Step 5: 重載OnEraseBkgnd函數(shù)創(chuàng)建CView類的WM_ERASEBKGND的消息響應(yīng)函數(shù),防止Windows進(jìn)行額外的背景清除操作,例如:BOOL COpenGLRenderView:OnEraseBkgnd(CDC* pDC) / TODO: Add your message handler code here and/or call defaultreturn FALSE;Step 6: 設(shè)置OpenGL的基本參數(shù)(可選)在CView類中添加頭文件:#include #include #include 以及成員函數(shù):void GLSetupD
17、ef(void *pData);創(chuàng)建CView類的一個(gè)成員函數(shù),進(jìn)行OpenGL的基本參數(shù)的設(shè)置,例如:void COpenGLRenderView:GLSetupDef(void *pData)/ set up clear colorglClearColor(1.0f, 1.0f, 1.0f, 1.0f);/ set up lightingGLfloat light_position04 = 52.0f, 16.0f, 50.0f, 0.0f;GLfloat light_position14 = 26.0f, 48.0f, 50.0f, 0.0f;GLfloat light_position
18、24 = -16.0f, 52.0f, 50.0f, 0.0f;GLfloat direction03 = -52.0f, -16.0f, -50.0f;GLfloat direction13 = -26.0f, -48.0f, -50.0f;GLfloat direction23 = 16.0f, -52.0f, -50.0f;GLfloat color04 = 1.0f, 0.0f, 0.0f, 1.0f;GLfloat color14 = 0.0f, 1.0f, 0.0f, 1.0f;GLfloat color24 = 0.0f, 0.0f, 1.0f, 1.0f;glLightfv(G
19、L_LIGHT0, GL_POSITION, light_position0);glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direction0);glLightfv(GL_LIGHT0, GL_DIFFUSE, color0);glLightfv(GL_LIGHT0, GL_SPECULAR, color0);glLightfv(GL_LIGHT1, GL_POSITION, light_position1);glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, direction1);glLightfv(GL_LIGHT1, G
20、L_DIFFUSE, color1);glLightfv(GL_LIGHT1, GL_SPECULAR, color1);glLightfv(GL_LIGHT2, GL_POSITION, light_position2);glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, direction2);glLightfv(GL_LIGHT2, GL_DIFFUSE, color2);glLightfv(GL_LIGHT2, GL_SPECULAR, color2);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL
21、_LIGHT1);glEnable(GL_LIGHT2);/ set up materialsGLfloat ambient4 = 0.3f, 0.3f, 0.3f, 0.5f;GLfloat material_ambient4 = 0.0f, 0.0f, 0.0f, 0.0f;GLfloat material_diffuse4 = 1.0f, 1.0f, 1.0f, 0.3f;GLfloat material_specular4 = 0.5f, 0.5f, 0.5f, 0.5f;GLfloat material_shininess = 51.2f;glLightModelfv(GL_LIGH
22、T_MODEL_AMBIENT, ambient);glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse);glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material_ambient);glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, material_shininess);/ enable depth testglDepthFunc(GL_LESS);glEnable(GL_DEPTH_TEST);/ enable cull face/glCullFace(GL_BACK);/glEnable(GL_CULL_FACE);/ set up point size an
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 分析倉(cāng)庫(kù)管理中的常見問題計(jì)劃
- 秋季文史課程教學(xué)計(jì)劃
- 提升教學(xué)質(zhì)量計(jì)劃
- 安全生產(chǎn)與健康管理方案計(jì)劃
- 樹立良好的生活部形象方針計(jì)劃
- 2025年陶瓷生產(chǎn)加工機(jī)械項(xiàng)目合作計(jì)劃書
- 美術(shù)教師職業(yè)素養(yǎng)提升計(jì)劃
- 從數(shù)據(jù)中尋找倉(cāng)儲(chǔ)優(yōu)化機(jī)會(huì)的總結(jié)計(jì)劃
- 財(cái)務(wù)合規(guī)性的強(qiáng)化措施計(jì)劃
- 可行性研究與市場(chǎng)定位計(jì)劃
- 2024屆高考政治一輪復(fù)習(xí)經(jīng)濟(jì)學(xué)名詞解釋
- 湘教版高中數(shù)學(xué)必修二知識(shí)點(diǎn)清單
- GB/T 22919.9-2024水產(chǎn)配合飼料第9部分:大口黑鱸配合飼料
- 體育與兒童心理健康教育教材教學(xué)課件
- 商業(yè)綜合體投資計(jì)劃書
- 2024妊娠期糖尿病指南課件
- 婚姻家庭法(第三版)教案全套 項(xiàng)目1-9 婚姻家庭法概述-特殊婚姻家庭關(guān)系
- 可持續(xù)采購(gòu)與供應(yīng)鏈管理
- 2024年道路運(yùn)輸企業(yè)安全教育培訓(xùn)計(jì)劃
- 關(guān)注孩子心理健康教育家長(zhǎng)會(huì)
- 急性心肌梗死治療進(jìn)展與規(guī)范化治療護(hù)理課件
評(píng)論
0/150
提交評(píng)論