计算机图形学第六章OpenGL基本图元的绘制.ppt

上传人:牧羊曲112 文档编号:6023513 上传时间:2023-09-15 格式:PPT 页数:46 大小:249.63KB
返回 下载 相关 举报
计算机图形学第六章OpenGL基本图元的绘制.ppt_第1页
第1页 / 共46页
计算机图形学第六章OpenGL基本图元的绘制.ppt_第2页
第2页 / 共46页
计算机图形学第六章OpenGL基本图元的绘制.ppt_第3页
第3页 / 共46页
计算机图形学第六章OpenGL基本图元的绘制.ppt_第4页
第4页 / 共46页
计算机图形学第六章OpenGL基本图元的绘制.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《计算机图形学第六章OpenGL基本图元的绘制.ppt》由会员分享,可在线阅读,更多相关《计算机图形学第六章OpenGL基本图元的绘制.ppt(46页珍藏版)》请在三一办公上搜索。

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

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

3、视口,并且在新视口内重新定义投影矩阵。,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(myReshape);设定

4、了窗口形状重定函数。则显示窗口的坐标范围为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,0.0)将视口背景色清为黑色,如果不

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

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

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

8、RT_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_PLANE,/WIN98、NT下只能是PFD_MAIN_PLANE0,/保留,当前为00,0,0/忽略覆盖层的屏蔽;,像素格式,设定像素格式后,进行如下的操作:int pixelformat;m_

9、pDC=new CClientDC(this);使用设备描述表选择一个像素格式pixelformat=ChoosePixelFormat(m_pDC-GetSafeHdc(),定义顶点序列,void glBegin(GLenum mode)功能:描述一个几何图元顶点序列的开始。参数说明:mode:指出图元的类型。void glEnd(void)功能:标记顶点序列的结束。函数glVertex()可定义一个点。,定义顶点序列,例如:绘制一个多边形边界(POLYGON):glBegin(GL_POLYGON)glVertex2f(0.0,0.0);/Vertex 0givedex2f(0.0,3.0

10、);/Vertex 1glVedex2f(3.0,3.0);/Vertex 2alVenex2f(4.0,1.5):/Vertex 3givedex2f(3.0,0.0);/Vertex 4glVertex2f(0.0,0.0);/Vertex 0glEnd();,几何图元类型和说明,几何图元类型和说明,几何图元类型(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.

11、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)glVertex3f(50.0,50.0,50.0)glEND();glBegin的参数GL_POINTS告诉OpenGL,下面的顶点应被解释并绘制为点,它们将转换为两个具体的点,并被绘制出来,其颜色为缺省值点的属性。,点的大小,OpenGL提供了可以控制点的大小的函数。点大小的默认值是一个像素。可以用函数glPointsize()修改这个

12、值,以设定点的大小:void glPointsize(GLfloat size),直线,GL_LINES:N个顶点V0,V1,Vn-1每2个一组画线段,即V0-V1,V2-V3,共计画N/2条线。若N为奇数,则第N个点Vn-1每忽略。,直线的绘制,下面的代码在两个点(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指定奇数个顶点,那么最后一个顶点将会被

13、忽略。,折线,GL_LINE_STRIP:画一折线:V0-V1,V1-V2,V2-V3,Vn-2-Vn-1,共计N-1条线段。注意:(1)最后一点与第一点之间不连线,即不形成回路。但当最后一点与第一点之间重合时,显示效果等同于回路效果。(2)必须满足N1的条件,否则什么也画不出来。,折线例程,图元类型:GL_LINE_STRIPglBegin(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_L

14、INE_STRIP的唯一不同之处在于:GL_LINE_LOOP的最后一个顶点与第一个顶点之间进行连线共计N条线段形成回路。,封闭折线例程,图元类型:GL_LINE_LOOPglBegin(GL_LINE_ LOOP);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到2

15、55的值,它表示pattern参数中所规定的像素的重复次数,即patten参数中每一位能影响的像素数。pattern是画线操作时的一个样板。它是二进制的一个0和1序列,在这个序列中0表示不画点,1表示画点。,线型,如果启动点画线操作,线上的点由pattern决定是否绘制,即从Pattern的最低位开始,逐个绘制线段上面的点,如果式样用完后,线段还没有画完,可重新装入式样,上面所说的绘制是指当前颜色绘制该点。例如:glLineStipple(1,0 x3F07)0 x3F07转化为二进制为0011 1111 0000 0111。在画线操作时,首先开始的3个象素点绘制,接下来5个点不绘制,6个点绘

16、制,2个象素点不绘制。如果点画线的样板用完,将继续从头开始。又如:glLineStipple()中factor=2,那么pattern实际上就成为:00001111 11111111 00000000 00111111,则结果为6个象素点画,10个不画,12个画,4个象素点不画。启动点画线用glEnable(GL_LINE_STIPPLE)。关闭点画线用glDisable(GL_LINE_STIPPLE)。,线宽,可以在画线时使用glLineWidth(GLfloat width)来控制线的宽度。glLineWidth()函数用一个参数来指定要画的线以像素计的近似宽度,函数形式如下:glLin

17、eWidth(GLFloat width)此函数中,width0.0,缺省值width=1.0。,线宽,线宽和点的大小一样,不是所有线宽都支持,我们要确保指定的线宽是可用的。下面的代码可以获得线宽的范围和它们之间的最小间隔:GLfloat sizes 2;Glfloat step;GlGetFloatv(GL_LINE_WIDTH_RANGE,sizes);GlGetFloatv(GL_LINE_WIDTH_GRANULARITY,sizes数组包含两个元素,即为glLineWidth的最小有效值和最大有效值。另外,变量step用来保存线宽之间允许的最小增量。,多边形的绘制(6_5),多边形指

18、封闭曲线围成的区域。但OpenGL中的可以描述的多边形有两点限制:(1)多边形的边不能自相交,即边和边除了多边形的顶点外不可以相交。(2)多边形必须是凸多边形。这些限制是为特别需要设制的。首先所有的多边形都可以分割为多个凸多边形。限制多边形的类型容易实现硬件加速。在OpenGL中,多边形的绘制也是由函数gIBegin()和81End()来完成的。,多边形的绘制(6_5),最简单的多边形是三角形,它只有三条边。GL_TRIANGLES图元通过把三个顶点连接到一起而画出三角形。下面的代码可画出一个三角形,如图6.5所示。glBegin(GL_TRIANGLES);glVertex3f(0.0,0.

19、0,0.0);glVertex3f(25.0,25.0,0.0);glVertex3f(50.0,0.0,0.0);glEnd();,多边形,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)四边形应满足多边形的性质,为非凹多边形

20、。(2)如果N不是4的倍数,则将N除以4余下的顶点忽略(3)不同四边形的边可以相交。,连续三角形,GL_TRIANGLES_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的多边形是有前后面

21、的,显示时那一面朝向观测方向效果可能会不同,这一点可以用来剖视实体。缺省时,多边形的前后面以相同的形式给出。函数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:多边

22、形填充。,多边形的绘制方式,反转多边形面Void glFrontFace(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)

23、;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/5);glVertex2f(-2.0f/5,3.0f/5);glVertex2f(-3.0f/5,2.0f/5);glEnd();,图案填充(6_7),多边形可以是以多种方式填充的多边形,OpenGL提供了定义多边形的点画样式的函数g1Pol

24、ygonStipple(),下面具体介绍。g1PolygonStipple(glubyte*mask)参数说明:mask指向一个3232位图的指针。128个字节。另外的两个相关函数是:gIEnable(GL_POLYGON_STIPPLE)启动多边形点画式样。glDisable(GL_POLYGON_STIPPLE)关闭多边形点画式样。,Sierpinski衬垫(6_8),Sierpinski衬垫,void S_Gasket(float x1,float y1,float x2,float y2,float x3,float y3,int n)float x12,y12,x13,y13,x23

25、,y23;if(n0)x12=(x1+x2)/2;y12=(y1+y2)/2;x13=(x1+x3)/2;y13=(y1+y3)/2;x23=(x2+x3)/2;y23=(y2+y3)/2;S_Gasket(x1,y1,x12,y12,x13,y13,n-1);S_Gasket(x12,y12,x2,y2,x23,y23,n-1);S_Gasket(x13,y13,x23,y23,x3,y3,n-1);else triangle(x1,y1,x2,y2,x3,y3);,字符,OpenGL本身没有附带字体的支持。在OpenGL中可以使用其他方法来渲染字体,这里有两种方法:位图、画轮廓(多边形)在windows中可以使用windows API函数实现字符的绘制。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号