<b>Win 95/NT下OpenGL编程原理</b>[VC/C++编程]
本文“<b>Win 95/NT下OpenGL编程原理</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
----科学计算可视化,计算机动画和虚拟实际是目前计算机图形学的三个热门.而这三个热门的核心都是三维真实感图形的绘制.由于OpenGL(OpenGraphicsLibrary)具有跨平台性、简便、高效、功效完善,目前已经成为了三维图形制作办法中事实上的产业尺度.自从WindowsNT3.51在微机平台上支持OpenGL今后,目前微软公司在Windows95OSR2、WindowsNT4.0中持续性的供应OpenGL开辟环境.VisualC++从4.2版本今后已经完好支持OpenGL API,使三维世界的"平民化"已成为必定.
----Windows操作系统对OpenGL的支持
----具有Windows编程经验的人都知道,在Windows下用GDI作图必须通过设备上下文(DeviceContext简写DC)调用呼应的函数;用OpenGL作图也是近似,OpenGL函数是通过"渲染上下文"(RenderingContext简写RC)完成三维图形的绘制.Windows下的窗口和设备上下文支持"位图格局"(PIXELFORMAT)属性,和RC有着位图构造上的一致.只要在成立RC时与一个DC成立接洽(RC也只能通过已经成立了位图格局的DC来成立),OpenGL的函数便可以通过RC对应的DC画到呼应的显示设备上.这里还有以下需求注意的方面:
----1.一个线程只能拥有一个渲染上下文(RC),也就是说,用户假如在一个线程内对差别设备作图,只能通过改换与RC对应的DC来完成,而RC在线程中保持不变.(当然,删除旧的RC后再成立新的是可以的)与此对应,一个RC也只能属于一个线程,不能被差别线程同时同享.
----2.设定DC位图格局等于设定了呼应的窗口的位图格局,并且DC和窗口的位图格局一旦肯定就不能再改变.这一点只能盼望今后的Windows版本改良了.
----3.一个RC固然可以改换DC,在任什么时刻刻只能操纵一个DC(这个DC称为RC的当前DC),但由于一个窗口可以让多个DC作图从而可以让多个线程操纵多个RC在该窗口上履行OpenGL操作.
----4.目前的Windows下的OpenGL版本对OpenGL和GDI在同一个DC上作图有一定的限制.当利用双缓存用OpenGL产活泼画时,不能利用GDI函数向该DC作图.
----5.不倡议用ANSIC在Windows下编写OpenGL程序.这样的程序固然具有跨平台的可移植性(比方很多SGI的例子程序),但是它们不能操纵Windows操作系统的很多特点,实用代价不大.
----用VC来编写OpenGL程序
----经过上面的解析,用VC来调用OpenGL作图的办法就很明显了.步骤以下:
----1.先设置显示设备DC的位图格局(PIXELFORMAT)属性.这通过填充一个PIXELFORMATDESCRIPTOR的构造来完成(关于PIXELFORMATDESCRIPTOR中各项数据的意义,请参照VC的帮忙信息),该构造决意了OpenGL作图的物理设备的属性,比方该构造中的数据项dwFlags中PFD_DOUBLEBUFFER位假如没有设置(置1),通过该设备的DC上作图的OpenGL号令就不大概利用双缓冲来做动画.有一些位图格局(PIXELFORMAT)是DC支持的,而有一些DC就不支持了.所以程序必须先用ChoosePixelFormat来挑选DC所支持的与指定位图格局最接近的位图格局,然后用SetPixelFormat设置DC的位图格局.
----2.操纵方才的设备DC成立渲染上下文RC(wglCreateContext),使得RC与DC成立接洽(wglMakeCurrent).
----3.调用OpenGL函数作图.由于线程与RC一一对应,OpenGL函数的参数中都不指明本线程RC的句柄(handle)
----4.作图完毕今后,先通过置当前线程的RC为NULL(::wglMakeCurrent(NULL,NULL);),断开当前线程和该渲染上下文的接洽,由此断开与DC的接洽.此时RC句柄的有效性在微软自己的文档中也没有讲清楚,所以在背面删除RC的时刻要先判断以下RC句柄的有效性(if(m_hrc)::wglDeleteContext(m_hrc);).再按照情形释放(ReleaseDC)大概删除(DeleteDC)DC
----所附程序阐明
----所附的程序用MFC完成了一个简单的OpenGL作图,用OpenGL的帮助库画了一个有光照的实心圆球.OpenGL本身的函数这里就不注释了,仅对用MFC编OpenGL时需求注意的内容做一个扼要的阐明:
----1.一旦设定了一个DC的位图格局,该DC所接洽的窗口的位图格局随之设定.该窗口若含有子窗口大概有兄弟窗口,这些兄弟/子窗口的位图格局没有设成与对应RC一致的格局,OpenGL在它们上面作图就简单出错.故而OpenGL作图的窗口必须具有WS_CLIPCHILDREN和WS_CLIPSIBLINGS气势,程序中在主框窗的构造函数顶用LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,NULL,NULL);指定了主窗口的气势.
----2.在ANSIC的OpenGL编程中,由auxReshapeFunc定义设置OpenGL视口大小和作图尺寸的回调函数.在MFC中应当由WM_SIZ消息的处理函数来完成.在ANSIC的OpenGL编程中,由EauxMainLoop定义作图的回调函数.在MFC中应当由WM_PAINT消息的处理函数来处理.呼应的,由OpenGL定义的键盘、鼠标处理函数都应当由呼应的Windows处理函数来呼应.
----3.OpenGL自己有革新后台的函数glClear,故而应禁止Windows革新窗口后台.不然,当窗口需求重画时,Windows会自动先发送WM_ERASEBKGND,而缺省的处理函数利用白色的后台刷.当OpenGL利用的后台颜色不是白色时,作图时有一帧白色的闪耀.这种现象在做动画时分外明显.程序中只需求在WM_ERASEBKGND的消息处理函数中禁止父窗口类的消息处理,简单的返回一个TRUE便可.
----4.由于OpenGL的跨平台性,它必须用操作系统的调色板.所以假如GL_INDEX_MODE作图时,必须用VC自己定义调色板.不过普通情形下,用GL_RGBA_MODE情势对比便利,很罕用到GL_INDEX_MODE情势.
----5.在OpenGL作图期间,RC对应的DC不能删除大概释放.
----6.由于OpenGL作图时需求长时间占用DC,所以最好把作图窗口类设成CS_OWNDC.MFC缺省的窗口类气势中没有设这一属性,程序中在主窗口C++类的PreCreateWindow办法中自己注册了一个窗口类,除了设定了CS_OWNDC属性以外,还设定了CS_HREDRAW、CS_VREDRAW和CS_SAVEBITS.设定CS_HREDRAW、CS_VREDRAW是为了让窗口缩放时产生WM_PAINT消息,改正OpenGL视口和作图尺寸;由于OpenGL作图需求很多计算,设定CS_SAVEBITS是为了在OpenGL窗口被遮盖后显现出来时,不产生WM_PAINT消息,用内存存储的图象来填充,从而用空间损耗换取计算时间.
----7.本程序中没有对OpenGL函数的出错情形作出处理.OpenGL出错后返回错误码,不会抛出非常;并且在某一个函数出错今后,后继函数也普通不会呈现非常,只是返回错误码,一不当心便大概忽视某些错误.而对每一个OpenGL函数都做出错与否的判断对比麻烦,所以编程序时对OpenGL的函数该当非常当心.
以上是“<b>Win 95/NT下OpenGL编程原理</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |