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

上传人:xin****828 文档编号:7285001 上传时间:2020-03-18 格式:PPT 页数:46 大小:200KB
返回 下载 相关 举报
计算机图形学第六章OpenGL基本图元的绘制.ppt_第1页
第1页 / 共46页
计算机图形学第六章OpenGL基本图元的绘制.ppt_第2页
第2页 / 共46页
计算机图形学第六章OpenGL基本图元的绘制.ppt_第3页
第3页 / 共46页
点击查看更多>>
资源描述
Lecture6OpenGL基本图元的绘制 概述 图元的种类 点 线段 多边形 矩形 OpenGL中所有的实体最终都可采用一系列有序的顶点描述 二维图形是三维图形的特殊情况 z分量为0 在三维顶点绘制指令中 如果用户设定二维坐标 x y OpenGL就会自动令z 0OpenGL提供的描述点 线 多边形的绘制机制 必须通过glBegin 和glEnd 函数配对来完成 OpenGL的程序结构 6 1 auxInitDisplayMode AUX SINGLE AUX RGBA 设置窗口显示模式为RGBA方式 即彩色方式 并且图形缓存为单缓存 SINGLEBUFFER 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 voidCALLBACKReshape GLsizeiwidth GLsizeiheight glViewport 0 0 width height auxReshapeFunc myReshape 窗口形状重定函数 参数指针指向函数myReshape 它的两个参数就是窗口的新宽度和新高度 auxInitPosition 0 0 500 500 初始化显示窗口的大小 AUX库显示坐标范围 如果使用auxReshapeFunc myReshape 设定了窗口形状重定函数 则显示窗口的坐标范围为 1 1 其绘图像的过程是把 1 1范围的坐标点映射到屏幕坐标 如果未使用auxReshapeFunc myReshape 设定窗口形状重定函数 则显示窗口的坐标范围为实际窗口的尺寸 OpenGL的状态机制 OpenGL的绘图方式是由一系列的状态决定的 如果设置了一种状态或模式而不改变它 OpenGL在绘图的过程中将一直保持这种状态或模式 例如 Voidmyinit 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 DeviceContexts DC包含了窗口上显示图形的诸多信息 例如 指定绘图模式 画笔和刷子的颜色 OpenGL的Windows程序也必须使用DC OpenGL还必须处理专用的绘图描述表RC RenderingContexts 一个OpenGL应用程序必须创建一个绘图描述表 然后启动它 最后在所定义的窗口内按常规方式调用OpenGL函数绘图 图形操作描述 首先得到设备描述表DC 设备上下文 m pDC newCClientDC this 创建绘图描述表 Createrenderingcontenthrc wglCreateContext m pDC GetSafeHdc 图形操作描述 绘图 设置一个线程的当前绘图描述表wglMakeCurrent m pDC GetSafeHdc hrc DrawScene wglGetCurrentDC 得到当前设备描述表SwapBuffers wglGetCurrentDC 释放绘图描述表所使用的设备描述表wglMakeCurrent m pDC GetSafeHdc NULL 像素格式 在创建一个绘图描述表之前 首先必须设置设备描述表的像素格式 像素格式含有设备绘图界面的属性 颜色模式 RGBA模式 颜色索引模式 单 双缓冲区颜色 深度 累加和模板缓冲区所用的位数 像素格式 PIXELFORMATDESCRIPTORpfd sizeof PIXELFORMATDESCRIPTOR 该结构所占空间1 版本号 当前为1PFD DRAW TO WINDOW 支持windows的屏幕绘图PFD SUPPORT OPENGL 支持OpenGLPFD 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 忽略覆盖层的屏蔽 像素格式 设定像素格式后 进行如下的操作 intpixelformat m pDC newCClientDC this 使用设备描述表选择一个像素格式pixelformat ChoosePixelFormat m pDC GetSafeHdc 定义顶点序列 voidglBegin GLenummode 功能 描述一个几何图元顶点序列的开始 参数说明 mode 指出图元的类型 voidglEnd void 功能 标记顶点序列的结束 函数glVertex 可定义一个点 定义顶点序列 例如 绘制一个多边形边界 POLYGON glBegin GL POLYGON glVertex2f 0 0 0 0 Vertex0givedex2f 0 0 3 0 Vertex1glVedex2f 3 0 3 0 Vertex2alVenex2f 4 0 1 5 Vertex3givedex2f 3 0 0 0 Vertex4glVertex2f 0 0 0 0 Vertex0glEnd 几何图元类型和说明 几何图元类型和说明 几何图元类型 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 glVertex 2 3 4 sifd V TYPEcoords 参数说明 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 修改这个值 以设定点的大小 voidglPointsize GLfloatsize 直线 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 必须满足N 1的条件 否则什么也画不出来 折线例程 图元类型 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 LINE 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 为了使用点画线 必须用以下指令先启动点画线模式 voidglLineStipple GLintfactor GLushortpattern 此命令有以下参数 factor是一个从1到255的值 它表示pattern参数中所规定的像素的重复次数 即patten参数中每一位能影响的像素数 pattern是画线操作时的一个样板 它是二进制的一个0和1序列 在这个序列中0表示不画点 1表示画点 线型 如果启动点画线操作 线上的点由pattern决定是否绘制 即从Pattern的最低位开始 逐个绘制线段上面的点 如果式样用完后 线段还没有画完 可重新装入式样 上面所说的绘制是指当前颜色绘制该点 例如 glLineStipple 1 0 x3F07 0 x3F07转化为二进制为0011111100000111 在画线操作时 首先开始的3个象素点绘制 接下来5个点不绘制 6个点绘制 2个象素点不绘制 如果点画线的样板用完 将继续从头开始 又如 glLineStipple 中factor 2 那么pattern实际上就成为 00001111111111110000000000111111 则结果为6个象素点画 10个不画 12个画 4个象素点不画 启动点画线用glEnable GL LINE STIPPLE 关闭点画线用glDisable GL LINE STIPPLE 线宽 可以在画线时使用glLineWidth GLfloatwidth 来控制线的宽度 glLineWidth 函数用一个参数来指定要画的线以像素计的近似宽度 函数形式如下 glLineWidth GLFloatwidth 此函数中 width 0 0 缺省值width 1 0 线宽 线宽和点的大小一样 不是所有线宽都支持 我们要确保指定的线宽是可用的 下面的代码可以获得线宽的范围和它们之间的最小间隔 GLfloatsizes 2 Glfloatstep 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 多边形 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用来控制多边形的属性 包括前后面的控制以及多边形究竟是填充型 轮廓型还是顶点 VoidglPolygonMode GLenumface GLenummode 参数face可选常量为GL FRONT AND BACK GL FRONT GL BACK 通常规定顶点逆时针排列的面朝前 Mode控制多边形的光栅化方法 可用的参数为GL POINT GL LINE GL FILL GL POINT 仅绘制顶点 GL LINE 仅绘制轮廓 GL FILL 多边形填充 多边形的绘制方式 反转多边形面VoidglFrontFace GLenummode 该函数用于确定多边形那一面朝前 Mode GL 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 5 glVertex2f 2 0f 5 3 0f 5 glVertex2f 3 0f 5 2 0f 5 glEnd 图案填充 6 7 多边形可以是以多种方式填充的多边形 OpenGL提供了定义多边形的点画样式的函数g1PolygonStipple 下面具体介绍 g1PolygonStipple glubyte mask 参数说明 mask指向一个32 32位图的指针 128个字节 另外的两个相关函数是 gIEnable GL POLYGON STIPPLE 启动多边形点画式样 glDisable GL POLYGON STIPPLE 关闭多边形点画式样 Sierpinski衬垫 6 8 Sierpinski衬垫 voidS Gasket floatx1 floaty1 floatx2 floaty2 floatx3 floaty3 intn floatx12 y12 x13 y13 x23 y23 if n 0 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中可以使用windowsAPI函数实现字符的绘制
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!