计算机图形学第六章OpenGL基本图元的绘制.ppt_第1页
计算机图形学第六章OpenGL基本图元的绘制.ppt_第2页
计算机图形学第六章OpenGL基本图元的绘制.ppt_第3页
计算机图形学第六章OpenGL基本图元的绘制.ppt_第4页
计算机图形学第六章OpenGL基本图元的绘制.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、Lecture 6 OpenGL基本图元的绘制,概述,图元的种类:点、线段、多边形、矩形 OpenGL中所有的实体最终都可采用一系列有序的顶点描述。 二维图形是三维图形的特殊情况(z分量为0),在三维顶点绘制指令中,如果用户设定二维坐标(x, y),OpenGL就会自动令z=0 OpenGL提供的描述点、线、多边形的绘制机制。必须通过glBegin()和glEnd()函数配对来完成.,OpenGL的程序结构(6_1),auxInitDisplayMode(AUX_SINGLE|AUX_RGBA)设置窗口显示模式为RGBA方式,即彩色方式,并且图形缓存为单缓存(SINGLE BUFFER)。 a

2、uxInitPosition(0,0,500,500)定义窗口的初始位置,前两个参数(0,0)为窗口的左上角点的屏幕坐标,后两个参数(500,500)为窗口的宽度和高度。 auxInitWindow(AUX_SAMPLE)是窗口初始化,字符参数是窗口名称。,OpenGL的程序结构(6_1),auxReshapeFunc()和auxMainLoop(),参数都是一个函数指针,指向的都是回调函数(回调函数定义用CALLBACK说明)。 auxReshapeFunc()是窗口形状重定函数,参数指针指向函数myReshape(),它的两个参数就是窗口的 新宽度和新高度。然后用glViewport(0,

3、0,w,h)重定视口,并且在新视口内重新定义投影矩阵。,AUX库显示坐标范围(6_2),设定视区的函数,即指定一个显示窗口的范围(程序6_2) void CALLBACK Reshape(GLsizei width,GLsizei height) glViewport(0,0,width,height); auxReshapeFunc(myReshape); 窗口形状重定函数,参数指针指向函数myReshape(),它的两个参数就是窗口的新宽度和新高度。 auxInitPosition(0,0,500,500);初始化显示窗口的大小,AUX库显示坐标范围,如果使用auxReshapeFunc(

4、myReshape);设定了窗口形状重定函数。则显示窗口的坐标范围为11。其绘图像的过程是把11范围的坐标点映射到屏幕坐标。 如果未使用auxReshapeFunc(myReshape);设定窗口形状重定函数。则显示窗口的坐标范围为实际窗口的尺寸。,OpenGL的状态机制,OpenGL的绘图方式是由一系列的状态决定的。如果设置了一种状态或模式而不改变它,OpenGL在绘图的过程中将一直保持这种状态或模式。 例如: Void myinit(void) glClearColor(0.0,0.0,0.0,0.0); ,OpenGL的状态机制,其中函数glClearColor(0.0,0.0,0.0,

5、0.0)将视口背景色清为黑色,如果不改变这种状态,视口背景色将一直保持黑色。其他状态有: 模型变换 线及多边形的填充图案 多边形绘制模式 光源的位置及特性 被绘制物体的材质等,基于MFC的OpenGL编程(6_3),OpenGL辅助函数库提供了一些窗口和事件管理函数,但提供的功能有限。而MFC却提供了大量对窗口和事件管理和控制的函数。 图形操作描述 像素格式,图形操作描述,每一个Windows程序都必须设置设备描述表DC(Device Contexts),DC包含了窗口上显示图形的诸多信息,例如:指定绘图模式、画笔和刷子的颜色。OpenGL的Windows程序也必须使用DC。 OpenGL还必

6、须处理专用的绘图描述表RC(Rendering Contexts),一个OpenGL应用程序必须创建一个绘图描述表,然后启动它,最后在所定义的窗口内按常规方式调用OpenGL函数绘图。,图形操作描述,首先得到设备描述表DC(设备上下文): m_pDC = new CClientDC(this); 创建绘图描述表/Create rendering content hrc = wglCreateContext(m_pDC-GetSafeHdc();,图形操作描述,绘图: 设置一个线程的当前绘图描述表 wglMakeCurrent(m_pDC-GetSafeHdc(), hrc); DrawScen

7、e(); wglGetCurrentDC()得到当前设备描述表 SwapBuffers(wglGetCurrentDC(); 释放绘图描述表所使用的设备描述表 wglMakeCurrent(m_pDC-GetSafeHdc(), NULL);,像素格式,在创建一个绘图描述表之前,首先必须设置设备描述表的像素格式,像素格式含有设备绘图界面的属性: 颜色模式(RGBA模式/颜色索引模式) 单/双缓冲区 颜色、深度、累加和模板缓冲区所用的位数,像素格式,PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR), / 该结构所占空间 1, /

8、版本号,当前为1 PFD_DRAW_TO_WINDOW | / 支持windows的屏幕绘图 PFD_SUPPORT_OPENGL | / 支持OpenGL PFD_DOUBLEBUFFER, / 支持双缓存 PFD_TYPE_RGBA, / 支持RGBA 颜色模式 24, / 24位颜色深度 0, 0, 0, 0, 0, 0, / 红绿蓝颜色分量和偏移量所占位数相同 0, / 无alpha分量 0, /无alpha偏移量 0, / 无累加缓冲区 0, 0, 0, 0, /忽略累加缓冲区的个分量 32, / 32位的深度缓冲区 0, / 无模板缓冲区 0, / 无辅助缓冲区 PFD_MAIN_

9、PLANE, / WIN98、NT下只能是PFD_MAIN_PLANE 0, / 保留,当前为0 0, 0, 0 / 忽略覆盖层的屏蔽 ;,像素格式,设定像素格式后,进行如下的操作: int pixelformat; m_pDC = new CClientDC(this); 使用设备描述表选择一个像素格式 pixelformat = ChoosePixelFormat(m_pDC-GetSafeHdc(), ,定义顶点序列,void glBegin(GLenum mode) 功能:描述一个几何图元顶点序列的开始。 参数说明: mode:指出图元的类型。 void glEnd (void) 功能

10、:标记顶点序列的结束。 函数glVertex( ) 可定义一个点 。,定义顶点序列,例如:绘制一个多边形边界(POLYGON): glBegin(GL_POLYGON) glVertex2f(0.0,0.0); / Vertex 0 givedex2f(0.0,3.0); / Vertex 1 glVedex2f(3.0,3.0); / Vertex 2 alVenex2f(4.0,1.5): / Vertex 3 givedex2f(3.0,0.0); / Vertex 4 glVertex2f(0.0,0.0); / Vertex 0 glEnd();,几何图元类型和说明,几何图元类型和说

11、明,几何图元类型(6_4),几何图元类型,点,GL_POINTS:N个顶点V0, V1, Vn-1构成 离散的顶点序列。 在OpenGL中一个点是当作一个n维(n=2,3,4)向量来处理的。 glVertex2f(2.0, 1.0)指定一个顶点的坐标(2.0, 1.0),则在实际计算中OpnGL是处理点(2.0, 1.0, 0.0) glVertex2,3,4sifd(V)(TYPE coords) 参数说明: coords:用一个数组或用齐次坐标(x, y, z, w)赋顶点坐标,画点的例程,glBegin(GL_POINTS); glVertex3f(0.0,0.0,0.0) glVert

12、ex3f(50.0,50.0,50.0) glEND(); glBegin的参数GL_POINTS告诉OpenGL,下面的顶点应被解释并绘制为点,它们将转换为两个具体的点,并被绘制出来,其颜色为缺省值点的属性。,点的大小,OpenGL提供了可以控制点的大小的函数。点大小的默认值是一个像素。可以用函数glPointsize()修改这个值,以设定点的大小: void glPointsize(GLfloat size),直线,GL_LINES:N个顶点V0, V1, Vn-1每2个一组画线段,即V0-V1,V2-V3,共计画N/2条线。 若N为奇数,则第N个点Vn-1每忽略。,直线的绘制,下面的代码

13、在两个点(0,0,0)和(50,50,50)之间画一根直线。 glBegin(GL_LINES); glVertex3f(0.0,0.0,0.0) glVertex3f(50.0,50.0,50.0) glEND(); 注意:在OpenGL中,参数GL_LINES对每两个指定的顶点画一根直线。如果GL_LINES指定奇数个顶点,那么最后一个顶点将会被忽略。,折线,GL_LINE_STRIP:画一折线: V0-V1,V1-V2 ,V2-V3 ,Vn-2-Vn-1 ,共计N-1条线段。 注意: (1)最后一点与第一点之间不连线,即不形成回路。但当最后一点与第一点之间重合时,显示效果等同于回路效果。

14、 (2)必须满足N1的条件,否则什么也画不出来。,折线例程,图元类型: GL_LINE_STRIP glBegin (GL_LINE_STRIP); glVertex3f(0.0,0.0,0.0); glVertex3f(50.0,50.0,0.0); glVertex3f(100.0,100.0,0.0); glEnd( );,封闭折线,GL_LINE_LOOP:与上面GL_LINE_STRIP的唯一不同之处在于: GL_LINE_LOOP的最后一个顶点与第一个顶点之间进行连线共计N条线段形成回路。,封闭折线例程,图元类型: GL_LINE_LOOP glBegin (GL_LINE_ LO

15、OP); glVertex3f(0.0,0.0,0.0); glVertex3f(50.0,50.0,0.0); glVertex3f(100.0,100.0,0.0); glEnd( );,线型 (6_6),为了使用点画线,必须用以下指令先启动点画线模式。 void glLineStipple (GLint factor,GLushort pattern); 此命令有以下参数: factor是一个从1到255的值,它表示pattern参数中所规定的像素的重复次数,即patten参数中每一位能影响的像素数。 pattern是画线操作时的一个样板。它是二进制的一个0和1序列,在这个序列中0表示不

16、画点,1表示画点。,线型,如果启动点画线操作,线上的点由pattern决定是否绘制,即从Pattern的最低位开始,逐个绘制线段上面的点,如果式样用完后,线段还没有画完,可重新装入式样,上面所说的绘制是指当前颜色绘制该点。 例如:glLineStipple (1,0 x3F07) 0 x3F07转化为二进制为0011 1111 0000 0111。在画线操作时,首先开始的3个象素点绘制,接下来5个点不绘制,6个点绘制,2个象素点不绘制。如果点画线的样板用完,将继续从头开始。 又如:glLineStipple()中factor=2,那么pattern实际上就成为:00001111 1111111

17、1 00000000 00111111,则结果为6个象素点画,10个不画,12个画, 4个象素点不画。 启动点画线用glEnable(GL_LINE_STIPPLE)。 关闭点画线用glDisable(GL_LINE_STIPPLE)。,线宽,可以在画线时使用glLineWidth (GLfloat width) 来控制线的宽度。 glLineWidth()函数用一个参数来指定要画的线以像素计的近似宽度,函数形式如下: glLineWidth(GLFloat width) 此函数中,width0.0,缺省值width=1.0。,线宽,线宽和点的大小一样,不是所有线宽都支持,我们要确保指定的线宽

18、是可用的。下面的代码可以获得线宽的范围和它们之间的最小间隔: GLfloat sizes 2; Glfloat step; GlGetFloatv (GL_LINE_WIDTH_RANGE,sizes); GlGetFloatv (GL_LINE_WIDTH_GRANULARITY, sizes数组包含两个元素,即为glLineWidth的最小有效值和最大有效值。另外,变量step用来保存线宽之间允许的最小增量。,多边形的绘制(6_5),多边形指封闭曲线围成的区域。但OpenGL中的可以描述的多边形有两点限制: (1)多边形的边不能自相交,即边和边除了多边形的顶点外不可以相交。 (2)多边形必

19、须是凸多边形。 这些限制是为特别需要设制的。首先所有的多边形都可以分割为多个凸多边形。限制多边形的类型容易实现硬件加速。 在OpenGL中,多边形的绘制也是由函数gIBegin()和81End()来完成的。,多边形的绘制(6_5),最简单的多边形是三角形,它只有三条边。GL_TRIANGLES图元通过把三个顶点连接到一起而画出三角形。下面的代码可画出一个三角形,如图6.5所示。 glBegin (GL_TRIANGLES); glVertex3f(0.0,0.0,0.0); glVertex3f(25.0,25.0,0.0); glVertex3f(50.0,0.0,0.0); glEnd(

20、);,多边形,GL_POLYGON:采用GL_POLYGON绘制多边形应注意: (1)顶点数N=3,否则什么也画不出来。 (2)多边形各边不允许相交。 (3)只能画凸多边形。 例如:一下情况均非法。,三角面片,GL_TRIANGLES:每3个顶点最为一个独立的三角形,共画N/3个三角形。如果N不是3的倍数,则将N除以3余下的1或2个顶点忽略。,四边形面片,GL_QUADS:每4个顶点作为一个独立的四边形,共计画N/4个四边形。 注意: (1)四边形应满足多边形的性质,为非凹多边形。 (2)如果N不是4的倍数,则将N除以4余下的顶点忽略 (3)不同四边形的边可以相交。,连续三角形,GL_TRIA

21、NGLES_STRIP:画一组以次相连的三角形,相邻的三角形共一条边。 连续三角形绘画的过程为: 给定一个点的序列,先绘制三角形: V0-V1-V2 ,然后以次绘制三角形: V1-V2 -V3 , V2 -V3 -V4 等,连续四边形,GL_QUAD_STRIP:画一组以次相连的四边形。相邻的四边形共一条边。 GL_QUAD_STRIP画一个四边形的过程不是简单的连接V0-V1-V2 -V3 ,而是先画三角V0-V1-V2再画三角形V1-V2 -V3。,多边形的绘制方式(6_9),OpenGL的多边形是有前后面的,显示时那一面朝向观测方向效果可能会不同,这一点可以用来剖视实体。缺省时,多边形的

22、前后面以相同的形式给出。 函数glPolygonMode用来控制多边形的属性,包括前后面的控制以及多边形究竟是填充型、轮廓型还是顶点。 Void glPolygonMode(GLenum face,GLenum mode); 参数face可选常量为GL_FRONT_AND_BACK、GL_FRONT、GL_BACK,通常规定顶点逆时针排列的面朝前。Mode控制多边形的光栅化方法,可用的参数为GL_POINT、GL_LINE、GL_FILL: GL_POINT:仅绘制顶点。GL_LINE:仅绘制轮廓。 GL_FILL:多边形填充。,多边形的绘制方式,反转多边形面 Void glFrontFace

23、(GLenum mode); 该函数用于确定多边形那一面朝前。ModeGL_CCW表示顶点逆时针排列为朝前面,GL_CW表示顶点顺时针排列的面为朝前面。,多边形的绘制方式,glPolygonMode(GL_BACK,GL_LINE); glFrontFace(GL_CCW); glLoadIdentity(); glBegin(GL_POLYGON); glVertex2f(-2.0f/5,0);glVertex2f(-1.0f/5,0);glVertex2f(0,1.5f/5);glVertex2f(-2.0f/5,3.0f/5);glVertex2f(-3.0f/5,2.0f/5); glEnd(); glLoadIdentity(); glTranslatef(3.5f/5,0,0); glFrontFace(GL_CW); glBegin(GL_POLYGON); glVertex2f(-2.0f/5,0);glVertex2f(-1.0f/5,0);glVertex2f(0,1.5f

温馨提示

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

评论

0/150

提交评论