




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MFC下OpenGL入门源文件1, 建一工程文件,我这里命名为first,现在first工程里面我们没有添加任何东西,所有的东西都是MFC自动帮我们创建的。2, 添加链接库。这一步很关键。打开菜单栏下的项目->属性->配置属性->链接器->输入->附加依赖项里加入OpenGL32.lib GLu32.lib GLaux.lib,如图 3, 加头文件,在stdafx里面添加opengl的头文件。如下代码所示:/-Tramp-添加OpenGL库头文件->#include "stdio.h"#i
2、nclude "math.h"#include "glgl.h"#include "glglu.h"#include "glglaux.h"/-<代码 4, CCY457OpenGLView类的属性栏,为下述消息加入消息处理函数:WM_CREATE (for OnCreate), WM_DESTROY (for OnDestroy), WM_SIZE (for OnSize), WM_ERASEBACKGROUND (for
3、OnEraseBkground).如下图: 5, 设置窗口显示风格。窗口创建之前我们必须设置窗口风格包含WS_CLIPCHILDREN和 WS_CLIPSIBLINGS,从而避免OpenGL绘制到其他窗口中去。这些应该放在PreCreateWindow()中。 BOOL CfirstView:PreCreateWindow(CREATESTRUCT& cs) / TODO: 在此处通过修改 / CREATESTRUCT cs
4、0;来修改窗口类或样式 cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;/Tramp return CView:PreCreateWindow(cs);代码 6, 在CfirstView.h中加入如下语句: /*/ /* 设置的变量是Rendering Context(着色描述表)。每一个OpenGL都被连接到一个着
5、; 色描述表上。着色描述表将所有的OpenGL调用命令连接到Device Context(设备描述表)上。 我将OpenGL的着色描述表定义为hRC 。要让您的程序能够绘制窗口的话,还需要创建一个 设备描述表,也就是第二行的内容。Windows的设备描述表被定义为hDC 。DC将窗口连接到 GDI(Graphics Device Interface图形设备接口)。而RC将OpenGL连接到DC
6、60;
7、160; */ /*/ HGLRC m_hRC; /Rendering Context着色描述表 CDC* m_pDC; /Device
8、 Context设备描述表 BOOL InitializeOpenGL(); /Initialize OpenGL BOOL SetupPixelFormat(); /Set up the Pixel Format void RenderScene(); &
9、#160; /Render the Scene 7, 在OnCreate中我们将通过建立像素格式和绘制上下文来初始化OpenGL. 在InitializeOpenGL()中会创建一个设备上下文(DC),为这个DC选择一个像素格式,创建和这个DC相关的绘制上下文(RC),然后选择这个RC.这个函数会调用SetupPixelFormat()来建立像素格式。int Clesson1View:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CVie
10、w:OnCreate(lpCreateStruct) = -1) return -1; / TODO: 在此添加您专用的创建代码 InitializeOpenGL();/初始化openGL绘图 return 0; /初始化opengl绘制BOOL CfirstView:InitializeOpenGL() /Get a DC fo
11、r the Client Area m_pDC = new CClientDC(this); /Failure to Get DC if(m_pDC = NULL) /:MessageBox("Error Obtaining DC");
12、 return FALSE; /Failure to set the pixel format if(!SetupPixelFormat() return FALSE; /Create Renderi
13、ng Context m_hRC = :wglCreateContext (m_pDC->GetSafeHdc (); /Failure to Create Rendering Context if(m_hRC = 0) / MessageBox("Error Creating RC"); return FALSE; &
14、#160;/Make the RC Current if(:wglMakeCurrent (m_pDC->GetSafeHdc (), m_hRC)=FALSE) / MessageBox("Error making RC Current"); return FALSE; /Specify Black as the clear color
15、 :glClearColor(0.0f,0.0f,0.0f,0.0f); /Specify the back of the buffer as clear depth :glClearDepth(1.0f); /Enable Depth Testing :glEnable(GL_DEPTH_TEST); return TRUE; /设置像素格式BOOL CfirstView:SetupPixelFormat() static PIXELFORMATDESCRIPTOR pfd
16、 = sizeof(PIXELFORMATDESCRIPTOR), / size of this pfd 1,
17、160; / version number PFD_DRAW_TO_WINDOW | / support window PFD_SUPPORT_OPENGL |
18、0; / support OpenGL PFD_DOUBLEBUFFER, / double buffered PFD_TYPE_RGBA,
19、 / RGBA type 24, / 24-bit color depth &
20、#160; 0, 0, 0, 0, 0, 0, / color bits ignored 0,
21、160; / no alpha buffer 0, / shif
22、t bit ignored 0, / no accumulation buffer 0, 0, 0, 0,
23、160; / accum bits ignored 16,
24、160; / 16-bit z-buffer 0, / no stencil buffer
25、; 0, / no auxiliary buffer PFD_MAIN_PLANE,
26、160; / main layer 0,
27、; / reserved 0, 0, 0 / layer masks ignored int m_nPixelFormat = :ChoosePixelFormat(m_pDC->GetSafe
28、Hdc(), &pfd); if ( m_nPixelFormat = 0 ) return FALSE; if ( :SetPixelFormat(m_pDC->GetSafeHdc(), m_nPixelFormat, &pfd) = FALSE) return FALSE;
29、;return TRUE; 8, 在OnSize()中一般用来设置视口和视锥,因为这些是和窗口大小相关的。基本操作包括设置视口,选择投影矩阵,设置模型视图矩阵。void CfirstView:OnSize(UINT nType, int cx, int cy) CView:OnSize(nType, cx, cy); / TODO: 在此处添加消息处理程序代码 GLdouble aspect_ratio; / wi
30、dth/height ratio if ( 0 >= cx | 0 >= cy ) return; / select the full client area :glViewport(0, 0, cx, cy); / compute the aspect ratio / this will keep all dimension scales equal
31、0;aspect_ratio = (GLdouble)cx/(GLdouble)cy; / select the projection matrix and clear it :glMatrixMode(GL_PROJECTION); :glLoadIdentity(); / select the viewing volume :gluPerspective(45.0f, aspect_ratio, .01f, 200.0f);/画三维 /:gluOrtho2D(-10.0f, 10.0f, -10.0f, 10.
32、0f); /二维 / switch back to the modelview matrix and clear it :glMatrixMode(GL_MODELVIEW); :glLoadIdentity(); 9, 在绘制场景时,一般包括如下步骤:1)清空缓存。2)绘制场景。3)Flush掉渲染流水线。4)若设置了双缓冲,则交换前后台缓冲区。void CfirstView:OnDraw(CDC* /*pDC*/) CfirstDoc* pD
33、oc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; / TODO: 在此处为本机数据添加绘制代码 / Clear out the color & depth buffers :glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); RenderScen
34、e();/绘图都放在这 / Tell OpenGL to flush its pipeline :glFinish(); / Now Swap the buffers :SwapBuffers( m_pDC->GetSafeHdc() ); 10, 为了使改变窗口大小时严重的闪烁,在OnEraseBkgnd里做一些操作,避免windows自己的窗口刷新闪烁。BOOL
35、 CfirstView:OnEraseBkgnd(CDC* pDC)/ TODO: 在此添加消息处理程序代码和/或调用默认值 return TRUE;11, 为了避免内存泄露,我们要将在SetupPixelFormat()中使用了new运算符来为CClientDC对象分配的内存在程序关闭时delete掉。 void CfirstView:OnDestroy()&
36、#160; CView:OnDestroy(); / TODO: 在此处添加消息处理程序代码 /Make the RC non-current if(:wglMakeCurrent (0,0) = FALSE) MessageBox(_T("C
37、ould not make RC non-current"); /Delete the rendering context if(:wglDeleteContext (m_hRC)=FALSE) MessageBox(_T("Could not delete RC");
38、160; /Delete the DC if(m_pDC) delete m_pDC; /Set it to NULL m_pDC = NULL; 12, &
39、#160; 下面写主绘图函数,RenderScene(),在窗口画了一个正方体、一个四面体。 void CfirstView:RenderScene() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); / Clear Screen And Depth Buffer glLoadIdentity();
40、0; / Reset The Current Modelview Matrix glTranslatef(-1.5f,0.0f,-6.0f);
41、60; / Move Left 1.5 Units And Into The Screen 6.0 glRotatef(30,0.0f,1.0f,0.0f); &
42、#160; / Rotate The Triangle On The Y axis ( NEW ) glBegin(GL_TRIANGLES); / Start
43、Drawing A Triangle glColor3f(1.0f,0.0f,0.0f); / Red glVertex3f( 0.0f, 1.0f, 0.0f);
44、; / Top Of Triangle (Front) glColor3f(0.0f,1.0f,0.0f); / Green &
45、#160;glVertex3f(-1.0f,-1.0f, 1.0f); / Left Of Triangle (Front) glColor3f(0.0f,0.0f,1.0f);
46、60; / Blue glVertex3f( 1.0f,-1.0f, 1.0f); / Right Of Triangle (Front) glColor3f(1.0f,0.0f,0.0f);
47、0; / Red glVertex3f( 0.0f, 1.0f, 0.0f); / Top
48、 Of Triangle (Right) glColor3f(0.0f,0.0f,1.0f); / Blue glVertex3f( 1.0f,-1.0f, 1.0f);
49、160; / Left Of Triangle (Right) glColor3f(0.0f,1.0f,0.0f); / Green
50、60; glVertex3f( 1.0f,-1.0f, -1.0f); / Right Of Triangle (Right) glColor3f(1.0f,0.0f,0.0f);
51、60; / Red glVertex3f( 0.0f, 1.0f, 0.0f); / Top Of Triangle (Back) glColor3f(0.0f,1.0f,0.0f);
52、160; / Green glVertex3f( 1.0f,-1.0f, -1.0f); / Left Of Tr
53、iangle (Back) glColor3f(0.0f,0.0f,1.0f); / Blue glVertex3f(-1.0f,-1.0f, -1.0f);
54、160; / Right Of Triangle (Back) glColor3f(1.0f,0.0f,0.0f); / Red glVer
55、tex3f( 0.0f, 1.0f, 0.0f); / Top Of Triangle (Left) glColor3f(0.0f,0.0f,1.0f);
56、60; / Blue glVertex3f(-1.0f,-1.0f,-1.0f); / Left Of Triangle (Left) glColor3f(0.0f,1.0f,0.0f);
57、 / Green glVertex3f(-1.0f,-1.0f, 1.0f); / Right Of Triang
58、le (Left) glEnd(); &
59、#160;/ Done Drawing The Pyramid glLoadIdentity(); / Reset The
60、Current Modelview Matrix glTranslatef(1.5f,0.0f,-7.0f); / Move Right 1.5 Units And Into The Screen 7.0 glRotatef(25,1.0f,1.
61、0f,1.0f); / Rotate The Quad On The X axis ( NEW ) glBegin(GL_QUADS);
62、 / Draw A Quad glColor3f(0.0f,1.0f,0.0f);
63、60;/ Set The Color To Green glVertex3f( 1.0f, 1.0f,-1.0f); / Top Right Of The Quad (Top) glVertex3f(-1.0f, 1.0f,-1.0f);
64、0; / Top Left Of The Quad (Top) glVertex3f(-1.0f, 1.0f, 1.0f); / Bottom Left Of The Quad (Top
65、) glVertex3f( 1.0f, 1.0f, 1.0f); / Bottom Right Of The Quad (Top) glColor3f(1.0f,0.5f,0.0f); &
66、#160; / Set The Color To Orange glVertex3f( 1.0f,-1.0f, 1.0f); / Top Right Of The Quad (Bottom)
67、0; glVertex3f(-1.0f,-1.0f, 1.0f); / Top Left Of The Quad (Bottom) glVertex3f(-1.0f,-1.0f,-1.0f);
68、60; / Bottom Left Of The Quad (Bottom) glVertex3f( 1.0f,-1.0f,-1.0f); / Bottom Right Of The Quad (Bottom)
69、 glColor3f(1.0f,0.0f,0.0f); / Set The Color To Red glVertex3f( 1.0f, 1.0f, 1.0f);
70、 / Top Right Of The Quad (Front) glVertex3f(-1.0f, 1.0f, 1.0f); / Top Left Of The Quad (Front) glVer
71、tex3f(-1.0f,-1.0f, 1.0f); / Bottom Left Of The Quad (Front) glVertex3f( 1.0f,-1.0f, 1.0f);
72、160; / Bottom Right Of The Quad (Front) glColor3f(1.0f,1.0f,0.0f); / Set The Color To Yellow glVerte
73、x3f( 1.0f,-1.0f,-1.0f); / Top Right Of The Quad (Back) glVertex3f(-1.0f,-1.0f,-1.0f); &
74、#160; / Top Left Of The Quad (Back) glVertex3f(-1.0f, 1.0f,-1.0f); / Bottom Left Of The Quad (Back) glVertex3f( 1.0f, 1.0f,-1.0f);
75、 / Bottom Right Of The Quad (Back) glColor3f(0.0f,0.0f,1.0f); &
76、#160; / Set The Color To Blue glVertex3f(-1.0f, 1.0f, 1.0f); / Top Right Of The Quad (Left) glVertex3f(-1.0f, 1.0f,-1.0f);
77、160; / Top Left Of The Quad (Left) glVertex3f(-1.0f,-1.0f,-1.0f); / Bottom Left Of The Quad (Left) glVertex3f(-1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国餐饮美食广场行业运行现状及发展前景趋势分析报告
- 2025-2030年中国锰酸锂市场运行现状及发展前景预测报告
- 2025-2030年中国金属家具制造市场竞争格局展望及投资策略分析报告
- 2025-2030年中国过滤材料市场发展趋势规划研究报告
- 2025-2030年中国起酥油产业竞争格局规划分析报告
- 2025-2030年中国调味紫菜市场十三五规划及发展战略研究报告
- 2025-2030年中国融资租赁担保行业前景趋势调研及发展战略分析报告
- 2025-2030年中国蔬菜种植行业市场运行状况与发展规划分析报告
- 2025-2030年中国菠萝超浓缩汁行业运行状况及发展趋势分析报告
- 2025-2030年中国花岗岩荒料行业运营现状及发展趋势分析报告
- 食堂油锅起火演练方案及流程
- 2024年江西电力职业技术学院单招职业技能测试题库及答案解析
- 医疗器械销售渠道管理
- 幼儿园中班跳绳实施方案及措施
- 2024年中考政治总复习初中道德与法治知识点总结(重点标记版)
- 小学学校培优辅差计划
- 【真题】2023年常州市中考道德与法治试卷(含答案解析)
- 高速公路工程项目监理质量控制
- 肺结节围术期护理
- 马锡五审判方式
- 矿物加工工程概论
评论
0/150
提交评论