我想开发一个2D行业矢量图形编辑程序,从资料上了解到OpenGL比较适合开发类似于CAD的图形软件,就准备用VS 2005 + OpenGL写。以前没有学过Computer Graphics,于是就买了《Interactive Computer Graphics》、《曲线与曲面的数学》、《CAGD曲线与曲面》慢慢啃。看了一个多星期,了解了一些Spline、Bezier、B-Spline、Non-Uniform Rational B-Spline等曲线的数学模型。
今天下午从网上下载了GLUT 3.7,把学习平台搭起来了,Visual Studio 2005 + GLUT 3.7,试着编译了几个Sample,全部通过。现在有了学习的平台了。
OpenGL是一种跨平台的图形库,开发的图形程序可运行于多种操作系统上。但这并不意味着在不同的平台上开发基于OpenGL的图形程序所编写的的代码完全一样,因为OpenGL独立于window system(如Microsoft Windows、X Window System等),要运行于这些window system之上,必须要使用少量指定的类似于“胶水”的routine将OpenGL图形库与window system“粘”在一起,例如:对于X Window System,OpenGL提供了一个X Extension--GLX将它与X Window System“粘”在一起;对于Windows,Windows API提供了一个扩展--WGL Extension(Windows + OpenGL),WGL包含了function和structure。在各种平台上的OpenGL中,除了“胶水”routine,其它的内容完全一样。
我的想法是利用MFC + OpenGL来构建程序。以前写过一些MFC的程序,可作为界面开发的工具,用OpenGL来完成图形的处理工作。
在基于MFC的程序中,要使用OpenGL在各种View中显示图形,对AppWizard生成的视图类进行如下改造:
- 修改OnPreCreate()函数
加上:
cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
OpenGL要求所有的window都具有此属性。 - 修改OnCreate()函数
在中间加上初始化OpenGL库的代码,创建OpenGL的Rendering Context并使之与window的Device Context相关联。设置PixelFormat、颜色等属性。 - 修改OnSize()函数
使Window的尺寸发生变化时,相应地调整OpenGL的viewvort、projection等。 -
在OnDraw()函数中显示图形
一般用法为:
// Clear out the color & depth buffers
::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
RenderScene();
// Tell OpenGL to flush its pipeline
::glFinish();
// Now Swap the buffers
::SwapBuffers( m_pDC->GetSafeHdc() );
显示图形的代码可放于RenderScene()中。 -
修改OnEraseBkgnd()函数
//return CView::OnEraseBkgnd(pDC);
//Tell Windows not to erase the background
return TRUE -
修改OnDestroy()函数
加上:
//Make the RC non-current
if(::wglMakeCurrent(0,0) == FALSE)
{
MessageBox("Could not make RC non-current");
}
//Delete the rendering context
if(::wglDeleteContext(m_hRC) == FALSE)
{
MessageBox(_T("Could not delete RC"));
}
//Delete the DC
if(m_pDC)
{
delete m_pDC;
}
//Set it to NULL
m_pDC = NULL;
这样,一个支持OpenGL的MFC基本框架就初步建好了。
在Visual Studio 2005上编译链接时,不用指定相关的LIB,但用VS 98时必须指定相关的LIB。