OpenGL for Windows NT及其程序设计_第1页
OpenGL for Windows NT及其程序设计_第2页
OpenGL for Windows NT及其程序设计_第3页
OpenGL for Windows NT及其程序设计_第4页
OpenGL for Windows NT及其程序设计_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 OpenGL for Windows NT及其程序设计 OpenGL是在SGI、Microsoft、DEC、IBM和Intel等多家世界著名计算机公司的倡导下,基于SGI的GL标准,制定的一个通用共享的开放式三维图形标准。 前几年,OpenGL虽然是开放式的标准,但是只能在具有UNIX操作系统的各种昂贵的工作站之间通用;尽管工作站上的OpenGL性能优越、编程方便、生成图形精美逼真,但是只有少数人能体会其中乐趣,而令大多数PC机用户望尘莫及。随着计算机技术的发展,工作站与PC机的性能日趋接近。Microsoft公司首先将OpenGL图形库链接到Windows NT中,目前又将OpenGL动态

2、库挂到最新Windows 95上,这样,广大PC机用户就可充分享受OpenGL的乐趣了。更令人高兴的是,目前国内外出现了专门对OpenGL进行硬件加速的三维图形加速卡。这样,普通用户只要拥有一台Pentium 90以上、16MB RAM、520MB以上硬盘容量的PC机以及一台43cm以上的大屏幕监视器和一块OpenGL三维图形加速卡组成的系统,就能与图形工作站相媲美,但价格却便宜数十倍。本文作者一直从事计算机图形应用开发工作。原来是在SGI工作站上利用OpenGL开发图形程序,后来又首先在国内第一块三维图形加速卡AGC-3D上基于Windows NT的Visual C+环境下继续进行开发。在开

3、发过程中,同一OpenGL程序几乎不用修改就能在两个平台间来回移植,效果甚好。一、OpenGL特点及功能OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,能十分方便地在各平台间移植。OpenGL具有七大功能。建模 OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体以及复杂曲线和曲面绘制函数。变换 OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比和镜像四种变换,投影变换有平行投影和透视投影两种变换。颜色模式设置 OpenGL颜色模式有两种,即RGBA模式和颜色索引。光照和材质设置 OpenGL光有辐射光、环境光、漫反射光

4、和镜面光。材质是用光反射率来表示。场景中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。纹理映射 利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。位图显示和图像增强 图像功能除了基本的拷贝和像素读写外,还提供了融合、反走样和雾的特殊图像效果处理。双缓存动画 双缓存即前台缓存和后台缓存,简而言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。此外,利用OpenGL还能实现深度暗示、运动模糊等特殊效果。二、OpenGL for Windows NT图形库OpenGL图形库一共有100多个函数。其中核心函数有115个,它们是最基本的函数,

5、其前缀是gl;OpenGL实用库的函数功能更高一些,如绘制复杂的曲线曲面、高级坐标变换、多边形分割等,共有43个,前缀为glu; OpenGL辅助库的函数是一些特殊的函数,包括简单的窗口管理、输入事件处理、某些复杂三维物体绘制等函数,共有31个,前缀为aux。此外,还有六个WGL函数非常重要,专用于OpenGL和Windows NT窗口系统的连接,其前缀为wgl,主要用于创建和选择图形操作描述表以及在窗口内任一位置显示字符位图。这些功能是Windows NT对OpenGL的唯一补充,见表1所示。表1 管理图形操作描述表的WGL函数另外,还有五个Win32函数用来处理像素格式和双缓存。由于它们是

6、对Win32系统的扩展,因此不能应用在其他OpenGL平台上,见表2所示。表2 管理像素格式Win32函数三、OpenGL for Windows NT程序设计OpenGL for Windows NT的程序设计与OpenGL for UNIX的程序设计有一点小区别,关键就在于如何将OpenGL与不同操作系统下的窗口系统连接起来。如果调用OpenGL辅助库窗口管理函数,则不用考虑这些问题。下面将主要介绍在Windows NT下OpenGL的程序设计关键。1.图形操作描述表在Windows NT下窗口程序必须首先处理设备描述表,DC包含许多如何在窗口上显示图形的信息,即指定画笔和刷子的颜色,设置

7、绘图模式、调色板、映射模式以及其他图形属性。同样,OpenGL for Windows NT的程序也必须使用DC,这与其他Windows程序类似。但是,OpenGL for Windows NT必须处理特殊的DC图形操作描述表,这是DC中专为OpenGL使用的一种。一个OpenGL应用图形操作描述表内有OpenGL与Windows NT窗口系统相关的各种信息。一个OpenGL应用首先必须创建一个图形操作描述表,然后再启动它,最后在所定义的窗口内按常规方式调用OpenGL函数绘制图形。一个图形操作描述表不同于其他DC,它们调用每个GDI函数都需要一个句柄,而图形操作描述表方式下只需一个句柄就可任

8、意调用OpenGL函数。也就是说,只要当前启用了某个图形操作描述表,那么在未删除图形操作描述表之前可以调用任何OpenGL函数,进行各种操作。2.像素格式在创建一个图形操作描述表之前,首先必须设置像素格式。像素格式含有设备绘图界面的属性,这些属性包括绘图界面是用RGBA模式还是颜色表模式,像系缓存是用单缓存还是双缓存,以及颜色位数、深度缓存和模板缓存所用的位数,还有其他一些属性信息。像素格式结构每个OpenGL显示设备都支持一种指定的像素格式号。一般用一个名为PIXELFORMATDESCRIPTOR的结构来表示某个特殊的像素格式,这个结构包含26个属性信息。Win32定义的PIXELFORM

9、ATDESCRIPTOR如下所示:typedef struct tagPIXELFORMATDESCRIPTORWORD nSize;WORD nVersion;DWORD dwFla gs; BYTE iPixelType;BYTE cColorBits;BYTE cRedBits;BYTE cRedShift;BYTE cGreenBits;BYTE cGreenShift;BYTE cBlueBits;BYTE cBlueShift;BYTE cAlphaBits;BYTE cAlphaShift;BYTE cAccumBits;BYTE cAccumRedBits;BYTE cAccu

10、mGreenBits;BYTE cAccumBlueBits;BYTE cAccumAlphaBits;BYTE cDepthBits;BYTE cStencilBits;BYTE cAuxBuffers;BYTE ilayerType;BYTE bReserved;DWORD dwLayerMask;DWORD dwVisibleMask;DWORD dwDamageMask;PIXELFORMATDESCRIPTOR,*PPIXELFORMATDESCRIPTOR,FAR *LPPIXELFORMATDESCRIPTOR;初始化PIXELFORMATDESCRIPTOR结构PIXELFOR

11、MATDESCRIPTOR中每个变量值的具体含义和设置可以参考有关资料,下面举出一个PIXELFORMATDESCRIPTOR初始化例子来简要说明相关变量的意义。定义PIXELFORMATDESCRIPTOR结构的pfd如下:PIXELFORMATDESCRIPTOR pfd=sizeof,/结构尺寸l, /结构版本PFD-DRAW-TO-WINDOWS|PFD-SUPPORT-OPENGL,/特性标志PFD-TYPE-RGBA,/RGBA模式24,/24位颜色0,0,0,0,0,0,/不涉及这些属性0,0,0,0,0,0,0,/没有alpha缓存和累积缓存32,/32位深度缓存0,0,/没有

12、模板缓存和辅助缓存PFD-MAIN-PLANE,/主层类型0,/保留结构数0,0,0,/不支持结构数;在这个结构里,前两个变量的含义十分明显。第三个变量dwFlags的值是PFD-DRAW-TO-WINDOWS|PFD-SUPPORT-OPENGL,表明应用程序使用OpenGL函数来绘制窗口,第四个表明当前采用RGBA颜色模式,第五个采用24位真彩色,即千万种颜色,如果是256色系统则自动实现颜色抖动;因为没有使用alpha缓存和累积缓存,所以从变量cAlphaBits到cAccumAlphaBits都设置为0;深度缓存设置为32位,这个缓存能解决三维场景的消隐问题;变量cAuxBuffers

13、设置为0,在Windows NT下不支持辅助缓存;Windows NT下针对OpenGL变量ilayerType只能设置为PFD-MAIN-PLANE,但其他平台也许支持PFD-OVERLAY-PLANE或PFD-UNDERLAY-PLANE;接下来bReserved变量只能设为0,而最后三个变量Windows NT都不支持,故全设置成0。设置像素格式当初始化PIXELFORMATDESCRIPTOR结构后,就要设置像素格式。下面几段从VC+ 的MFC程序中摘出的代码就是设置像素格式的方式。代码如下:CClientDC clientDC;int pixelFormat=ChoosePixelF

14、ormat;BOOL result=SetPixelFormat;第一行语句说明得到一个应用窗口客户区的设置描述表。第二行调用ChoosePixelFormat选择一个像素格式,并将像素格式索引号返回给pixelFormat变量;函数中第一个参数是选择像素格式的设置描述表的句柄,第二个参数是PIXELFORMATDESCRIPTOR结构的地址。如果调用失败则返回0;否则返回像素格式索引号。第三行调用SetPixelFormat设置像素格式,三个参数分别是设备描述表的句柄、像素格式索引号和PIXELFORMATDESCRIPTOR结构的地址。如果调用成功则返回TURE;否则返回FALSE。3.创

15、建图形操作描述表正如前所述,必须创建图形操作描述表并启用它后,才能调用OpenGL函数在窗口内进行各种图形操作。一般说来,利用MFC中增补的管理图形操作描述表方法来编程比较方便。下面举一例:int CopenglView: OnCreate(LPCREATESTRUCT lpCreateStruct)if=-1)return -1;/ TODO: Add your specialized creation code herePIXELFORMATDESCRIPTOR pfd=sizeof,/structure sizel,/structure version numberPFD-DRAW-TO

16、-WINDOWS|PFD-SUPPORT-OPENGL,/property flagsPFD-TYPE-RGBA, /RGBA mode24, /24bit color0,0,0,0,0,0, /not concerned with these0,0,0,0,0,0,0, /no alpha or accum buffer32, / 32bit depth buffer0,0, /no stencil or aux bufferPFD-MAIN-PLANE, /main layer type0, /reserved0,0,0 /unsupported;CClientDC clientDC;in

17、t pixelFormat=ChoosePixelFormat;BOOL result=SetPixelFormat;m-hRC=wglCreateContext;return 0;void COpenglView:onDrawCOpenglDoc* pDoc=GetDocument;ASSERT-VAILD;/TODO: add draw code for native data herewglMakeCurrent;DrawMyOpenGL;wglMakeCurrent;void COpenglView:OnDestroyCView:OnDestroy;/ TODO: Add your m

18、essage handler code herewglDeleteContext;在程序中,响应WM-CREATE消息的函数OnCreate仅仅只创建一个临时的DC,当函数返回时,它自动删除。因此,在这里不可能启用图形操作描述表。当应用程序的窗口内容得到更新后,MFC就调用OnDraw函数,在此启用图形操作描述表wglMakeCurrent有效。然后,再调用自己用OpenGL写的绘图函数DrawMyOpenGL,则程序就可进行任意的OpenGL图形操作了。当绘图结束后,再调用一次wglMakeCurrent,但第二个参数设为NULL,意思是启用图形操作描述表无效,关闭图形操作描述表。最后,当应用程序结束时,MFC就

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论