您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 第2章-OpenGL编程基础
第2章OpenGL编程基础本章各小结目录2.1OpenGL绘制基本知识2.2基于对话框的OpenGL图形程序的基本框架2.3基于单文档的OpenGL图形程序的基本框架2.4基于多文档的OpenGL图形程序的基本框架2.5VisualBasic语言开发OpenGL程序的基本框架2.6Fortran语言开发OpenGL程序的基本框架2.7Delphi语言开发OpenGL程序的基本框架2.1OpenGL绘制基本知识2.1.1基本数据类型OpenGL的数据类型主要是描述三维物体空间位置及其属性的整数和浮点数。虽然OpenGL的数据类型可以用其他语言的相应数据类型来表达,但是建议在OpenGL编程时采用OpenGL定义的数据类型。OpenGL中定义的数据类型均以GL开头,与C语言中的数据类型的对照关系如表2.1所示。表2.1OpenGL中的数据类型缩写字符数据类型C中的数据类型OpenGL中的数据类型b8位整数signedcharGLbyteub8位无符号整数unsignedcharGlubyte,GLbooleans16位整数shortGLshortus16位无符号整数unsignedshortGLushorti32位整数longGLint,GLsizeiui32位无符号整数unsignedlongGLuint,GLenum,GLbitfieldf32位浮点数floatGLfloat,GLclampfOpenGL中定义了大量的符号常量,所有这些常数都是以GL_开头,全部采用大写字母,常数的各部分之间采用下划线分隔,表2.2列出了部分OpenGL中的符号常数及其含义,更多的将在相应的章节中介绍。d64位浮点数doubleGLdouble,GlclampdvoidGLvoid表2.2OpenGL中的部分常数及其含义缩写字符数据类型GL_POINTS绘制单个顶点集GL_LINES绘制多组独立的双顶点线段GL_POLYGONS绘制单个连线多边形GL_AMBIENT设置RGBA模式下的环境光GL_POSITION设置光源位置GL_SPOT_DIRECTION点光源聚光方向矢量GL_CONSTANT_ATTENUATION设置常数衰减因子GL_FLAT设置平面明暗处理模式GL_SMOOTH设置光滑明暗处理模式2.1.2图形绘制本节主要知识点如下。(1)在OpenGL中,所有的几何物体都要由若干个有序的顶点集合来描述,也就是说OpenGL采用有序排列的顶点集合来构造几何图元,而不是将线段、多边形组合起来构造几何图元。例如:glVertex2s(3,8);//整数定义的二维坐标glVertex4f(1.,2.,3.,4.);//浮点数定义的齐次坐标(2)在OpenGL中,同一个几何图元的所有被定义的顶点一起放在glBegin()和glEnd()函数之间,同时定义这些顶点之间的关系。例如:glBegin(GL_POLYGON);//绘制一个多边形glVertex2s(0,0);glVertex2s(0,12);glVertex2s(12,16);glVertex2s(16,8);glVertex2s(8,0);glEnd();函数glBegin()中可以使用的顶点关系类型见表2.3。表2.3OpenGL中的基本图元定义变量参数名称参数说明GL_POINTS单个顶点集GL_LINES多组独立的双顶点线段GL_POLYGON单个连线多边形GL_TRIANGLES多个独立连线三角形GL_QUADS多个独立连线四边形GL_LINE_STRIP不闭合折线(3)在glBegin()和glEnd()函数之间,还可以指定顶点的颜色、法向、纹理坐标等信息,只需在该顶点的空间位置定义之前,调用相关的函数即可。可以在glBegin()和glEnd()之间调用的函数见表2.4。GL_LINE_LOOP闭合折线GL_TRIANGLE_STRIP线形的连续三角形串GL_TRIANGLE_FAN扇形的连续三角形串GL_QUAD_STRIP连续的四边形串表2.4glBegin()和glEnd()之间可以调用的函数函数名称函数功能说明glCallList()执行显示列表glCallLists()执行显示列表glColor*()设置当前颜色glEdgeFlag*()控制边界绘制glEvalCoord*()产生坐标glIndex*()设置当前颜色表glMaterial*()设置材质glNormal*()设置法向坐标glTexCoord*()设置纹理坐标glVertex*()设置顶点坐标2.1.3显示列表本节主要知识点如下。(1)OpenGL显示列表(DisplayList)是由一组预先存储起来的留待以后调用的OpenGL函数语句组成的,当调用这张显示列表时就依次执行表中所列出的函数语句。前面内容所举出的例子都是瞬时给出函数命令,则OpenGL瞬时执行相应的命令,这种绘图方式叫做立即或瞬时方式。(2)使用显示列表的场合。并不是只要调用显示列表就能优化程序性能。因为调用显示列表本身时程序也有一些开销,若一个显示列表太小,这个开销将超过显示列表的优越性。下面给出显示列表能最大优化的场合:1)矩阵操作。大部分矩阵操作需要OpenGL计算逆矩阵,矩阵及其逆矩阵都可以保存在显示列表中。2)光栅位图和图像。程序定义的光栅数据不一定是适合硬件处理的理想格式。当编译组织一个显示列表时,OpenGL可能把数据转换成硬件能够接受的数据,这可以有效地提高画位图的速度。3)光、材质和光照模型。当用一个比较复杂的光照环境绘制场景时,可以为场景中的每个物体改变材质。但是材质计算较多,因此设置材质可能比较慢。若把材质定义放在显示列表中,则每次改换材质时就不必重新计算了。因为计算结果存储在表中,因此能更快地绘制光照场景。4)纹理。因为硬件的纹理格式可能与OpenGL格式不一致,若把纹理定义放在显示列表中,则在编译显示列表时就能对格式进行转换,而不是在执行中进行,这样就能大大提高效率。5)多边形的图案填充模式。即可将定义的图案放在显示列表中,特别是对于一些比较复杂的多边形图案,这样可以有效地提高多边形的绘制速度。(3)创建显示列表。OpenGL提供类似于绘制图元的结构即glBegin()与glEnd()的形式创建显示列表,其相应的函数为:voidglNewList(GLuintlist,GLenummode);说明一个显示列表的开始,其后的OpenGL函数存入显示列表中,直至调用结束表的函数(见下面)。参数list是一个正整数,它标志唯一的显示列表。参数mode的可能值有GL_COMPILE和GL_COMPILE_AND_EXECUTE。若要使后面的函数语句只存入而不执行,则用GL_COMPILE;若要使后面的函数语句存入表中且按瞬时方式执行一次,则用GL_COMPILE_AND_EXECUTE。voidglEndList(void);标志显示列表的结束。注意:并不是所有的OpenGL函数都可以在显示列表中存储且通过显示列表执行。一般来说,用于传递参数或返回数值的函数语句不能存入显示列表,因为这张表有可能在参数的作用域之外被调用;如果在定义显示列表时调用了这样的函数,则它们将按瞬时方式执行并且不保存在显示列表中,有时在调用执行显示列表函数时会产生错误。以下列出的是不能存入显示列表的OpenGL函数:glDeleteLists()glIsEnable()glFeedbackBuffer()glIsList()glFinish()glPixelStore()glGenLists()glRenderMode()glGet*()glSelectBuffer()(4)执行显示列表。在建立显示列表以后就可以调用执行显示列表的函数来执行它,并且允许在程序中多次执行同一显示列表,同时也可以与其它函数的瞬时方式混合使用。显示列表执行的函数形式如下:voidglCallList(GLuintlist);执行显示列表。参数list指定被执行的显示列表。显示列表中的函数语句按它们被存放的顺序依次执行;若list没有定义,则不会产生任何事情。(5)管理显示列表。为了避免意外删除,可以调用函数glGenList()来产生一个没有用过的显示列表,或调用glIsList()来决定是否指定的显示列表被占用。此外,在管理显示列表的过程中,还可调用函数glDeleteLists()来删除一个或一个范围内的显示列表。下面分别介绍这些函数:GLuintglGenList(GLsizeirange);分配range个相邻的未被占用的显示列表索引。这个函数返回的是一个正整数索引值,它是一组连续空索引的第一个值。返回的索引都标志位空且已被占用,以后再调用这个函数时不再返回这些索引。若申请索引的指定数目不能满足或range为0,则函数返回0。GLbooleanglIsList(GLuintlist);询问显示列表是否已被占用的情况。若索引list已被占用,则函数返回TRUE;反之,返回FALSE。voidglDeleteLists(GLuintlist,GLsizeirange);删除一组连续的显示列表,即从参数list所指示的显示列表开始,删除range个显示列表,并且删除后的这些索引重新有效。若删除一个没有建立的显示列表则忽略删除操作。当建立一个与已经存在的显示列表索引相同的显示列表时,OpenGL将自动删除旧表。(6)多级显示列表。多级显示列表的建立就是在一个显示列表中调用另一个显示列表,也就是说,在函数glNewList()与glEndList()之间调用glCallList()。多级显示列表对于构造由多个元件组成的物体十分有用,尤其是某些元件需要重复使用的情况。但为了避免无穷递归,显示列表的嵌套深度最大为64(也许更高些,这依赖于不同的OpenGL实现),当然也可调用函数glGetIntegerv()来获得这个最大嵌套深度值。OpenGL在建立的显示列表中允许调用尚未建立的表,当第一个显示列表调用第二个并没定义的表时,不会发生任何操作。另外,也允许用一个显示列表包含几个低级的显示列表来模拟建立一个可编辑的显示列表。2.1.4OpenGL颜色本节主要知识点如下:(1)在OpenGL中,颜色的模式有两种,即RGBA模式和颜色索引(ColorIndex)模式。在RGBA模式下,所有的颜色定义都使用R、G、B、A(Alpha,与透明度有关)。在颜色索引(ColorIndex)模式下,每一个像素的颜色是用颜色索引表中的某个颜色值来表示,而这个索引值指向了相应的RGB值。这样的一个表称为颜色映射(ColorMap)。(2)在RGBA模式下,利用glColor*命令来定义当前的颜色。glColor*()命令有如下几种形式:voidglColor3{bsifdubusui}(r,g,b:TYPE);voidglColor4{bsifdubusui}(r,g,b:TYPE;a:TYPE);voidglColor3{bsifdubusui}v(r,g,b:TYPE);voidglColor4{bsifdubusui}v(r,g,b:TYPE;a:TYPE);其中,参数a是表示透明度的alpha值。后面两个带v后缀的命令表明它们的参数是向量,即数组。以glColor3f为例,其参数取值范围是[-1.0,1.0],这是帧缓存中允许的最小值和最大值,当参数值不在该范围内时,将自动把它的取值强置于[-1.0,1.0]之间。其他数值类型的函数也将自动把参数均匀映射到这个区间,映射范围见表2.5所示。表2.5函数的映射范围(3)在颜色索引模式下,同时调用函数glIndex*()从颜色索引表中选取当前的颜色。voidglIndex{sfdi}(c:TYPE);voidglIndex{sfdi}v(c:TYPE);参数c是待设置的当前颜色索引值(调色板号),当c测定取值大于颜色索引总数时,对c取模。(4)两种模式应用场合。在大多情况下,采用RGBA模式比颜色表模式的要多,尤其许多效
本文标题:第2章-OpenGL编程基础
链接地址:https://www.777doc.com/doc-5485705 .html