全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
OpenGL 作图非常方便,故日益流行,但对许多人来说,是在微机上进行的,首先碰到的问题是,如何适应微机环境。这往往是最关键的一步,虽然也是最初级的。 下面介绍如何在 VC+ 上进行 OpenGL 编程。其实相当简单明快,只因国内缺少这方面的资料与例子,致使许多小细节要一个一个地试,耗去大量时间。希望各位有什么心得体会,也公布出来,从而节省每个人都要试试的时间。 言归正传,下面以画一条 Bezier 曲线为例,详细介绍VC+ 上 OpenGL编程的方法。这里实际上也给出了个 C+ 良好封装性编程的范例。文中给出了详细注释,以便给初学者明确的指引。一步一步地按所述去做,你将顺利地画出第一个 OpenGL 平台上的图形来。 一、产生程序框架 Test.dsw New Project | MFC Application Wizard (EXE) | Test | OK *注* : 加“”者指要手工敲入的字串 二、导入 Bezier 曲线类的文件。用下面方法产生 BezierCurve.h BezierCurve.cpp 两个文件: WorkSpace | ClassView | Test Classes| New Class | Generic Class(不用MFC类) | CBezierCurve | OK 三、编辑好 Bezier 曲线类的定义与实现。写好下面两个文件: BezierCurve.h BezierCurve.cpp 四、设置编译环境: 1. 在 BezierCurve.h 和 TestView.h 内各加上: #include #include #include 2. 在集成环境中,Project | Settings | Link | Object/library module | opengl32.lib glu32.lib glaux.lib | OK 五、设置 OpenGL 工作环境:(下面各个操作,均针对 TestView.cpp ) 1. 处理 PreCreateWindow(): 设置 OpenGL 绘图窗口的风格 cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC; 2. 处理 OnCreate():创建 OpenGL 的绘图设备。 OpenGL 绘图的机制 是: 先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC ) 把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的绘图上下文 Device Context (简记为 DC).要注意的是,程序运行过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图后,要立即释放 RC,以便其它的 DC 也使用。在后面的代码中,将有详细注释。 int CTestView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1) return -1; Init(); return 0; void CTestView:Init() m_pDC = new CClientDC(this); /创建 DC ASSERT(m_pDC != NULL); if (!bSetupPixelFormat() /设定绘图的位图格式,函数下面列出 return; m_hRC = wglCreateContext(m_pDC-m_hDC);/创建 RC wglMakeCurrent(m_pDC-m_hDC, m_hRC); /RC 与当前 DC 相关联 /CClient * m_pDC; HGLRC m_hRC; 是 CTestView 的成员变量 BOOL CTestView:bSetupPixelFormat() static PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR), / size of this pfd 1, / version number P FD_DRAW_TO_WINDOW | / support window PFD_SUPPORT_OPENGL | / support OpenGL PFD_DOUBLEBUFFER, / double buffered PFD_TYPE_RGBA, / RGBA type 24, / 24-bit color depth 0, 0, 0, 0, 0, 0, / color bits ignored 0, / no alpha buffer 0, / shift bit ignored 0, / no accumulation buffer 0, 0, 0, 0, / accum bits ignored 32, / 32-bit z-buffer 0, / no stencil buffer 0, / no auxiliary buffer PFD_MAIN_PLANE, / main layer 0, / reserved 0, 0, 0 / layer masks ignored ; int pixelformat; if ( (pixelformat = ChoosePixelFormat(m_pDC-m_hDC, &pfd) = 0 ) MessageBox(ChoosePixelFormat failed); return FALSE; if (SetPixelFormat(m_pDC-m_hDC, pixelformat, &pfd) = FALSE) MessageBox(SetPixelFormat failed); return FALSE; return TRUE; 3. 处理 OnDestroy() void CTestView:OnDestroy() wglMakeCurrent(m_pDC-m_hDC,NULL); /释放与m_hDC 对应的 RC wglDeleteContext(m_hRC); /删除 RC if (m_pDC) delete m_pDC; /删除当前 View 拥有的 DC CView:OnDestroy(); 4. 处理 OnEraseBkgnd() BOOL CTestView:OnEraseBkgnd(CDC* pDC) / TODO: Add your message handler code here and/or call default / return CView:OnEraseBkgnd(pDC);/把这句话注释掉,若不然,Window /会用白色北景来刷新,导致画面闪烁 return TRUE;/只要空返回即可。 5. 处理 OnDraw() void CTestView:OnDraw(CDC* pDC) wglMakeCurrent(m_pDC-m_hDC,m_hRC);/使 RC 与当前 DC 相关联 DrawScene( ); /具体的绘图函数,在 RC 中绘制 SwapBuffers(m_pDC-m_hDC);/把 RC 中所绘传到当前的 DC 上,从而 /在屏幕上显示 wglMakeCurrent(m_pDC-m_hDC,NULL);/释放 RC,以便其它 DC 进行绘图 void CTestView:DrawScene( ) glClearColor(0.0f,0.0f,0.0f,1.0f);/设置背景颜色为黑色 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslated(0.0f,0.0f,-3.0f);/把物体沿(0,0,-1)方向平移 /以便投影时可见。因为缺省的视点在(0,0,0),只有移开 /物体才能可见。 / /本例是为了演示平面 Bezier 曲线的,只要作一个旋转 /变换,可更清楚的看到其 3D 效果。 glRotated(30,1.0f,0.0f,0.0f); /绕 X 轴转 30 度 / glRotated(30,0.0f,1.0f,0.0f); /绕 Y 轴转 30 度 glBegin(GL_LINES);/画坐标系,由三条线段组成 glColor3f(1,0,0); glVertex3f(0,0,0); glVertex3f(1,0,0);/坐标 glColor3f(0,1,0); glVertex3f(0,0,0); glVertex3f(0,1,0);/坐标 glColor3f(0,0,1); glVertex3f(0,0,0); glVertex3f(0,0,1);/坐标 glEnd();/end draw th
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东高速集团有限公司2025年下半年校园招聘(管培生和战略产业人才招聘)备考题库及1套参考答案详解
- 2026年山东省滨州地区单招职业适应性考试模拟测试卷及答案1套
- 峨眉山旅游股份有限公司2026年公开招聘专业人才备考题库及参考答案详解1套
- 2026年铁岭市人民来访接待中心遴选工作人员6人参考题库附答案
- 巴州航空产业发展有限公司发布2026年第一季度招聘备考题库附答案详解
- 2026年大学电工期末试题及参考答案
- 企业内部培训与人才培养计划手册
- 2025年化工产品生产安全管理手册
- 2026年湖北省黄石市单招职业倾向性考试模拟测试卷及答案1套
- 广东电信规划设计院2026届校招备考题库完整答案详解
- 《创新创业基础》课件-项目1:创新创业基础认知
- 2026北京市通州区事业单位公开招聘工作人员189人笔试重点基础提升(共500题)附带答案详解
- 2025~2026学年山东省菏泽市牡丹区第二十一初级中学八年级上学期期中历史试卷
- 2026国家统计局仪征调查队招聘辅助调查员1人(江苏)考试参考试题及答案解析
- 2025至2030中国细胞存储行业调研及市场前景预测评估报告
- 《中华人民共和国危险化学品安全法》解读
- 水暖施工员考试及答案
- 2025年省级行业企业职业技能竞赛(老人能力评估师)历年参考题库含答案
- 水利工程施工质量检测方案
- 2025年北京高中合格考政治(第一次)试题和答案
- 卵巢类癌诊治中国专家共识(2025年版)
评论
0/150
提交评论