知识大全 Visual C++中OpenGL编程入门
Posted 环境
篇首语:于高山之巅,方见大河奔涌;于群峰之上,更觉长风浩荡。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Visual C++中OpenGL编程入门相关的知识,希望对你有一定的参考价值。
Visual C++中OpenGL编程入门 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
OpenGL作图非常方便 故日益流行 但对许多人来说 是在微机上进行的 首先碰到的问题是 如何适应微机环境 这往往是最关键的一步 虽然也是最初级的 一般的 我不建议使用glut 包 那样难以充分发挥 windows 的界面上的功能 下面介绍如何在 VC++ 上进行 OpenGL 编程 OpenGL 绘图的一般过程可以看作这样的 先用 OpenGL 语句在 OpenGL 的绘图环境 RenderContext (RC)中画好图 然后再通过一个 Swap buffer 的过程把图传给操作系统的绘图环境 DeviceContext (DC)中 实实在在地画出到屏幕上 下面以画一条 Bezier 曲线为例 详细介绍VC++ 上 OpenGL编程的方法 文中给出了详细注释 以便给初学者明确的指引 一步一步地按所述去做 你将顺利地画出第一个 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 四 设置编译环境 在 BezierCurve h 和 TestView h 内各加上 #include <GL/gl h> #include <GL/glu h> #include <GL/glaux h> 在集成环境中 Project | Settings | Link | Object/library module | opengl lib glu lib glaux lib | OK 五 设置 OpenGL 工作环境 (下面各个操作 均针对 TestView cpp ) 处理 PreCreateWindow(): 设置 OpenGL 绘图窗口的风格 cs style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC; 处理 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) == ) return ; myInitOpenGL(); return ; void CTestView::myInitOpenGL() m_pDC = new CClientDC(this); //创建 DC ASSERT(m_pDC != NULL); if (!mySetupPixelFormat()) //设定绘图的位图格式 函数下面列出 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::mySetupPixelFormat() //我们暂时不管格式的具体内容是什么 以后熟悉了再改变格式 static PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR) // size of this pfd // version number PFD_DRAW_TO_WINDOW | // support window PFD_SUPPORT_OPENGL | // support OpenGL PFD_DOUBLEBUFFER // double buffered PFD_TYPE_RGBA // RGBA type // bit color depth // color bits ignored // no alpha buffer // shift bit ignored // no accumulation buffer // accum bits ignored // bit z buffer // no stencil buffer // no auxiliary buffer PFD_MAIN_PLANE // main layer // reserved // layer masks ignored ; int pixelformat; if ( (pixelformat = ChoosePixelFormat(m_pDC >m_hDC &pfd)) == ) MessageBox( ChoosePixelFormat failed ); return FALSE; if (SetPixelFormat(m_pDC >m_hDC pixelformat &pfd) == FALSE) MessageBox( SetPixelFormat failed ); return FALSE; return TRUE; 处理 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(); 处理 OnEraseBkgnd() BOOL CTestView::OnEraseBkgnd(CDC* pDC) // TODO: Add your message handler code here and/or call default // return CView::OnEraseBkgnd(pDC); //把这句话注释掉 若不然 Window //会用白色北景来刷新 导致画面闪烁 return TRUE;//只要空返回即可 处理 OnDraw() void CTestView::OnDraw(CDC* pDC) wglMakeCurrent(m_pDC >m_hDC m_hRC);//使 RC 与当前 DC 相关联 myDrawScene( ); //具体的绘图函数 在 RC 中绘制 SwapBuffers(m_pDC >m_hDC);//把 RC 中所绘传到当前的 DC 上 从而 //在屏幕上显示 wglMakeCurrent(m_pDC >m_hDC NULL);//释放 RC 以便其它 DC 进行绘图 void CTestView::myDrawScene( ) glClearColor( f f f f);//设置背景颜色为黑色 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslated( f f f);//把物体沿( )方向平移 //以便投影时可见 因为缺省的视点在( ) 只有移开 //物体才能可见 //本例是为了演示平面 Bezier 曲线的 只要作一个旋转 //变换 可更清楚的看到其 D 效果 //下面画一条 Bezier 曲线 bezier_curve myPolygon();//画Bezier曲线的控制多边形 bezier_curve myDraw(); //CBezierCurve bezier_curve //是 CTestView 的成员变量 //具体的函数见附录 glPopMatrix(); glFlush(); //结束 RC 绘图 return;
处理 OnSize() void CTestView::OnSize(UINT nType int cx int cy) CView::OnSize(nType cx cy); VERIFY(wglMakeCurrent(m_pDC >m_hDC m_hRC));//确认RC与当前DC关联 w=cx; h=cy; VERIFY(wglMakeCurrent(NULL NULL));//确认DC释放RC 处理 OnLButtonDown() void CTestView::OnLButtonDown(UINT nFlags CPoint point) CView::OnLButtonDown(nFlags point); if(bezier_curve m_N>MAX ) MessageBox( 顶点个数超过了最大数MAX= ); return; //以下为坐标变换作准备 GetClientRect(&m_ClientRect);//获取视口区域大小 w=m_ClientRect right m_ClientRect left;//视口宽度 w h=m_ClientRect bottom m_ClientRect top;//视口高度 h //w h 是CTestView的成员变量 centerx=(m_ClientRect left+m_ClientRect right)/ ;//中心位置 centery=(m_ClientRect top+m_ClientRect bottom)/ ;//取之作原点 //centerx centery 是 CTestView 的成员变量 GLdouble tmpx tmpy; tmpx=scrx glx(point x);//屏幕上点坐标转化为OpenGL画图的规范坐标 tmpy=scry gly(point y); bezier_curve m_Vertex[bezier_curve m_N] x=tmpx;//加一个顶点 bezier_curve m_Vertex[bezier_curve m_N] y=tmpy; bezier_curve m_N++;//顶点数加一 InvalidateRect(NULL TRUE);//发送刷新重绘消息 double CTestView::scrx glx(int scrx) return (double)(scrx centerx)/double(h); double CTestView::scry gly(int scry) 附录 CBezierCurve 的声明: (BezierCurve h) class CBezierCurve public: myPOINT D m_Vertex[MAX];//控制顶点 以数组存储 //myPOINT D 是一个存二维点的结构 //成员为Gldouble x y int m_N; //控制顶点的个数 public: CBezierCurve(); virtual ~CBezierCurve(); void bezier_generation(myPOINT D P[MAX] int level); //算法的具体实现 void myDraw();//画曲线函数 void myPolygon(); //画控制多边形 ; CBezierCurve 的实现: (BezierCurve cpp) CBezierCurve::CBezierCurve() m_N= ; m_Vertex[ ] x= f; m_Vertex[ ] y= f; m_Vertex[ ] x= f; m_Vertex[ ] y= f; m_Vertex[ ] x= f; m_Vertex[ ] y= f; m_Vertex[ ] x= f; m_Vertex[ ] y= f; CBezierCurve::~CBezierCurve() void CBezierCurve::myDraw() bezier_generation(m_Vertex LEVEL); void CBezierCurve::bezier_generation(myPOINT D P[MAX] int level) //算法的具体描述 请参考相关书本 int i j; level ; if(level< )return; if(level== ) glColor f( f f f); glBegin(GL_LINES); //画出线段 glVertex d(P[ ] x P[ ] y); glVertex d(P[m_N ] x P[m_N ] y); glEnd();//结束画线段 return; //递归到了最底层 跳出递归 myPOINT D Q[MAX] R[MAX]; for(i= ;i Q[i] x=P[i] x; Q[i] y=P[i] y; for(i= ;i<m_N;i++) R[m_N i] x=Q[m_N ] x; R[m_N i] y=Q[m_N ] y; for(j=m_N ;j>=i;j ) Q[j] x=(Q[j ] x+Q[j] x)/double( ); Q[j] y=(Q[j ] y+Q[j] y)/double( ); R[ ] x=Q[m_N ] x; R[ ] y=Q[m_N ] y; bezier_generation(Q level); bezier_generation(R level); void CBezierCurve::myPolygon() glBegin(GL_LINE_STRIP); //画出连线段 glColor f( f f f); for(int i= ;i<m_N;i++) glVertex d(m_Vertex[i] x m_Vertex[i] y); glEnd();//结束画连线段 cha138/Article/program/net/201311/11388相关参考
我的VisualC++入门之路 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!N次失败次成功还学的不
VisualC#编程入门之语句 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 程序的活动是通过语
VisualC++实现各种文字特殊效果 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!.NET编程免
知识大全 visual studio2008 OpenGL开发配置
visualstudio2008OpenGL开发配置 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 visual studio2008 OpenGL开发配置方法
visualstudio2008OpenGL开发配置方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
VisualC++2005中混合代码的初始化 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在V
用Delphi进行OpenGL编程学习心得 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在开发
VisualC++制作一个Sniffer实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Snif
初学者编程入门:学习C++的最大难度 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!困难度之一C++
VisualC++编译器常用选项设置 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Matlab