已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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)。 auxInitPosition(0,0,500,500)定义窗口的初始位置,前 两个参数(0,0)为窗口的左上角点的屏幕坐标,后两个参 数(500,500)为窗口的宽度和高度。 auxInitWindow(“AUX_SAMPLE“)是窗口初始化,字符 参数是窗口名称。 OpenGL的程序结构(6_1) auxReshapeFunc()和auxMainLoop(),参数都是一个 函数指针,指向的都是回调函数(回调函数定义用 CALLBACK说明)。 auxReshapeFunc()是窗口形状重定函数,参数指针指 向函数myReshape(),它的两个参数就是窗口的 新宽度和新高度。然后用glViewport(0,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(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,0.0)将视口背景 色清为黑色,如果不改变这种状态,视口背景色将一直 保持黑色。其他状态有: 模型变换 线及多边形的填充图案 多边形绘制模式 光源的位置及特性 被绘制物体的材质等 基于MFC的OpenGL编程(6_3) OpenGL辅助函数库提供了一些窗口和事件管理函数, 但提供的功能有限。而MFC却提供了大量对窗口和事件 管理和控制的函数。 图形操作描述 像素格式 图形操作描述 每一个Windows程序都必须设置设备描述表DC( Device Contexts),DC包含了窗口上显示图形的诸多 信息,例如:指定绘图模式、画笔和刷子的颜色。 OpenGL的Windows程序也必须使用DC。 OpenGL还必须处理专用的绘图描述表RC(Rendering Contexts),一个OpenGL应用程序必须创建一个绘图描 述表,然后启动它,最后在所定义的窗口内按常规方式 调用OpenGL函数绘图。 图形操作描述 首先得到设备描述表DC(设备上下文): m_pDC = new CClientDC(this); 创建绘图描述表/Create rendering content hrc = wglCreateContext(m_pDC-GetSafeHdc(); 图形操作描述 绘图: 设置一个线程的当前绘图描述表 wglMakeCurrent(m_pDC-GetSafeHdc(), hrc); DrawScene(); wglGetCurrentDC()得到当前设备描述表 SwapBuffers(wglGetCurrentDC(); 释放绘图描述表所使用的设备描述表 wglMakeCurrent(m_pDC-GetSafeHdc(), NULL); 像素格式 在创建一个绘图描述表之前,首先必须设置设备描述表 的像素格式,像素格式含有设备绘图界面的属性: 颜色模式(RGBA模式/颜色索引模式) 单/双缓冲区 颜色、深度、累加和模板缓冲区所用的位数 像素格式 PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR), / 该结构所占空间 1, / 版本号,当前为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_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) 功能:标记顶点序列的结束。 函数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(); 几何图元类型和说明 几何图元类型和说明 几何图元类型(6_4) 几何图元类型 GL_POINTS GL_LINESGL_LINE_STRIPGL_LINE_LOOP GL_POLYGONGL_QUADSGL_QUAD_STRIP GL_TRIANGLESGL_TRIANGLE_STRIP GL_TRIANGLE_FAN 几何图元类型 点 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) glVertex3f(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每忽略。 直线的绘制 下面的代码在两个点(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)最后一点与第一点之间不连线,即不形成回路。但 当最后一点与第一点之间重合时,显示效果等同于回路 效果。 (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_ LOOP); glVertex3f(0.0,0.0,0.0); glVertex3f(50.0,50.0,0.0); glVertex3f(100.0,100.0,0.0); glEnd( ); x y x y P0(0,0,0) P1(50,50,0) P2(50,100,0) P0(0,0,0) P1(50,50,0) P2(50,100,0) 线型 (6_6) 为了使用点画线,必须用以下指令先启动点画线模式。 void glLineStipple (GLint factor,GLushort pattern); 此命令有以下参数: factor是一个从1到255的值,它表示pattern参数中所规定的像 素的重复次数,即patten参数中每一位能影响的像素数。 pattern是画线操作时的一个样板。它是二进制的一个0和1序列 ,在这个序列中0表示不画点,1表示画点。 线型 如果启动点画线操作,线上的点由pattern决定是否绘制,即从Pattern的最低位开始 ,逐个绘制线段上面的点,如果式样用完后,线段还没有画完,可重新装入式样, 上面所说的绘制是指当前颜色绘制该点。 例如:glLineStipple (1,0x3F07) 0x3F07转化为二进制为0011 1111 0000 0111。在画线操作时,首先开始的3个象素 点绘制,接下来5个点不绘制,6个点绘制,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()函数用一个参数来指定要画的线以像 素计的近似宽度,函数形式如下: glLineWidth(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) 多边形指封闭曲线围成的区域。但OpenGL中的可以描述的多边形有两 点限制: (1)多边形的边不能自相交,即边和边除了多边形的顶点外不可以相 交。 (2)多边形必须是凸多边形。 这些限制是为特别需要设制的。首先所有的多边形都可以分割为多个 凸多边形。限制多边形的类型容易实现硬件加速。 在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( ); P0P2 P3 y x O 多边形 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_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的多边形是有前后面的,显示时那一面朝向观测方向效果可能 会不同,这一点可以用来剖视实体。缺省时,多边形的前后面以相同的 形式给出。 函数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(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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年中国气候说课稿
- 2025-2026学年八年级轴对称图形说课稿
- 2025-2026学年地下农场歌说课稿
- 化工总控工操作技能水平考核试卷含答案
- 聚苯乙烯装置操作工班组建设竞赛考核试卷含答案
- 海底管道防腐工岗前内部控制考核试卷含答案
- 矿热电炉熔炼工安全意识强化考核试卷含答案
- 2025-2026学年合作游说课稿
- 搪瓷瓷釉制作工班组协作水平考核试卷含答案
- 2025-2026学年吃健康食品说课稿
- 小学二年级道德与法治统编版上册《欢欢喜喜庆国庆》教学设计
- 科瑞智库:2026汉诺威国际车展全景洞察与趋势研判报告
- 【《均值不等式在初等数学中的应用研究》6500字(论文)】
- 2026年地产运营AI 解决方案合同
- 邀请招标文件
- 学史方法(一)如何建立历史的纵向联系 课件(内嵌视频 )2025-2026学年统编版八年级历史下册
- GB/T 47111-2026公园城市建设评价指南
- 船厂看火监护制度规范
- 手术消毒铺单知识
- 2025年文山州遴选公务员笔试真题汇编带答案解析
- 铁路线路起道作业课件
评论
0/150
提交评论