天天看点

OpenGL与MFC编程思想

from http://hi.baidu.com/xdwu/blog/item/a7f466dfcb385c1b4954038a.html

花了两天时间终于把MFC与OpenGL的相关技术学会了,现在可以方便的绘制三维图形了,小结一下。 一、资料的选取 网上的资料多如牛毛,但精华较少,错误百出,误人子弟。经过精心挑选选择以下几项足以。 1、 MSDN上的CUBE示例:说明OpenGL应用程序。这个最有研究价值,但就是缺少注释和理论说明,需要自己一点点咀嚼代码。       这个demo虽然比较小,但制作的比较精细,很多细节处理的较好,很多技巧非常值得学习。microsoft bull-man! 2、用Visual C++ 6实现OpenGL编程, http://www.yesky.com/185/1817185.shtml     这个例子说的比较详细,连怎样操作VC都有了,初级的理论也说了一些,适合入门。但后面说3D的好像有点错误,另外屏幕闪烁的解决方法不彻底,没有完全消除(不是openGL的问题,是MFC消息循环的问题没处理好)。 3、OpenGL轻松入门: http://soft.yesky.com/lesson/374/2410874.shtml 一本讲述基本原理的书 看过以上几个资料,再见上MSDN的手册,就可以轻松使用OpenGL绘制三维图形了! 二、使用OpenGL与MFC绘图的基本思路 1、绘图环境的建立(最好放在OnCreate(LPCREATESTRUCT lpCreateStruct)中) WINDOWS的GDI是通过设备句柄(Device Context以下简称"DC")来绘图,而OpenGL则需要绘制环境(Rendering Context,以下简称"RC")来绘图。GDI中的每一个命令需要传给它一个DC,而OpenGL是使用当前绘制环境(RC)。一旦在一个线程中指定了一个当前RC,所有在此线程中的OpenGL命令都使用相同的当前RC。这样我们要做的工作就是建立OpenGL的RC,并把RC同GDI的DC连接起来,这样OpenGL就可以开始绘图了。步骤如下: A:设置窗口像素格式。(使用PIXELFORMATDESCRIPTOR、ChoosePixelFormat()、DescribePixelFormat()、SetPixelFormat()等完成) B:产生RC。(使用wglCreateContext()完成) C:设置当前的RC,并同DC连接起来。(使用wglMakeCurrent()完成) 产生RC是非常耗费资源和时间的一件事情,因此最好系统启动时产生,关闭时释放。 释放RC的操作如下(最好放在OnDestroy()中): HGLRC hrc=wglGetCurrentContext();

if(hrc!=NULL)

{ // make the rendering context not current

   wglMakeCurrent(NULL, NULL) ;

   wglDeleteContext(hrc);

} 至此,绘图环境准备好了,可以开始绘图了! 2、三维图绘制的过程 三维图绘制好后,要在二维的屏幕上显示,因此要经过几次变换才能达到这样的结果。OpenGL多使用矩阵变换来实现。过程如下: A:进行视点变换,选择一个观察点来观察物体。 B:进行模型变换,把要观察的模型(物体)通过平移、旋转、缩放等操作放置到一个合适的观察位置 C:进行投影变换,观察点和物体都设置好后,就可以投影在一个平面上。 D:进行视口变换,对投影的结果进行裁剪,决定显示的大小、位置等。 以上变换都是以矩阵的运算实现的,OpenGL会自己完成,我们只要通过函数把每种变换的参数设置好就可以了。 每种变换都通过哪些函数完成,查阅OpenGL相关资料即可,网上很多。 3、图形的绘制及显示 我们真正要做的工作就是利用OpenGL提供的命令,来绘制各种三维图形,然后选取合适的视角来观察并显示物体即可。 OpenGL绘制图形的命令很多,也非常丰富,只有不断地积累才能绘出适用的三维图形。 4、MFC下屏幕显示的闪烁问题 我们知道,在窗口中拖动一个图形的时候,由于边画边显示,会出现闪烁的现象。在GDI中解决这个问题较为复杂,通过在内存中生成一个内存DC,绘画时让画笔在内存DC中画,画完后一次用Bitblt将内存DC“贴”到显示器上,就可解决闪烁的问题。在OpenGL中,我们是通过双缓存来解决这个问题的。一般来说,双缓存在图形工作软件中是很普遍的。双缓存是两个缓存,一个前台缓存、一个后台缓存。绘图先在后台缓存中画,画完后,交换到前台缓存,这样就不会有闪烁现象了。 A:将像素格式定义成支持双缓存的    pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_STEREO_DONTCARE; B:在物体绘制完成后加入这样一行代码SwapBuffers(hDC),到此OpenGL绘图已经没有闪烁了,但MFC还会反复的重绘背景产生闪烁 C:处理消息循环OnEraseBkgnd,使其不要重绘背景 BOOL CoglView::OnEraseBkgnd(CDC* pDC)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

return TRUE;

//return CView::OnEraseBkgnd(pDC);

} 这样就彻底解决了闪烁问题! 至此,OpenGL已经能与MFC一起很好的工作了。接下来就是使用OpenGL的一些高级特性(光照、纹理等)来增强图形的显示效果了! 路漫漫其修远矣! show一个实例看看!

OpenGL与MFC编程思想

继续阅读