VC环境下基于MFC框架的OpenGL的编程环境的配置
学习OpenGL时,一般都是在控制台环境下的窗口,这里简单介绍一下基于MFC框架的OpenGL的编程环境的配置,希望对你有所帮助。
在开始之前,首先确保你的VC已经包含了相应的OpenGL库文件,否则,将无法进行编译。若没有的话,可以从这里下载:http://butterflydog.download.csdn.net/
然后解压,将INCLUDE文件夹中的头文件拷贝到VC安装目录下的/Include/GL文件夹中;
将LIB文件夹中的头文件拷贝到VC安装目录下的/Lib文件夹中;
将DLL文件夹中的头文件拷贝到C:/Windows/System32文件夹中;
下面介绍在VC环境中建立基于OpenGL标准的应用程序框架的具体方法与步骤,阅读时务必认真,不要有所遗漏:
(1)创建项目文件:选择File/New菜单选项,建立一个名为MyTest的单文档(SDI)应用程序
(2)选择Project/Setting菜单选项,在Link栏的Lib输入域中添加openg132.lib、glu32.lib,若需使用OpenGL的辅助库函数,则还需添加glaux.lib。
(3) 为CMyTestView类添加一个公有的成员变量,类型为CClientDC,命名为*m_pDC
(4) 为CMyTestView类添加WM_DESTROY函数,并修改代码如下:注意,新添加的代码一定要加在原来代码之前,即m_pDC要先进行销毁。
void CMyTestView::OnDestroy()
{
HGLRC hrc;
hrc = ::wglGetCurrentContext();
::wglMakeCurrent(NULL, NULL);
if (hrc)
::wglDeleteContext(hrc);
if (m_pDC)
delete m_pDC;
CView::OnDestroy();
// TODO: Add your message handler code here
}
(5) 为CMyTestView类添加成员函数 BOOL bSetupPixelFormat(void) , 用于与OpenGL相关的设置
/*定 义 像 素 存 储 格 式 */
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小
1, // 版本号
PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图
PFD_SUPPORT_OPENGL | // 支持 OpenGL
PFD_TYPE_RGBA, // RGBA 颜色模式
24, // 24 位颜色深度
0, 0, 0, 0, 0, 0, // 忽略颜色位
0, // 没有非透明度缓存
0, // 忽略移位位
0, // 无累加缓存
0, 0, 0, 0, // 忽略累加位
32, // 32 位深度缓存
0, // 无模板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主层
0, // 保留
0, 0, 0 // 忽略层,可见性和损毁掩模
};
int pixelformat;
if ( (pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0 )
{
MessageBox("ChoosePixelFormat failed");
return FALSE;
}
if (SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE)
{
MessageBox("SetPixelFormat failed");
return FALSE;
}
return TRUE;
(6) 为CMyTestView类添加成员函数void Init() ,用于初始化,代码如下:
PIXELFORMATDESCRIPTOR pfd;
int n;
HGLRC hrc;
m_pDC = new CClientDC(this);
ASSERT(m_pDC != NULL);
if (!bSetupPixelFormat())
return;
n = ::GetPixelFormat(m_pDC->GetSafeHdc());
::DescribePixelFormat(m_pDC->GetSafeHdc(), n, sizeof(pfd), &pfd);
hrc = wglCreateContext(m_pDC->GetSafeHdc());
wglMakeCurrent(m_pDC->GetSafeHdc(), hrc);
并添加WM_CREATE消息处理函数,然后在OnCreate函数中进行调用:
// TODO: Add your specialized creation code here
Init();
(7) 为CMyTestView类添加成员函数void DrawScene(void), 用于绘图。同时在OnDraw函数中对其进行调用。
在这里为了测试,可以绘制一个球体,这里可以放置自己的绘图代码。
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
//绘制球体
glColor3f(0.25,0.36,0.85);
glutWireSphere(1.0,20,16);
glPopMatrix();
glFinish();
SwapBuffers(wglGetCurrentDC());
(8) 然后为CMyTestView类添加一个WM_SIZE消息的响应函数,用于窗口尺寸改变时的重绘代码,并设置视角,如下所示:
void CMfcView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
int w,h;
w = cx;
h = cy;
if(h == 0)
h = 1;
float ratio = 1.0* w / h;
glMatrixMode(GL_PROJECTION); //在修改前重设坐标系
glLoadIdentity();
// Set the viewport视口 to be the entire window
glViewport(0, 0, w, h);
gluPerspective(45,ratio,1,1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,5.0, 0.0,0.0,-1.0, 0.0f,1.0f,0.0f);
}
(9) 最后在中CMyTestView.h中包含OpenGL所需的头文件
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
编译、运行程序。
然后就是发挥你的想象力,在三维世界里遨游啦^_^