1. 首页
  2. 编程语言
  3. C++ 
  4. Visual C++ 6.0高级编程技术 OpenGL篇

Visual C++ 6.0高级编程技术 OpenGL篇

上传者: 2020-07-30 17:39:01上传 PDF文件 24.88MB 热度 20次
Visual C++ 6.0高级编程技术-OpenGL篇第1章 OpenGL编程基础3这一点, OpengL是网络透明的。服务器可维护许多 OpenGL正文,每个都是封装的 OpenGL状态。客户可联到这些正文中的任何个。这要求网络协议可以通过扩展现有协议或使用个独立协议来实现。分配帧缓冲资源的窗口系统最终控制 OpengL命令在帧缓冲上的作用效果。窗口系统决定任何给定时刻 OpenGL可以访问帧缓冲的哪些部分,并通知 OpenGL这些部分是怎样组织的。因此,配置帧缓冲或初始化 OpenGL的工作不是由 OpenGL命令来完成,而是由窗口系统来完成。帧缓冲的初始化是结合窗口系统在 OpenGL外完成的;窗口系统为 OpenGL绘制分配窗口时实现 OpengL初始化。三、图元与命令OpenGL能够绘制的图元包括点、线段和多边形, OpenGL可以在这儿种图元模式之间选择。你可以独立地控制图元模式,即设定一种模式不影响其它模式。模式的选择、图元的定义以及其它 OpengL操作都是通过调用相应函数来实现的图元被定义为一组顶点。顶点是构成线和多边形基本元素的。与顶点相关联的数据包括其坐标、颜色、法向量、纹理坐标和边标识等,在通常情况下Open(L以相同的方法独立地、顺序地处理每个顶点及其关联数据。唯一例外的情况是:如果一组顶点必须被裁剪,那么这个图元将被调整到与指定的区域匹配。在这种情况下,顶点数据将被修改并产生一些新的顶点。这类裁剪基于顶点组所描述的图元。OpenGL命令总是按接收到的顺序进行处理。也就是说先定义的图元画完后才会执行随后的命令状态查询命令返回在调用它之前所有发给 OpengL的命令完全执行后的相应数据。四、绘制方式OpenGL的绘制过程多种多样,内容十分丰富,主要提供了以下对三维物体的绘制方式:线框绘制方式( wire frame);这种方式仅绘制三维物体的网格轮廓线深度优先线框绘制方式( depth cued):用线框方式绘图,但使远处的物体比近处物体暗一些,以模拟人眼看物体的效果反走样线框绘制方式( antialiased):用线框方式绘图,绘制时来用反走样技术以减少图形线条的参差不齐。平面明暗处理方式( flat shading):对模型的平面单元按光照度进行着色,但不进行光滑处理。光滑明暗处理方式( smooth shading):对模型按光照绘制的过程中进行光滑处理,这种方式更接近于现实加阴影和纹理的方式( shadow, texture:在模型表面贴上纹理甚至加上光照阴影效果,使得三维场景像照片一样逼真。σ运动模糊绘制方式( motion blured):模拟物体运动时人眼观察时所感觉到的动感模糊现象。大气环境效果( atmosphere effects):在三维场景中加入雾等大气环境效果,使人身临其境。深度域效果( depth of effects):类似于照相机镜头效果,模型在聚焦点处清晰,反之则模糊。4 /isual C++6.0高级编程技术— OpenGL篇11.3 OpenGL的命令语法与状态OpenGL包含100多个库函数,这些函数都按一定的格式来命名。在 OpenGL中有115个核心函数,这些函数是最基本的,它们可以在任何 OpenGL的工作平台上应用。这些函数用于建立各种各样的形体,产生光照效果,进行反走样与纹理映射和进行投影变换等。由于这些核心函数有多种形式并能够接受不同类型的参数,实际上这些函数可以派生出300多个函数。这些基本函数的命名规则为,以“g1”为前缀,组成命令名的每个字的开头用大写字母,例如: gIclearColoro在 Windows nt下, OpengL除了具有基本的 OpenGL函数外,还支持其它四类函数:OpenGL实用库:43个函数,每个函数以“glu”为前缀;OpenGL辅助库:31个函数,每个函数以“aux”为前缀r windows专用库函数:6个函数,每个函数以“wg”为前缀;Win32API函数:5个函数,凶数前没有专门的前缀。OpenGL定义的符号常数以“GL”开头,全部用大写字母,各个字之间用下划线分隔。例如: GL COLOR BUFFER BIT。OpenGL定义的数据类型以GL开头,表1-1列出了各种数据类型:表1-1○ penGL定义的数据类型字符数据类型相应与C的数据类型OpenGL中定义b8位整数signed charGLbytes16位整数shortAShort32位整数intGLint, GLsizei32位浮点数floatGLfloat, Glclampfd64位浮点数doubleGLdouble, glclampdub8位无符号整数unsigned charGLubyte GLbooieanUS16位无符号整数unsigned shortGLushort32位无符号整数unsigned intGLuint, GLenum, GLbitfieldvoidGLvoid例如,对于 OpenGL函数void glVertex(sifdVJTYPE X, TYPE y);其中,TYPE为sfd数据类型中的一个;n说明命令参数的个数,这里可以为2或3;指定命令为向量形式。例如,利用32位浮点数据类型命令的非向量和向量形式分别为void gIVertex2fGLfloat x, GLfloat y);void glVertex2fv(GLfloat v[2D)第1章 OpenG.编程基础512 Windows下的 OpengL编程随着奔腾芯片的出现,微机的性能有了很大的进步,其处理能力已达到过去工作站的水平而价格则低得多 Microsof和SGI等公司,不失时机地将 OpengL在 Windows95、 WindowsNT平台上予以实现。 Microsoft在 Visual C++20以上版本中内置了 OpenGL,这更为 OpenGL在徽机上的应用创造了有利条件使广大微机用户能够享受 OpenGL所带来的强大图形功能。在微机上进行 OpenGL编程,其硬件环境可以按如下配置:⑦CPU: Pentium或 PentiumⅡ,时钟频率应在00MHz以上内存:16MB以上,推荐使用64MB;硬盘:500MB以上;显示卡:带加速功能的3D显示卡显示器:最好是高分辨率大屏幕显示器,最好能选用17英寸以上的显示器。软件环境则应为:操作系统: Windows Nt3.5以上或者 Windows95加入 OpenGL动态链接库;编程语言:Ⅴ isual o++2.0以上版本,本书采用 Visual c++60作为编程开发平台。1.2.1 OpenGL编程的基本框架对于简单的控制台程序,只需按以下步骤即可进行 OpenGL编程:创建一个新工程;设置包含文件和库文件路径加入 OpenGL库。对于 MFC App Wizard应用程序,进行 OpenGL编程的步骤为编写创建函数编写销毁函数,清除位图、定时器等资源及设备场境;修改 CView类的样式;编写 OnDraw事件处理程序;在 OnSize方法中定义当前视区、投影模型和物体模型以及光源等编写 OnTimer事件处理程序;编写 OpengL绘制程序。下面我们将分别讨论如何创建 OpenGL的控制台应用程序和MFC类库应用程序22 OpenGL编程的基本步骤我们知道,在 Windows下用GDI绘图必须通过设备场境调用相应的函数。用 Opengl绘图也一样, OpenGL函数通过“绘制场境”( Rendering context,RC)完成三维图形的绘制Windows下的窗口和设备场境支持位图格式属性,该属性与RC存在位图结构上的一致。只要在创建RC时将它与一个DC相关联(RC只能由已经建立了位图格式的DC来创建),OpenGL的函数就可以通过RC对应的DC绘制到相应的显示设备上了其中,还有以下几方面需要注意6ⅵ isual c++6.0高级编程技术— OpengL篇个线程只能拥有一个RC。用户如果在一个线程内对不同设备绘图,只能通过更换与RC对应的DC来完成,而RC在线程中保持不变(当然,释放旧的RC再创建新的RC也是可以的)。与此对应,一个RC也只能属于一个线程,不能被不同线程所共享。DC位图格式与窗口的位图格式是一一对应的。设定DC位图格式等于设定了相应窗口的位图格式,并且DC和窗口的位图格式一旦确定就不能改变。这一点只能期望在以后的 Windows版本中有所改进任何时刻只能利用一个DC。虽然一个RC可以更换DC,在任何时刻只能利用一个DC(该DC称为RC的当前DC),但由于一个窗口可以让多个DC绘图,从而可以让多个线程利用多个RC在该窗口上执行 OpenGL操作。对GD函数使用的一些限制。目前 Windows下的 OpenGL版本对 OpenGL和GDI在同一个DC上绘图有一定的限制。当使用双缓冲用 OpengL产生动画时,不能使用GD函数向该DC作图。Φ尽量不要使用 ANSI C编写 OpengL程序。我们不推荐读者使用 ANSI O在 Windows下编写 OpengL程序。这样的程序虽然具有跨平台的可移植性(比如很多SG的实例程序),但是它们不能利用 Window操作系统的很多特性,实用价值不大。事实上,使用 isual C++60调用 Open gL函数进行绘图的方法是很简单的,相应步骤如下:设置显示设备DC的位图格式属性:通过填写一个 PIXELFORMATDESCRIPTOR的结构来完成,该结构决定了 OpenGL绘图的物理设备属性,比如该结构的成员域dwFlags中的 PFD DOUBLEBUFFER位如果没有设置为1,则通过该设备DC绘图的 OpenGL函数就不可能使用双缓冲进行动画操作。DC有可能只支持部分位图格式,因此程序必须首先使用函数 ChoosePixelFormat选择与DC所支持的指定位图格式最接近的位图格式,然后使用函数 SetPixelFormat设置DC的位图格式。创建绘制场境RC与DC的联系。利用DC创建绘制场境RC( wglCreate Context)以便在RC与DC之间创建关联,此时需要使用函数 wglMake Current调用 OpenGL函数进行绘图。由于线程与RC一一对应, OpenGL函数的参数中都不指明本线程RC的句柄( handle。释放相关内存。绘图完毕后,需要调用函数 wgIMake Current设置当前线程的RC为NULL,从而断开当前线程和该绘制场境的关联,并由此断开与DC的关联。此时RC句柄的有效性不明确,所以在后面删除RC时,要先判断一下RC句柄的有效性再调用函数 wglDelete Context,然后根据情况调用函数 ReleaseD或函数 DeleteD释放或删除DC。1.3 OpenGL环境设置的 penGL实质上是一个用于产生三维图形的软件接口,它共有约115个图形函数。利用眄数,能够产生明暗、纹理映射、反走样、光照、运动模糊、雾化、融合等图形效果在 windows98∧NT平台下,GDI是原始窗口的图形接口,能够把数据绘制到屏幕、内仔、打第1章 OpengL编程基础印机等。GDI实现这些是通过一个设备上下文( Device content简称DC)来实现的。它的调用均传送给DC,由DC来实现具体操作。就像GD需要建立设备上下文以绘制图形一样,OpengL需要建立绘图上卜文( Rendering content简称RC)米绘制图形。与每个GD调用均需要为其指定一个DC不同, OpenGL引入了当前RC的概念,所有的操作都是针对当前RC的。尽管在一个线程中可有多个RC,但是在任意时刻该线程中仅允许有一个当前RC。RC不能直接完成绘图,必须与特定的DC相联系,在绘图时 OpenGL将绘图参数传递给RC,RC在将其经过一定的变换后传递给它所关联的DC,完成具体的绘图工作。13.1 OpenGL在 Windows9∧T平台下工作的基本原理在 Window95NT平台上运行 OpengL主要有三种方式● OpenG专业硬件加速方式一些高档显示芯片如3Dabs公司的 GLINT等,专门针对 OpenGL进行了优化,OpenGL的大部分功能均可由硬件实现,仅有少量由操作系统来完成。这样极大地提高了图形显示的性能,并且能够获得工作站级的图形效果,但是这样的图形硬件价格十分昂贵,非一般用户所能负担。这种方式的 OpenGL运行方式多用于对图形绘制质量和速度要求非常高的场合。●三维图形加速模式这种运行方式使用一些中低档的图形芯片,它往往具备一定的三维加速功能,由硬件来完成一些较为复杂的图形操作,如纹理映射等,另外一些重要的 OpenGL操作,例如Z缓冲等就能够直接由显示卡硬件来完成;对于显示卡所不支持的图形功能,则通过软件模拟的方式在操作系统中进行模拟。许多号称支持 OpengL的中低档显示卡实际上都是釆用这种模式来对 OpenGL进行支持。采用这种方法,显示速度尽管无法与前一种方法相比,但与采用纯软件模式相比速度要快得多●纯软件模式对于不具备三维加速功能的显示卡,要想运行 OpenGL只能釆用纯软件模式。由于所有复杂的 OpengL图形功能均通过主机来进行模拟,速度将会受到很大的影响。但正是由于有了软件模式,使得更多的用户能够领略 OpengL的强大功能,并能在硬件性能较差的机器上对 OpenGL进行开发。1.32微机上的 OpenGL开发环境基于 OpenGL标准开发的应用程序必须运行于32位 Windows平台下,如 Windows nt或 Windows98环境( Windows95环境下需用户自己增加两个动态链接库才可正常使用)Windows nt/98环境下运行时所需的动态链接库 OpenGL32DLL、Glu32DL是系统安装时就已经自行安装好的,其目录为 Windows目录的 SYSTEM32子目录下。安装了 Windows NT/以及编程软件VC之后,用户就具备了基于 OpengL开发三维图形软件的基本条件。1. OpenGL在 Windows nt下的运行机制) enGL工作在客户机/服务器模式下,当客户方(即基于 OpenGL标准开发的应用程向服务器( OpenGL核心机制)发出命令时,由服务器负责解释这些命令。通常情况下,8ⅵ sual C++60高级编程技术— OpengL篇客户方和服务器是运行在同一台微机上的由于 OpengL的运行机制是客户机/服务器模式,这使得用户能够十分方便地在网络环境下使用 OpenGL, OpenGL在 Windows nt上的这种实现方式通常称为网络透明性。OpengL的图形库函数封装在动态链接库 OpenGL32DLL中,客户机中的所有 OpenGL函数调用,都被传送到服务器上,由 Win Srv DLL实现功能,再将经过处理的指令发送到Wn32设备驱动接口(DD),从而实现在计算机屏幕上产生图像若使用 OpenGL图形加速卡,则上述机制中将添加两个驱动器: OpenGL可加载客户模块将安装在客户端;硬件指定DDI将安装在服务器端,与WnDD同一级别。2. OpenGL的库函数开发基于 OpengL的应用程序,必须先了解 OpengL的库函数。 OpenGL函数命令方式十分有规律,每个库函数均有前缀g、glu、aux,分别表示该函数属于 OpenGL基本庳、实用库或辅助库。 Windows nt下的 OpenGL包含了100多个核心函数,均以g作为前缀,同时还支持另外四类函数OpengL实用库函数:43个,以gu作为前缀OpengL辅助库函数:31个,以auX作为前缀Windows专用库函数WGL:6个,以wgl作为前缀;win32API函数(WGL):5个,无前缀。OpenGL的115个核心函数提供了最基本的功能,可以实现三维建模、建立光照模型反走样、纹理映射等; OpenGL实用库函数在核心函数的上一层,这类函数提供了简单的调用方法,其实质是调用核心函数,目的是减轻开发者的编程工作量; OpenGL辅助库函数是些特殊的函数,可以供初学者熟悉 OpenGL的编程机制,然而使用辅助库函数的应用程序只能在Wn32环境中使用,可移植性较差,所以开发者应尽量避免使用辅助库函数; Windows专用库函数(WGL)主要针对 Windows nt/98环境的 OpenGL函数调用;Wn32AP函数用于处理像素存储格式、双缓冲等函数调用。14在命令行模式下进行 OpengL编程在这种方式下进行 OpenGL编程最为简单,这也是从工作站上将 OpenGL程序移植到微机上的最简单办法,在这种模式下我们基本上不必关心与 Windows相关的编程技术,依然和DOS下编程一样,主要使用结构化的编程方法。14.1创建 OpenGL控制台应用程序对于简单的控制台应用程序,进行 Open GL编程的步骤如下σ创建一个新工程。从“Fie”菜单中选择“New”选项,在弹出的的对话框中选择“ Project”选项卡。单击“Win32 Console application”选项,输入应用程序目录和名称设置包含文件和库文件路径。从“Tol”菜单中选择“ Options”选项,在弹出的如图1-1所示的对话框中选择“ Directories"选项卡,设置包含文件及库文件所在目录第1章 Oneill编程基础9在缺省情况下,两者的目录已正确设置,即vC目录的 inelude子目录和ib子目录Eatr| Tabs Debug|o甲 patbuty Bud Directors I soiree Contr曰EntERs re rirernre nrF eude fiesINYogaim Hiball iiTisnlt MwaLE SbiluHM-MERINDLAIDIFam用 WIrrosoH HE SH HWnHFEINCLUDEFACecrau Flsvicrosott Msu show sTLUNCiuIE品中qm西 H-br lowelnclude芯 rugao nH看c包e智 rubrum HIns的badh智mnueWIN NTiETufR点 Straton制图1-1设置包含文忏及库文件对话粗加入 OpenGL库,从“ Project”菜单中选择“ Settings”选项,在弹出的对话框中选择“Link”选项卡,在“ Object Library Module”编辑框中加入“peng132 ib glu32Ibglaux ib”(在 Windows998下相应的库文件为‘ opengL.lib glu lib glaux. lib)節可,如图1-2所示。山rhr图L幽会图12加入 OpEnGL完成了上述三个步骤之后,便进入具体的编程阶段了。1.4.2 OpenGL辅助库OpenGL提供了许多图形函数,但是没有窗口函数以及读取键盘和鼠标事件的函数。因此对于一名 OpenGL初学者来说,要想编写一个完整的 OpenGL程序并不是一件简单轻松的事情。 OpenGL的辅助库可以帮助我们渡过这一难关。10suC++6.0高级编程技术 Open GL篇在很多情况下,我们都希望能够利用简单的函数生成一些通用的几何模型(如球、锥体和圆柱体等),以便将主要注意力集中在各种 OpenGL的处理上。然而 OpenGL只提供了几种基本几何图元—点、线和多边形等的绘制。这些图元远远不能满足我们的需要,此时我们就需要使用辅助库。OpenGL辅助库提供了一些基本的窗口管理和基本三维图形绘制函数,这些函数可以帮助我们方使地创建完整的 OpenGL应用程序。但是,读者要注意的是,对于复杂的应用程序而言,辅助库也是远远不能满足要求的。它的最主要目的是帮助初学者尽快地掌握 OpenGL的精髓。OpenGL辅助库大致可分为六类:窗口初始化函数窗口处理和事件处理函数。定义场景绘制循环函数。三维物体绘制函数。颜色索引表装入函数空闲事件处理函数。143 OpenGL辅助库函数下面我们分类讨论辅助库中的函数。窗口初始化函数此类函数共有三个西、: void auxlnit window( GLbytetitlestring)含义:表示打开一个由 auxInitDisplayMode和 auxlnitPosition指定的窗口。函数的参数是窗口的标题,窗口背景的缺省颜色在RGBA模式下是黑色,在颜色索引模式是0号调色板的颜色。按下Esc键可以关闭程序及窗口。西数: void auxInitDisplay mode( Glbitfield mask);含义:设置窗口显示模式。窗口的基本模式有RGBA或颜色索引模式,单缓冲或双缓冲模式。也可以用来指定一些附加模式,例如深度缓冲、模板缓冲或累积缓冲。参数mask是一组位标志的或,有效的参数取值有: AUX RGBA, AUX INDEX,AUX SINGLE或 AUX DOUBLE以及 AUX DEPTHI、 AUX STENO正或AUX ACCUM.CESS: void auxInitPosition (GLint x, GLint y, GLsizei width, GLsizei height);含义:该函数用于设置窗口的大小及位置。参数x,y为窗口的左上角屏幕坐标,参数width和 height分别决定窗口的初始宽度和高度,单位均为像素。不调用该函数时,屏幕缺省左上角位置在(0,0)点,宽度、高度均为100。二、窗口处理和事件处理函数此类函数都为回调函数( CALLBACK),共有三个232: void aux Reshape Func(void function)(Glsizei);
下载地址
用户评论