OpenGL入门1——安装及编程环境配置

一、OpenGL的安装

      我的PC环境:win7+VS2010

1、检查兼容性(可跳过)

 OpenGL版本众多,而且各显卡厂商也有自己开发的扩展库。要想使用某个版本进行开发,既需要显卡本身支持所需的功能,又需要驱动程序能兼容这个版本。决定使用哪一个版本之前,先要用GPU Caps Viewer检查一下支持的OpenGL和GLSL的最高版本和具体支持哪些扩展

2、准备文件

    下载GLUT(OpenGL应用工具包);其中包含glut.h、glut.lib、glut32.lib、glut.dll、glut32.dll

3、安装

 

 

二、OpenGL编程环境配置

1、设置像素格式

为view类添加成员函数:BOOL SetWindowPixelFormat(HDC hDC);//设置像素格式

和成员变量:int m_GLPixelIndex;//像素格式索引,并在view构造函数中添加:this->m_GLPixelIndex = 0;

BOOL CXXXView::SetWindowPixelFormat(HDC hDC)
{//定义窗口的像素格式
  PIXELFORMATDESCRIPTOR pixelDesc=
  {
        sizeof(PIXELFORMATDESCRIPTOR),
        1,
        PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
        PFD_DOUBLEBUFFER|PFD_SUPPORT_GDI,
        PFD_TYPE_RGBA,
        24,
        0,0,0,0,0,0,
        0,
        0,
        0,
        0,0,0,0,
        32,
        0,
        0,
        PFD_MAIN_PLANE,
        0,
        0,0,0
  };
  this->m_GLPixelIndex = ChoosePixelFormat(hDC,&pixelDesc);//选择最相近的像素格式
  if(this->m_GLPixelIndex==0)
  {//选择失败
    this->m_GLPixelIndex = 1;//默认的像素格式
    if(DescribePixelFormat(hDC,this->m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
    {//用默认的像素格式进行设置
    return FALSE;
    }
  }
  if(SetPixelFormat(hDC,this->m_GLPixelIndex,&pixelDesc)==FALSE)
  {
    return FALSE;
  }
  return TRUE;
}

 

2、创建绘图环境RC

为view类添加成员函数:BOOL CreateViewGLContext(HDC hDC);//创建绘制环境(RC)并使之成为当前绘制环境

和成员变量:HGLRC m_hGLContext;//绘制环境,并在view构造函数中添加:this->m_hGLContext = NULL;

BOOL CXXXView::CreateViewGLContext(HDC hDC)
{    
      this->m_hGLContext = wglCreateContext(hDC);//创建RC    
      if(this->m_hGLContext==NULL)     
     {     //创建失败        
         return FALSE;    
     }    
     if(wglMakeCurrent(hDC,this->m_hGLContext)==FALSE)    
     {//选为当前RC失败        
         return FALSE;    
     }    
     return TRUE;
}

3、定义初始化和绘制函数

为view类添加成员函数   BOOL InitGL(GLvoid);//初始化openGL和成员函数 int DrawGLScene(GLvoid);//绘图代码区

BOOL CXXXView::InitGL(GLvoid) // All Setup For OpenGL Goes Here
{  
      glShadeModel(GL_SMOOTH); // Enable Smooth Shading  
      glClearColor(0.0,0.0,0.0,0.0); // Black Background  
      glClearDepth(1.0f); // Depth Buffer Setup
      //glEnable(GL_DEPTH_TEST);  // Enables Depth Testing
      //glDepthFunc(GL_LEQUAL);  // The Type Of Depth Testing To Do  
      glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// Really Nice Perspective Calculations  
      return TRUE;      // Initialization Went OK
}

int CodemoView::DrawGLScene(GLvoid) 
{
//在这里写绘图代码
}


 


4、修改view已有函数

(1)、PreCreateWindow

BOOL CXXXView::PreCreateWindow(CREATESTRUCT& cs)
{  
      // TODO: 在此处通过修改  
    // CREATESTRUCT cs 来修改窗口类或样式  
    cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);//openGL必需的  
    return CView::PreCreateWindow(cs);
}


(2)、OnSize

void CXXXView::OnSize(UINT nType, int cx, int cy)
{
	CView::OnSize(nType, cx, cy);

	// TODO: 在此处添加消息处理程序代码
	GLsizei width,height;
    GLdouble aspect;
    width = cx;
    height = cy;
    if(cy==0)
    {
        aspect = (GLdouble)width;
    }
    else
    {
        aspect = (GLdouble)width/(GLdouble)height;
    }
    glViewport(0,0,width,height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0,500.0*aspect,0.0,500.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    return ;
}

(3)、OnCreate

int CXXXView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	HWND hWnd = this->GetSafeHwnd();    
    HDC hDC = ::GetDC(hWnd);

	//设置像素格式
    if(this->SetWindowPixelFormat(hDC)==FALSE)
    {
        return 0;
    }

	//创建RC并选为所用
    if(this->CreateViewGLContext(hDC)==FALSE)
    {
        return 0;
    }

	//初始化openGL
	if(!this->InitGL())    
	{        
		return 0;    
	}
	return 0;
}


(4)、OnDestroy

void CXXXView::OnDestroy()
{
	CView::OnDestroy();

	// TODO: 在此处添加消息处理程序代码
	 if(wglGetCurrentContext()!=NULL)
    {
        wglMakeCurrent(NULL,NULL);
    }
    if(this->m_hGLContext!=NULL)
    {
        wglDeleteContext(this->m_hGLContext);
        this->m_hGLContext = NULL;
    }
}



注意:1、要在OnPaint函数中调用 DrawGLScene函数来绘制OpenGL场景;

           2、在OnPaint函数末尾或DrawGLScene函数内部末尾添加“SwapBuffers( ::GetDC(m_hWnd) );”来将场景展现出来。

 

三、OpenGL 创建窗口(控制台程序)

1、头文件

     windows.h 和glut.h

2、动作执行顺序

在main函数中:

(1)初始化GLUT:

         glutInit(&argc, argv);

  (2) 设置显示模式:

         例如:glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

  (3)设置窗口位置、大小、标题、创建窗口

        例如:

              glutInitWindowPosition(50, 100);

              glutInitWindowSize(400, 300);

              glutCreateWindow("An Example OpenGL Program");

  (4)额外的初始化指定(自己实现)

       例如:

              void init(void)

              {

                     glClearColor(1.0, 0.0, 0.0, 0.0);

                     glMatrexMode( GL_PROJECTION );

                     gluOrtho2D( 0.0, 200.0, 0.0, 150.0 );

              }

   (5)设置显示回调函数

   例如:

          自己实现显示回调函数(display callback function):       

             void lineSegment()
          {
                 glClear( GL_COLOR_BUFFER_BIT );

                 glColor3f(1.0, 0.0, 0.0);
                 glBegin( GL_LINES );
                 glVertex2i(180, 15);
                 glVertex2i(10, 145);
                 glEnd();
                 glFlush();
         }

         将图形发送到屏幕窗口

         glutDisplayFunc( lineSegment );

   (6)设置消息循环

        glutMainLoop();

 补充:

        可以为程序注册各种事件处理回调函数,就像使用glutDisplayFunc注册显示回调函数一样。

        1*、注册窗口大小改变时的回调函数

            glutReshapeFunc( void  (*func)(int w, int h));

        2*、注册键盘按键回调函数

           glutKeyboardFunc( void (*func)(unsigned char key, int x, int y));

        3*、注册鼠标按下(非鼠标移动)回调函数

           glutMouseFunc( void (*func)( int button, int state, int x, int y));

        4*、注册当按下鼠标按钮并移动鼠标时的回调函数

           glutMotionFunc( void (*func)(int x, int y) );

        5*、注册空闲处理回调函数

           glutIdleFunc(  void (*func)( void) );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值