《精品openGL讲义.ppt》由会员分享,可在线阅读,更多相关《精品openGL讲义.ppt(71页珍藏版)》请在三一办公上搜索。
1、1,一、OpenGL简介,什么是OpenGLOpenGL的组成一个简单的绘图程序OpenGL函数命名规范NT环境中OpenGL的命令解释流程,2,什么是OpenGL,是一个功能强大的图形库,用户可以很方便地开发所需要地有多种特殊视觉(如光照,纹理,透明,阴影)的三维图形。与软硬件平台无关的三维图形软件包,可运行于多种窗口系统之上包含图元生成、投影、光照、光栅化等图形显示过程所需的功能,3,发展历史,前身是由SGI公司为其图形工作站开发的IRIS GL,是一个工业标准的三维图形软件接口。向其他平台移植时,开发了OpenGL,有GL的功能,而且是开放的,使用于多种硬件平台及操作系统,用户可以创建出
2、接近光线跟踪的高质量静止或动画的三维彩色图象,而且是要比光线跟踪算法快一个数量级。,4,OpenGL的组成,OpenGL库包括115个基本函数函数以gl开头例:glColor3f(),glTranslate3f().完成图元的定义、几何变换、投影等功能,5,OpenGL的组成,OpenGL实用库实用函数43个函数以glu开头例:gluPerspective();完成更高层的图形处理如曲线曲面的生成、图象操作等OpenGL辅助库包括函数31个函数以aux开头例:auxInitWindow();主要用于窗口管理,6,主要特点,OpenGL可以在网络上工作,即客户机/服务器型,显示图形的计算机(客户
3、机)可以不是运行图形程序的计算机(服务器),客户机与服务器可以是不同类型的计算机,只要两者服从相同的协议。OpenGL是与硬件无关的软件接口,可以在多种硬件平台上运行,使得OpenGL的应用程序有较好的移植性。,7,OpenGL的工作顺序,构造几何要素(点,线,多边形,图象,位图),创建对象的数学描述。在三维空间上放置对象,选择有利的场景观察点。计算对象的颜色,这些颜色可能直接定义,或由光照条件及纹理间接给出。光栅化,把对象的数学描述和颜色信息转换到屏幕的象素。另外,也可能执行消隐,以及对象素的操作。,8,OpenGL程序的基本结构,第一部分是初始化部分:主要是设置一些OpenGL的状态开关,
4、如颜色模式(RGBA或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验,裁剪等等。这些状态一般都用函数glEnable(?),glDisable(?)来设置,?表示特定的状态。,9,第二部分设置观察坐标系下的取景模式和取景框大小。主要用到三个函数:void glViewport(left,top,right,bottom);设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以象素表示);void glOrtho(left,right,bottom,top,near,far);设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体;void
5、 gluPerspective(fovy,aspect,zNear,zFar);设置投影方式为透视投影,其取景体积是一个截头锥体,在这个体积内的物体投影到锥的顶点。,10,第三部分是OpenGL的主要部分,使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系,几何变换,光照处理等等。注:移植到使用MFC框架下的Windows程序中,由于Windows自身有一套显示方式,需要进行一些必要的改动以协调这两种不同显示方式。,11,绘图前的一些准备工作,清除当前窗口的内容,以免影响绘图的效果 void glClearColor(red,green,blue,alpha);给定
6、当前屏幕的背景设置颜色,red,green,blue,alpha 为RGBA颜色值.,12,void glClear(mask);命令标志要清除的缓冲区。可以清除的缓冲区如下表所示:,13,可以用glClearColor,glClearDepth,glClearIndex,glClearStencil,glClearAcc函数为各自对应的缓冲区赋值。若要同时清除多个缓冲区,使用上表中所列的mask位或组合,在速度上要比使用多次调用glClear函数要快得多。,14,描述几何要素,按一定的顺序给出几何要素的顶点,glVertex命令指定一个顶点,并在生成顶点后,把当前颜色,纹理坐标,法线等值赋给
7、这个顶点。函数void glVertex234sifdv(coords);有时用矢量形式定义顶点,执行效率高,但是它只能在glBegin与glEnd之间调用才有意义。,15,glBegin标志几何要素定义的开始,glEnd函数则标志结束一个几何要素的定义。函数 void glBegin(Glenum mode);mode 的值见下表。,16,17,一个简单的绘图程序,例程,#include#include#include#include void main(void)OpenAWindow();/创建一个窗口InitOpenGL();/初始化OpenGLglColor3f(1.0,1.0,1.
8、0);/设置当前颜色glBegin(GL_POLYGON);/开始绘图glVertex2f(-0.5,-0.5);glVertex2f(-0.5,0.5);glVertex2f(0.5,0.5);glVertex2f(0.5,-0.5);glEnd();glFlush();/强制输出KeepTheWindowOnScreenForAWhile();/使窗口在屏幕上保留一会,18,OpenGL函数命名规范,void glVertex3fv(Glfloat*vertex);前缀 后缀前缀gl,glu,aux-该函数属于哪个函数库后缀2,3,4-参数的维数b,s,l,f,d,ub,us,ui-参数的
9、数据类型v-以数组方式传递参数函数名中的单词首写字母大写,19,NT环境中OpenGL的命令解释流程,OpenGL命令,OpenGL DLL,客户,服务器,OpenGL ICD,加速卡DDI,Win32 DDI,Server DLL,视频驱动,应用程序,不带加速卡 带加速卡,应用程序,OpenGL命令,OpenGL DLL,客户,服务器,Server DLL,Win32 DDI,视频驱动,20,NT环境中OpenGL的命令解释流程,ICD是可安装的客户驱动(Installable Client Driver)DLL是动态联接库(Dynamic Link Library)DDI是设备驱动接口(D
10、evice Driver Interface),21,二、OpenGL图元,创建第一个应用程序图元的绘制图元的属性,22,创建第一个应用程序(1/8),初始化显示方式例:将显示方式置为单缓存、直接颜色方式,void auxInitDisplayMode(GL_SINGLE|AUX_RGBA);,void auxInitDisplayMode(Glbitfield mask);mask:GL_DOUBLE(GL_SINGLE)|AUX_RGBA(AUX_INDEX)|AUX_DEPTH|AUX_STENCIL|AUX_ACCUM,23,创建第一个应用程序(2/8),创建窗口初始化窗口的位置与大小
11、 创建并显示窗口,void auxInitPosition(Glint x,GLint y,GLsizei width,GLsizei height);(x,y):窗口的原点width,height:窗口的宽和高,void auxInitWindow(GLbyte*title);title:窗口标题,24,创建第一个应用程序(3/8),初始化帧缓存(颜色缓存)指定初始颜色清帧缓存,void glClearColor(GLclampf r,GLclampf g,GLclampf b,GLclampf a);缺省值:(0.0,0.0,0.0,0.0),void glClear(GL_COLOR_B
12、UFFER_BIT);,25,创建第一个应用程序(4/8),初始化深度缓存指定初始深度值 清深度缓存,void glClearDepth(GLclampd depth);缺省值:0.0,void glClear(GL_DEPTH_BUFFER_BIT);,26,创建第一个应用程序(5/8),设置投影方式置投影方式为平行投影置投影方式为透视投影,void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,Gldouble near,GLdouble far);,void glFrustum(GLdouble lef
13、t,GLdouble right,GLdouble bottom,GLdouble top,Gldouble near,GLdouble far);,27,创建第一个应用程序(6/8),指定图元的颜色绘图强制输出,void glColor*();,void glFlush(void);,28,创建第一个应用程序(7/8),例程2-1#include#include#include#include void KeepTheWindowOnScreenForAWhile()_sleep(2000);void main(void)auxInitDisplayMode(AUX_SINGLE|AUX_R
14、GBA);auxInitPosition(0,0,500,400);auxInitWindow(Create Your Own Program);glClearColor(0.0,0.0,0.0,0.0);glClearDepth(0.0);glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);,29,创建第一个应用程序(8/8),glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);glColor3f(1.0,1.0,1.0);glBegin(GL_POLYGON);glVertex3f(-0.5,-0.5,0.0);glVert
15、ex3f(-0.5,0.5,0.0);glVertex3f(0.5,0.5,0.0);glVertex3f(0.5,-0.5,0.0);glEnd();glFlush();KeepTheWindowOnScreenForAWhile();,30,图元的绘制(1/2),图元的种类点、线段、多边形、矩形图元的表示点:三维坐标(x,y,z)齐次坐标(x,y,z,1)线段:两个端点多边形:顶点序列矩形:左下角点、右上角点绘制图元定义一个顶点void glVertex234sifdv(TYPE coords);,例:glVertex3f(1.0,1.0,1.0);,31,图元的绘制(2/2),glBeg
16、in()与glEnd()允许在glBegin()与glEnd()之间调用的OpenGL命令,void glBegin(GLenum mode);mode:GL_POINTS,GLLINES,GL_LINE_STRIP,GL_LINE_LOOP,GL_POLYGON,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN,GL_QUADS,GL_QUAD_STRIPvoid glEnd(void);,glVertex*();glColor*();glIndex();glNormal();glEvalCoord*();glCallList(),glCallLists();glTexCo
17、ord();glEdgeFlag();glMaterial();,32,图元的属性(1/5),颜色点大小(缺省值为1)线段线宽,void glColor*();void glIndex();,void glPointSize(GLfloat size);,void glLineWidth(GLfloat width);,33,图元的属性(2/5),线型:连续线(缺省值)、点画线等多边形绘制方式:顶点、边界、填充,void glPolygonMode(GLenum face,GLenum mode);face:GL_FRONT_AND_BACK(缺省值)GL_FRONTGL_BACKmode:G
18、L_POINTGL_LINEGL_FILL(缺省值),34,图元的属性(3/5),前向面与后向面背面剔除,void glFrontFace(GLenum mode);mode:GL_CCW(缺省值)GL_CW,void glCullFace(GLenum mode);mode:GL_FRONT GL_BACK(缺省值)GL_FRONT_AND_BACK,35,图元的属性(4/5),多边形填充方式均匀填色方式位图不透明方式位图透明方式象素图方式,void glEnable(GL_POLYGON_STIPPLE);void glPolygonStipple(const Glubyte*mask);
19、mask:位图,36,图元的属性(5/5),标记多边形边界多边形法向,void glEdgeFlag(GLboolean flag);,void glNormal3*(TYPE nx,TYPE ny,TYPE nz);void glNormal3*v(const TYPE*v);,37,三、辅助库,初始化一个窗口处理输入事件修改查色表绘制简单的三维物体管理后台进程运行主程序辅助库中定义的虚键值,38,为什么需要辅助库,使得OpenGL具有平台无关性窗口管理输入事件处理绘制简单的三维物体后台与主进程管理,39,窗口管理(1/2),设置窗口显示方式,void APIENTRY auxInitDis
20、playMode(GLenum mode);mode:(1)颜色方式:AUX_RGBA(直接颜色)AUX_INDEX(索引颜色)(2)缓存方式:AUX_SINGLE(单缓存)AUX_DOUBLE(双缓存)(3)深度缓存位数:AUX_DEPTH(16位)AUX_DEPTH24(32位)(4)模板缓存位数:AUX_STENCIL(4位)(5)Alpha缓存位数:AUX_ALPHA(8位)同一组中只能选一个,不同组之间用“|”相或,40,窗口管理(2/2),创建窗口设置窗口的位置和大小,GLenum APIENTRY auxInitWindow(LPCTSTR title);title:窗口的标题,
21、为一字符串,void APIENTRY auxInitPosition(int x,int y,int w,int h);x,y定义了窗口的起始点。w,h定义了窗口的宽和高。,41,处理输入事件,窗口尺寸改变键盘响应鼠标响应,void APIENTRY auxReshapeFunc(AUXRESHAPEPROC myReshape);myReshape是处理窗口尺寸改变消息的函数,void APIENTRY auxKeyFunc(int key,AUXKEYPROC mykeyProc);key是键的虚键值,辅助库中定义了大多数键盘上的虚键值。mykeyProc是对应于key的处理函数,不同的
22、key可以有不同的函数。,void APIENTRY auxMouseFunc(int b,int m,AUXMOUSEPROC myMouseFunc);b是鼠标键的虚键值。m是键的状态。myMouseProc是对应于b和m的处理函数,42,修改查色表,void APIENTRY auxSetOneColor(int index,float r,float g,float b);设置index所指向的颜色。各个颜色分量由r,g,b给出,43,绘制简单的三维物体(1/2),void APIENTRY auxWireSphere(GLdouble);/绘制球(线框图)void APIENTRY
23、auxSolidSphere(GLdouble);/绘制球(填充图)void APIENTRY auxWireCube(GLdouble);/绘制立方体void APIENTRY auxSolidCube(GLdouble);void APIENTRY auxWireBox(GLdouble,GLdouble,GLdouble);/绘制长方体void APIENTRY auxSolidBox(GLdouble,GLdouble,GLdouble);void APIENTRY auxWireTorus(GLdouble,GLdouble);/绘制圆环面void APIENTRY auxSolid
24、Torus(GLdouble,GLdouble);void APIENTRY auxWireCylinder(GLdouble,GLdouble);/绘制圆柱void APIENTRY auxSolidCylinder(GLdouble,GLdouble);void APIENTRY auxWireCone(GLdouble,GLdouble);/绘制圆锥,44,绘制简单的三维物体(2/2),void APIENTRY auxSolidCone(GLdouble,GLdouble);void APIENTRY auxWireTeapot(GLdouble);/绘制茶壶void APIENTRY
25、 auxSolidTeapot(GLdouble);void APIENTRY auxWireIcosahedron(GLdouble);/绘制二十面体void APIENTRY auxSolidIcosahedron(GLdouble);void APIENTRY auxWireDodecahedron(GLdouble);/绘制十二面体void APIENTRY auxSolidDodecahedron(GLdouble);void APIENTRY auxWireOctahedron(GLdouble);/绘制八面体void APIENTRY auxSolidOctahedron(GLd
26、ouble);void APIENTRY auxWireTetrahedron(GLdouble);/绘制四面体 void APIENTRY auxSolidTetrahedron(GLdouble);,45,后台与主进程管理,后台程序主程序,void APIENTRY auxIdleFunc(AUXIDLEPROC idleProc);idleProc是当系统空闲时调用的函数,void APIENTRY auxMainLoop(AUXMAINPROC displayFunc);diplayFunc是绘制场景的函数,46,辅助库中定义的虚键值,鼠标:AUX_LEFTBUTTON,AUX_RIG
27、HTBUTTON,AUX_MIDDLEBUTTON控制键:AUX_SHIFT,AUX_CONTROL,AUX_RETURN,AUX_ESCAPE,AUX_SPACE,AUX_LEFT,AUX_UP,AUX_RIGHT,AUX_DOWN等一般键:AUX_A,AUX_B,AUX_C等(大写字母)AUX_a,AUX_b,AUX_c等(小写字母)AUX_0,AUX_1,AUX_2等(数字),47,四、几何变换与投影,坐标系基本几何变换变换的分解与合成变换的模式矩阵栈及其操作投影视区参数的设置三维图形的变换流程,48,坐标系,右手坐标系,49,OpenGL的变换过程,OpenGL对图象进行变换与照相机拍
28、摄物体的过程相似。分为以下四步:支起三角架,把照相机放在场景中,相当于OpenGL的取景变换把要拍摄的场景固定在要拍摄的物体上,相当于OpenGL的模型变换选择照相机镜头或调节焦距,相当于OpenGL的投影变换。确定照片的大小,可以放大照片的某一部分,相当于OpenGL的视见区变换,50,投影变换,就是要确定一个取景体积,其作用有两个:确定物体投影到屏幕的方式,即是透视投影还是正交投影。确定从图象上裁剪掉哪些物体或物体的某些部分。投影变换包括透视投影和正交投影(平行投影),51,透视投影,其取景体积是一个截头锥体,再这个体积内的物体投影到锥的顶点,有glFrustum命令定义这个截头锥体,这个
29、取景体积可以是不对称的void glFrustum(Gldouble left,Gldouble right,Gldouble bottom,Gldouble top,Gldouble near,Gldouble far);,52,透视投影的示意图,53,正交投影,其取景体积是一个各面均为矩形的六面体,用glOrtho命令创建正交平行的取景体积void glOrtho(Gldouble left,Gldouble right,Gldouble bottom,Gldouble top,Gldouble near,Gldouble far);,54,正交投影的示意图,55,基本几何变换,平移变换放
30、缩变换旋转变换,viod glTranslatefd(TYPE deltax,TYPE deltay,TYPE deltaz);,void glScalefd(TYPE sx,TYPE sy,TYPE sz);,void glRotatefd(TYPE angle,TYPE x,TYPE y,TYPE z);,(x,y,z),o,旋转正向,56,变换的模式,固定坐标系模式活动坐标系模式,57,矩阵栈及其操作(1/8),三种矩阵栈模型观察变换矩阵栈(至少32个矩阵)投影变换矩阵栈(至少2个矩阵)纹理变换矩阵栈(至少2个矩阵)矩阵栈的初始状态包含一个单位矩阵确定当前矩阵栈,void glMatri
31、xMode(GLenum mode);mode:GL_MODELVIEWGL_PROJECTIONGL_TEXTURE,58,矩阵栈及其操作(2/8),清矩阵栈栈顶,void glLoadIdentity(void);将栈顶矩阵替换为单位矩阵取消之前变换的作用,glLoadIdentity(),59,矩阵栈及其操作(3/8),压栈,void glPushMatrix(void);复制栈顶矩阵并压入栈记住位置,坐标系1,坐标系2,坐标系1,坐标系2,坐标系3,60,矩阵栈及其操作(4/8),出栈,void glPopMatrix(void);弹出栈顶矩阵回到记住的位置,坐标系1,坐标系2,坐标系
32、3,坐标系1,坐标系2,61,矩阵栈及其操作(5/8),设置栈顶矩阵,void glLoadMatrix(const TYPE*matrix);将栈顶矩阵替换为matrix实现任意变换,glLoadMatrix(M2),62,矩阵栈及其操作(6/8),矩阵相乘,void glMultiMatrixfd(const TYPE*matrix);以矩阵matrix右乘栈顶矩阵并替换栈顶矩阵实现任意变换,M1*M2,glMultiMatrix(M2),63,矩阵栈及其操作(7/8),基本几何变换的作用平移变换放缩变换,64,矩阵栈及其操作(8/8),旋转变换,65,投影(1/5),缺省的观察坐标系,窗
33、口,x,u,y,v,z,n,o,66,投影(2/5),改变缺省的观察坐标系设置任意观察坐标系,glMatrixMode(GL_PROJECTION);glRotatef(75,1.0,0.0,0.0);,void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,Gldouble centerx,GLdouble centery,GLdouble centerz,Gldouble upx,GLdouble upy,GLdouble upz);(eyex,eyey,eyez)为视点/投影中心(centerx,centery,centerz)为
34、观察参考点的位置(upx,upy,upz)为观察正向,例程4-4,67,投影(3/5),平行投影参数的设置,void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,Gldouble near,GLdouble far);void glOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top);,68,投影(4/5),透视投影参数的设置,void glFrustum(GLdouble left,GLdouble right,GLdoubl
35、e bottom,GLdouble top,Gldouble near,GLdouble far);,left,right,top,bottom,near,far,坐标原点,69,投影(5/5),void gluPerspective(GLdouble fory,GLdouble aspect,GLdouble near,GLdouble far);,w,坐标原点,h,aspect=w/h,near,far,fovy,70,视区参数的设置,m,void glViewport(GLint x,GLint y,GLint width,GLint height);(x,y):视区左下角点width,height:视区的宽和高,71,三维图形的变换流程,模型变换,观察变换,投影变换,窗口至视区的变换,