知识大全 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

相关参考

知识大全 我的Visual C++入门之路

我的VisualC++入门之路  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!N次失败次成功还学的不

知识大全 Visual C#编程入门之语句

VisualC#编程入门之语句  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  程序的活动是通过语

知识大全 Visual C++实现各种文字特殊效果

VisualC++实现各种文字特殊效果  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!.NET编程免

知识大全 visual studio2008 OpenGL开发配置

visualstudio2008OpenGL开发配置  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 visual studio2008 OpenGL开发配置方法

visualstudio2008OpenGL开发配置方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 Visual C++ 2005中混合代码的初始化

VisualC++2005中混合代码的初始化  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在V

知识大全 用Delphi进行OpenGL编程学习心得

用Delphi进行OpenGL编程学习心得  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在开发

知识大全 Visual C++制作一个Sniffer实例

VisualC++制作一个Sniffer实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Snif

知识大全 学习C++的最大难度

初学者编程入门:学习C++的最大难度  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!困难度之一C++

知识大全 Visual C++编译器常用选项设置

VisualC++编译器常用选项设置  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Matlab