您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > openGL讲义课件
1一、OpenGL简介•什么是OpenGL•OpenGL的组成•一个简单的绘图程序•OpenGL函数命名规范•NT环境中OpenGL的命令解释流程2什么是OpenGL•是一个功能强大的图形库,用户可以很方便地开发所需要地有多种特殊视觉(如光照,纹理,透明,阴影)的三维图形。•与软硬件平台无关的三维图形软件包,可运行于多种窗口系统之上•包含图元生成、投影、光照、光栅化等图形显示过程所需的功能3发展历史•前身是由SGI公司为其图形工作站开发的IRISGL,是一个工业标准的三维图形软件接口。•向其他平台移植时,开发了OpenGL,•有GL的功能,而且是开放的,使用于多种硬件平台及操作系统,•用户可以创建出接近光线跟踪的高质量静止或动画的三维彩色图象,而且是要比光线跟踪算法快一个数量级。4OpenGL的组成•OpenGL库–包括115个基本函数–函数以gl开头–例:glColor3f(),glTranslate3f().–完成图元的定义、几何变换、投影等功能5OpenGL的组成•OpenGL实用库–实用函数43个–函数以glu开头–例:gluPerspective();–完成更高层的图形处理如曲线曲面的生成、图象操作等•OpenGL辅助库–包括函数31个–函数以aux开头–例:auxInitWindow();–主要用于窗口管理6主要特点•OpenGL可以在网络上工作,即客户机/服务器型,显示图形的计算机(客户机)可以不是运行图形程序的计算机(服务器),客户机与服务器可以是不同类型的计算机,只要两者服从相同的协议。•OpenGL是与硬件无关的软件接口,可以在多种硬件平台上运行,使得OpenGL的应用程序有较好的移植性。7OpenGL的工作顺序•构造几何要素(点,线,多边形,图象,位图),创建对象的数学描述。•在三维空间上放置对象,选择有利的场景观察点。•计算对象的颜色,这些颜色可能直接定义,或由光照条件及纹理间接给出。•光栅化,把对象的数学描述和颜色信息转换到屏幕的象素。另外,也可能执行消隐,以及对象素的操作。8OpenGL程序的基本结构•第一部分是初始化部分:主要是设置一些OpenGL的状态开关,如颜色模式(RGBA或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验,裁剪等等。•这些状态一般都用函数glEnable(???),glDisable(???)来设置,???表示特定的状态。9•第二部分设置观察坐标系下的取景模式和取景框大小。主要用到三个函数:voidglViewport(left,top,right,bottom);设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以象素表示);voidglOrtho(left,right,bottom,top,near,far);设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体;voidgluPerspective(fovy,aspect,zNear,zFar);设置投影方式为透视投影,其取景体积是一个截头锥体,在这个体积内的物体投影到锥的顶点。10第三部分是OpenGL的主要部分,使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系,几何变换,光照处理等等。•注:移植到使用MFC框架下的Windows程序中,由于Windows自身有一套显示方式,需要进行一些必要的改动以协调这两种不同显示方式。11绘图前的一些准备工作•清除当前窗口的内容,以免影响绘图的效果voidglClearColor(red,green,blue,alpha);给定当前屏幕的背景设置颜色,red,green,blue,alpha为RGBA颜色值.12voidglClear(mask);命令标志要清除的缓冲区。可以清除的缓冲区如下表所示:缓冲区名称颜色缓冲区GL_COLOR_BUFFER_BIT深度缓冲区GL_DEPTH_BUFFER_BIT累加缓冲区GL_ACCUM_BUFFER_BIT模板缓冲区GL_STENCIL_BUFFER_BIT13可以用glClearColor,glClearDepth,glClearIndex,glClearStencil,glClearAcc函数为各自对应的缓冲区赋值。若要同时清除多个缓冲区,使用上表中所列的mask位或组合,在速度上要比使用多次调用glClear函数要快得多。14描述几何要素•按一定的顺序给出几何要素的顶点,glVertex命令指定一个顶点,并在生成顶点后,把当前颜色,纹理坐标,法线等值赋给这个顶点。•函数voidglVertex{234}{sifd}{v}(coords);有时用矢量形式定义顶点,执行效率高,但是它只能在glBegin与glEnd之间调用才有意义。15•glBegin标志几何要素定义的开始,glEnd函数则标志结束一个几何要素的定义。•函数voidglBegin(Glenummode);mode的值见下表。16Mode的值解释GL_POINTS一系列独立的点GL_LINES每两点相连成为线段GL_POLYGON简单,凸多边形的边界GL_TRIANGLES三点相连成为一个三角形GL_QUADS四点相连成为一个四边形GL_LINE_STRIP顶点相连成为一系列线段GL_LINE_LOOP顶点相连成为一系列线段,连接最后一点与第一点GL_TRIANGLE_STRIP相连的三角形带GL_TRIANGLE_FAN相连的三角形扇形GL_QUAD_STRIP相连的四边形带17一个简单的绘图程序•例程#includewindows.h#includegl.h#includeglu.h#includeglaux.hvoidmain(void){OpenAWindow();//创建一个窗口InitOpenGL();//初始化OpenGLglColor3f(1.0,1.0,1.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();//使窗口在屏幕上保留一会}18OpenGL函数命名规范voidglVertex3fv(Glfloat*vertex);前缀后缀–前缀•gl,glu,aux----该函数属于哪个函数库–后缀•2,3,4----参数的维数•b,s,l,f,d,ub,us,ui----参数的数据类型•v----以数组方式传递参数–函数名中的单词首写字母大写19NT环境中OpenGL的命令解释流程OpenGL命令OpenGLDLL客户服务器OpenGLICD加速卡DDIWin32DDIServerDLL视频驱动应用程序不带加速卡带加速卡应用程序OpenGL命令OpenGLDLL客户服务器ServerDLLWin32DDI视频驱动20NT环境中OpenGL的命令解释流程•ICD是可安装的客户驱动(InstallableClientDriver)•DLL是动态联接库(DynamicLinkLibrary)•DDI是设备驱动接口(DeviceDriverInterface)21二、OpenGL图元•创建第一个应用程序•图元的绘制•图元的属性22创建第一个应用程序(1/8)•初始化显示方式例:将显示方式置为单缓存、直接颜色方式voidauxInitDisplayMode(GL_SINGLE|AUX_RGBA);voidauxInitDisplayMode(Glbitfieldmask);mask:GL_DOUBLE(GL_SINGLE)|AUX_RGBA(AUX_INDEX)|AUX_DEPTH|AUX_STENCIL|AUX_ACCUM23创建第一个应用程序(2/8)•创建窗口–初始化窗口的位置与大小–创建并显示窗口voidauxInitPosition(Glintx,GLinty,GLsizeiwidth,GLsizeiheight);(x,y):窗口的原点width,height:窗口的宽和高voidauxInitWindow(GLbyte*title);title:窗口标题24创建第一个应用程序(3/8)•初始化帧缓存(颜色缓存)–指定初始颜色–清帧缓存voidglClearColor(GLclampfr,GLclampfg,GLclampfb,GLclampfa);缺省值:(0.0,0.0,0.0,0.0)voidglClear(GL_COLOR_BUFFER_BIT);25创建第一个应用程序(4/8)•初始化深度缓存–指定初始深度值–清深度缓存voidglClearDepth(GLclampddepth);缺省值:0.0voidglClear(GL_DEPTH_BUFFER_BIT);26创建第一个应用程序(5/8)•设置投影方式–置投影方式为平行投影–置投影方式为透视投影voidglOrtho(GLdoubleleft,GLdoubleright,GLdoublebottom,GLdoubletop,Gldoublenear,GLdoublefar);voidglFrustum(GLdoubleleft,GLdoubleright,GLdoublebottom,GLdoubletop,Gldoublenear,GLdoublefar);27创建第一个应用程序(6/8)•指定图元的颜色•绘图•强制输出voidglColor*();voidglFlush(void);28创建第一个应用程序(7/8)例程2-1#includewindows.h#includegl\gl.h#includegl\glaux.h#includegl\glu.hvoidKeepTheWindowOnScreenForAWhile(){_sleep(2000);}voidmain(void){auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);auxInitPosition(0,0,500,400);auxInitWindow(CreateYourOwnProgram);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);glVertex3f(-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)–线段:两个端点–多边形:顶点序列–矩形:左下角点、右上角点•绘制图元–定义一个顶点–voidglVertex{234}{sifd}[v](TYPEcoords);例:glVertex3f(1.0,1.0,1.0);31图元的绘制(2/2)–glBegin()与glEnd()–允许在glBegin()与glEnd()之间调用的OpenGL命令voidglBegin(GLenummode);mode:GL_POINTS,GLLINES,GL_LINE_STRIP,GL_LINE_LOOP,GL_POLYGON,GL_TRIANGLE_STRIP,GL_TRIANGL
本文标题:openGL讲义课件
链接地址:https://www.777doc.com/doc-3956100 .html