计算机图形学编程练习8MFC-明暗处理实现_第1页
计算机图形学编程练习8MFC-明暗处理实现_第2页
计算机图形学编程练习8MFC-明暗处理实现_第3页
计算机图形学编程练习8MFC-明暗处理实现_第4页
计算机图形学编程练习8MFC-明暗处理实现_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机图形学编程练习8:MFC+明暗处理实现MFC与OpenGL集成在Windows下编程,利用MFC是一个非常便捷的方法。本次练习的主要目的,是希望同学们在MFC应用程序框架下进行OpenGL编程。为此,需要对MFC生成的应用程序进行适当的初始化,关于这方面的内容详见: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)从设计目标来说,OpenGL是流水线结构(streamlined)、硬件无关(hardware-independent)、跨平台的3D图形编程API。但是,在实际应用时,OpenGL的具体实现是与操作系统以及图形硬件相关的。

3、为此,操作系统需要提供像素格式(pixel format)与绘制上下文管理函数(rendering context managnment functions)。Windows操作系统提供了通用图形设备接口(generic graphics device interface, GDI)以及设备驱动实现。为了使OpenGL命令得到正确的执行,需要调用WGL函数,具体的步骤如下:Step 1: 添加成员变量在CView类(利用AppWizard生成)中添加如下成员变量:/ OpenGL Windows specificationHDC m_hDC;/ Device ContextHGLRC m_hG

4、LRC;/ Rendering ContextCPalette m_cGLLP;/ Logical PaletteStep 2: 设置像素格式创建CView类的WM_CREATE的消息响应函数,进行像素格式的设置,例如: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;上述步骤的具体含义参看参考文献1-3.Step

9、3: 创建绘制上下文该步骤在Step 2中已完成,具体的就是:m_hGLRC = wglCreateContext(m_hDC);Step 4: 设置调色板创建CView类的一个成员函数,进行调色板的设置,例如: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);至此,已经可以调用OpenGL函数了,一定要记住:OpenGL命令只在获取了正确的绘制上下文后才能正确执行,即wglMakeCurrent(m_hDC, m_hGLRC);/ issue OpenGL commands .wglMakeCurren

16、t(m_hDC, NULL);Step 5: 重载OnEraseBkgnd函数创建CView类的WM_ERASEBKGND的消息响应函数,防止Windows进行额外的背景清除操作,例如:BOOL COpenGLRenderView:OnEraseBkgnd(CDC* pDC) / TODO: Add your message handler code here and/or call defaultreturn FALSE;Step 6: 设置OpenGL的基本参数(可选)在CView类中添加头文件:#include #include #include 以及成员函数:void GLSetupD

17、ef(void *pData);创建CView类的一个成员函数,进行OpenGL的基本参数的设置,例如: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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论