OpenGL的配置以及在MFC框架上的使用(附上源代码)

一.配置MFC环境

首先创建一个单文档的MFC文档,相信学过MFC的朋友应该都知道。我这里取名为openGLForm,下面就是配置环境。

1. 添加链接库
笔者这里将opengl库放在项目文件夹里,使用相对路径进行配置,便于转移到另外的计算机时不用费时间去配置。这里写图片描述
库目录和include目录都是相对路径:../OpenGL,如图:
这里写图片描述
这里写图片描述
在附加依赖项上加上OpenGL32.lib GLu32.lib GLaux.lib;
做完配置以后可以自己运行一下,没有出现报错就说明配置成功,可以进行下一步啦。

2.头文件和添加响应函数
在stdafx里面添加opengl的头文件(当然也可以在其他文件中添加,比如绘图一般都是在视图中的,可以在xxxView.cpp文件中包含头文件)。如下代码所示:
include < glaux.h>
include < glut.h>;
COpenGLFormView类的属性栏,为下述消息加入消息处理函数:WM_CREATE (for OnCreate), WM_DESTROY (for OnDestroy), WM_SIZE (for OnSize), WM_ERASEBACKGROUND (for OnEraseBkground).

3.编写函数
设置窗口显示风格。窗口创建之前我们必须设置窗口风格包含WS_CLIPCHILDREN和 WS_CLIPSIBLINGS,从而避免OpenGL绘制到其他窗口中去。这些应该放在PreCreateWindow()中。

BOOL CfirstView::PreCreateWindow(CREATESTRUCT& cs)

{

 // TODO: 在此处通过修改

 // CREATESTRUCT cs 来修改窗口类或样式

 cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;//Tramp

 return CView::PreCreateWindow(cs);

}


在CfirstView.h中加入如下语句:

HGLRC m_hRC;    //Rendering Context着色描述表

    CDC* m_pDC;        //Device Context设备描述表

    BOOL InitializeOpenGL();    //Initialize OpenGL

    BOOL SetupPixelFormat();    //Set up the Pixel Format

    void RenderScene();            //Render the Scene


在OnCreate中我们将通过建立像素格式和绘制上下文来初始化OpenGL. 在InitializeOpenGL()中会创建一个设备上下文(DC),为这个DC选择一个像素格式,创建和这个DC相关的绘制上下文(RC),然后选择这个RC.这个函数会调用SetupPixelFormat()来建立像素格式。
int Clesson1View::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CView::OnCreate(lpCreateStruct) == -1)

  return -1;

// TODO: 在此添加您专用的创建代码

InitializeOpenGL();//初始化openGL绘图

return 0;

}

 //初始化opengl绘制

BOOL CfirstView::InitializeOpenGL()

{

//Get a DC for the Client Area

m_pDC = new CClientDC(this);

//Failure to Get DC

if(m_pDC == NULL)

{

    //::MessageBox("Error Obtaining DC");

    return FALSE;

}

//Failure to set the pixel format

if(!SetupPixelFormat())

{

    return FALSE;

}

//Create Rendering Context

m_hRC = ::wglCreateContext (m_pDC->GetSafeHdc ());

//Failure to Create Rendering Context

if(m_hRC == 0)

{

  // MessageBox("Error Creating RC");

  return FALSE;

}

//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

::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 =

{

  sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd

  1,                              // version number

  PFD_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

  16,                             // 16-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 m_nPixelFormat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);

if ( m_nPixelFormat == 0 )

{

  return FALSE;

}

if ( ::SetPixelFormat(m_pDC->GetSafeHdc(), m_nPixelFormat, &pfd) == FALSE)

{

  return FALSE;

}

return TRUE;

}

在OnSize()中一般用来设置视口和视锥,因为这些是和窗口大小相关的。基本操作包括设置视口,选择投影矩阵,设置模型视图矩阵。

void CfirstView::OnSize(UINT nType, int cx, int cy)

{

 CView::OnSize(nType, cx, cy);



 // TODO: 在此处添加消息处理程序代码

 GLdouble aspect_ratio; // width/height ratio


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值