您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > MFC下基于OpenGL绘图程序的开发步骤和框架
宁夏师范学院数学与计算机科学学院《计算机图形学》实验报告实验序号:2实验项目名称:MFC下基于OpenGL绘图程序的开发步骤和框架学号姓名专业、班实验地点指导教师时间一、实验要求:1、环境要求:MicrosoftVisualC++6.0二、实验内容与步骤(一)1、创建MFC应用程序工程用VCAppWizard产生一个基于MFC的应用程序工程EXE文件,选择工程目录,并在工程名字中输入工程名,假设为OpenGL,保持其他的不变;第一步、选单文档(SDI);按Finish结束,工程创建完毕。2、在工程中加入OpenGL所需库文件在工程菜单中,选择Project下的Settings项。单击Link标签,选择General目录,在Object/LibraryModules的编辑框中输入OpenGL32.libglu32.libglaux.lib(注意,输入双引号中的内容,各个库文件用空格分开;否则会出现链接错误),选择OK结束:3、在工程中加入OpenGL所需头文件打开工程中的头文件stdafx.h,将下列头文件包含语句插入到该文件中。:#includeGL/gl.h#includeGL/glu.h#includeGL/glaux.h4、改写视类的PreCreateWindow函数,并在视类中添加成员函数和成员变量OpenGL绘图窗口需要加上WS_CLIPCHILDREN和WS_CLIPSIBLINGS风格,便于窗口重绘。而修改视图窗口风格则需要在视类的PreCreateWindow函数中进行:5、定义OpenGL的绘图上下文RC产生一个RC的第一步是定义窗口的像素格式。像素格式决定窗口所显示的图形在内存中是如何表示的。由像素格式控制的参数包括:颜色深度、缓冲模式和所支持的绘画接口。在下面将对这些参数的设置。(1)先在视类(COpenGLView)中添加一个私有型的成员函数BOOLSetWindowPixelFormat(HDChDC),并在其中进行视区窗口像素格式的定义,具体如下。BOOLCOpenGLView::SetWindowPixelFormat(HDChDC){PIXELFORMATDESCRIPTORpixelDesc;pixelDesc.nSize=sizeof(PIXELFORMATDESCRIPTOR);pixelDesc.nVersion=1;pixelDesc.dwFlags=PFD_DRAW_TO_WINDOW|PFD_DRAW_TO_BITMAP|PFD_SUPPORT_OPENGL|PFD_SUPPORT_GDI|PFD_STEREO_DONTCARE;pixelDesc.iPixelType=PFD_TYPE_RGBA;pixelDesc.cColorBits=32;pixelDesc.cRedBits=8;pixelDesc.cRedShift=16;pixelDesc.cGreenBits=8;pixelDesc.cGreenShift=8;pixelDesc.cBlueBits=8;pixelDesc.cBlueShift=0;pixelDesc.cAlphaBits=0;pixelDesc.cAlphaShift=0;pixelDesc.cAccumBits=64;pixelDesc.cAccumRedBits=16;pixelDesc.cAccumGreenBits=16;pixelDesc.cAccumBlueBits=16;pixelDesc.cAccumAlphaBits=0;pixelDesc.cDepthBits=32;pixelDesc.cStencilBits=8;pixelDesc.cAuxBuffers=0;pixelDesc.iLayerType=PFD_MAIN_PLANE;pixelDesc.bReserved=0;pixelDesc.dwLayerMask=0;pixelDesc.dwVisibleMask=0;pixelDesc.dwDamageMask=0;m_GLPixelIndex=ChoosePixelFormat(hDC,&pixelDesc);if(m_GLPixelIndex==0)//Let'schooseadefaultindex.{m_GLPixelIndex=1;if(DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0){returnFALSE;}}if(SetPixelFormat(hDC,m_GLPixelIndex,&pixelDesc)==FALSE){returnFALSE;}returnTRUE;}其中,m_GLPixelIndex为在视类中添加的一私有型的成员变量:intm_GLPixelIndex;其它具体函数及其参数含义,大家可以通过OpenGL手册或者MSDN查询。这里不作累述。(2)现在绘制窗口像素格式已经定义好,下一步工作是产生绘制上下文(RC)并使之成为当前绘制上下文。在视类中加入一个私有型成员函数BOOLCreateViewGLContext(HDChDC)。其中,m_hGLContext为在视类中添加的一私有型的成员变量:HGLRCm_hGLContext;HGLRC是一个指向renderingcontext的句柄。(3)最后,在视类的OnCreate函数(OnCreate函数相应Window消息WM_CREATE,可以通过VC的类向导ClassWizardCtrl+W进行添加,如图)中实现上述两个函数的调用,实现RC的定义、产生以及和当前视区窗口DC的通讯。6、添加绘图函数视类函数OnDraw主要负责视区的绘图工作。为了在视区窗口利用OpenGL绘制图形,我们自定义一个绘图函数DrawScene(),并OnDraw函数中调用该函数,从而实现在视区窗口绘图。7、修改视类OnSize函数当视区绘图窗口大小变化时,应及时将新的窗口大小通知OpenGL,才能在绘图窗口以正确的比例显示图形。当视区窗口大小变化时,WM_SIZE消息被触发,所以可以通过VC的类向导ClassWizardCtrl+W添加WM_SIZE的消息映射函数OnSize。然后对OnSize函数做修改。8、修改视类OnEraseBkgnd函数仿造第7步的方法通过类向导ClassWizard添加视类对消息WM_ERASEBKGND的映射函数OnEraseBkgnd,并对该函数进行修改。修改该函数的主要原因是:OpenGL自身具有重绘能力,通过修改该函数屏蔽Window的重绘操作,从而可以防止窗口频繁刷新时产生的闪烁现象。9、回收RC所占用的资源通过VC的类向导ClassWizardCtrl+W添加Window消息WM_DESTROY的映射函数OnDestroy函数。在该函数中调用OpenGL函数wglDeleteContext对RC所占资源进行回收。注意,回收之前需要先使用OpenGL函数wglMakeCurrent断开RC与DC的连接。10、初始化绘图数据编辑视类构造函数,初始化绘图数据。至此,我们已构造好了框架,使该工程可以利用OpenGL进行绘图了。假设现在绘制一个三角形,只需要在第6步添加的DrawScene函数中添加绘制三角形的函数,(二)生成三维物体1)首先,在OnSize()中,把gluOrtho2D(0.0,500.0*aspect,0.0,500.0)换成gluPerspective(60,aspect,1,10.0);这样就实现了三维透视坐标系的设置。该语句说明了视点在原点,透视角是60度,近裁剪面在z=1处,远裁剪面在z=10.0处。2)在DrawScene函数中生成三维图形;三、程序运行结果六、教师评语签名:日期:年月日成绩
本文标题:MFC下基于OpenGL绘图程序的开发步骤和框架
链接地址:https://www.777doc.com/doc-2882668 .html