opengl编程指南002状态管理和绘制几何物体

上传人:pu****.1 文档编号:471824218 上传时间:2024-03-08 格式:DOC 页数:6 大小:33KB
返回 下载 相关 举报
opengl编程指南002状态管理和绘制几何物体_第1页
第1页 / 共6页
opengl编程指南002状态管理和绘制几何物体_第2页
第2页 / 共6页
opengl编程指南002状态管理和绘制几何物体_第3页
第3页 / 共6页
opengl编程指南002状态管理和绘制几何物体_第4页
第4页 / 共6页
opengl编程指南002状态管理和绘制几何物体_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《opengl编程指南002状态管理和绘制几何物体》由会员分享,可在线阅读,更多相关《opengl编程指南002状态管理和绘制几何物体(6页珍藏版)》请在金锄头文库上搜索。

1、第二章状态管理和绘制几何物体绘图工具箱清除窗口在计算机中,保存图片的内存通常被计算机所绘制的前一幅图像所填满,因此在绘制新场景之前需要把它清除为某种背景颜色。至于应该使用那种背景颜色,则取决于应用程序本身。我们还必须知道像素颜色是如何存储在称为位平面的图形硬件中的。存储的方式有两种:可以把像素颜色的红、绿、蓝和alpha值直接存储在位平面中;或者可以存储一个颜色索引值,用它来引用颜色查找表中的一个项目。RGBA颜色显示模式更常用一些。例如,下面这两行代码把一个RGBA模式的窗口清除为黑色:glClearColor(0.0,0.0,0.0,0.0);glClear(GL_COLOR_BUFFER

2、_BIT);第一行代码把清除颜色设置为黑色,第二行代码把整个窗口清除为当前的清除颜色GL_COLOR_BUFFER_BIT清除颜色缓冲区GL_DEPTH_BUFFER_BIT清除深度缓冲区GL_ACCUM_BUFFER_BIT清除累积缓冲区GL_STENCIL_BUFFER_BIT清除模版缓冲区制定颜色一般而言,OpenGL程序员首先设置颜色或颜色方案,然后再绘制物体。为了设置颜色,可以使用glColor3f()函数。它接受三个参数,它们都是范围在0.0到1.0之间的浮点数,分别表示颜色的红、绿和蓝的成分。glColor3f(0.0,0.0,0.0)黑色glColor3f(1.0,0.0,0.

3、0)红色glColor3f(0.0,1.0,0.0)绿色glColor3f(1.0,1.0,0.0)黄色glColor3f(0.0,0.0,1.0)蓝色glColor3f(1.0,0.0,1.0)洋红色glColor3f(0.0,1.0,1.0)青色glColor3f(1.0,1.0,1.0)白色强制完成绘图操作glFlush()函数,完成强制绘图操作坐标系统工具箱无论是刚打开窗口的时候,还是在以后移动窗口或者改变窗口大小的时候,窗口系统都会发送一个事件来通知你。如果使用的是GLUT,它会自动产生通知,并且在glutReshapeFunc()中注册的那个函数将会被调用。必须注册一个回调函数,完

4、成下列这些任务:重新建立一个矩形区域,把它作为新的渲染画布定义一个用于绘制物体的坐标系统void reshape(int w,int h)glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);在系统内部,GLUT向这个函数传递两个参数:width和height,它们表示这个新的(或经过移动的,或改变大小的)窗口的宽度和高度(以像素为单位)。glViewport()函数调整用于绘图的像素矩形,使它占

5、据整个新窗口。接下来的3行代码调整用于绘图的坐标系统,使左下角的坐标是(0,0),右上角的坐标是(w,h)描述点、直线和多边形点点可以用一组称为顶点的浮点数来表示直线直线这个术语表示一段线段,而不是数学意义上在两边无限延伸的直线多边形多边形是由单闭合的线段循环包围的区域矩形OpenGL提供了填充矩形图元函数glRect*()指定顶点在OpenGL中,所有的几何物体最终都被描述成一组有序的顶点。可以使用glVertex*()函数来指定顶点。OpenGL几何绘图图元把一组顶点放在一对glBegin()和glEnd()之间,传递给glBegin()的参数决定了由这些顶点所构建的几何图元的类型GL_P

6、OINTS单个的点GL_LINES 一对顶点被解释为一条直线段GL_LINE_STRIP 一系列的连接直线段GL_LINE_LOOP 和上面相同,但第一个顶点和最后一个顶点彼此相连GL_TRIANGLES 三个顶点被解释为一个三角形GL_TRIANGLE_STRIP 三角形的连接串GL_TRIANGLE_FAN 连接成扇形的三角形系列GL_QUADS 四个顶点被解释为一个四边形GL_QUAD_STRIP 四边形的连接串GL_POLYGON 一个简单的凸多边形的边界使用glBegin()和glEnd()的限制glVertex*() 设置顶点坐标glColor*()设置RGBA颜色glIndex*

7、() 设置颜色索引glSecondaryColor*() 设置纹理应用后的辅助颜色glNormal*() 设置法线向量坐标glMaterial*()设置材料属性glFogCoord*()设置雾坐标glTexCoord*()设置纹理坐标glMultiTexCoord*()为多重纹理设置纹理坐标glEdgeFlag*() 控制边界的绘制glArrayElement() 提取顶点数组数据glEvalCoord*(),glEvalPoint*() 生成坐标glCallList(),glCallLists() 执行显示列表基本状态管理器OpenGL维护许多状态和状态变量,物体在进行渲染时可能会使用光照、

8、纹理、隐藏表面消除、勿以及其他影响物体外观的状态。在默认情况下,这些状态的大部分一开始是处于不活动状态的。激动这些状态可能会有较大的开销。但是,图像的指向可以得到明显程度的提高,看上去更有真实感,这归功于增强的图形功能。为了打开或者关闭这些状态,可以使用下面这两个简单的函数:Void glEnable(GLenum cap);Void glDisable(GLenum cap);还可以查询一个状态当前是处于打开还是关闭状态GLboolean glIsEnabled(GLenum capability)根据被查询的状态当前处于启动还是禁用状态,返回GL_TRUE或GL_FALSE显示点、直线和多

9、边形点的细节为了控制被渲染的点的大小,可以使用glPointSize()函数,并在参数中提供一个值,表示所希望的点的大小(以像素作为参数)直线的细节直线的宽度glLineWidth()用于设置直线的宽度,width参数必须大于0.0,在默认情况下是1.0点画线为了窗机爱你点画线,可以使用glLineStipple()函数定义点画线模式,然后用glEnable()函数启用直线点画线功能:glLineStipple(1,0x3F07);glEnable(GL_LINE_STIPPLE);此例中,模式为0x3F07(二进制形式为0011111100000111),它所画出来的直线是这样的:先是连续绘

10、制3个像素,然后连续5个像素留空,然后再连续绘制6个像素,最后2个像素留空(注意,首先开始的是低位)。如果前一个参数不是1而是2,那么这个模式便扩展为:绘制6个像素,留空10个像素,绘制12个像素和留空4个像素多边形的细节多边形具有两个面:正面和背面。取决于哪一面将面对观察者,它们可能会被渲染成不同的样子。这使观察者能够获得实心物体正反两面截然不同的剖面视图。在默认情况下,多边形的正面和背面是按照相同的方式绘制的。为了更改这个行为,或者只绘制它的轮廓或顶点,可以使用glPolygonMode()函数。void glPolygonMode(GLenum face,GLenum mode);控制一

11、个多边形的正面和背面的绘图模式,face参数可以是GL_FRONT_AND_BACK、GL_FRONT或GL_BACK。mode参数可以是GL_POINT、GL_LINE或GL_FILL,表示多边形应该被画成点、轮廓还是填充形式。在默认情况下,多边形的正面和背面都被画成填充形式。例如,可以通过下面这两个函数调用,把正面画成填充形式,把背面画成轮廓形式:glPolygonMode(GL_FRONT,GL_FILL);glPolygonMode(GL_BACK,GL_LINE);按照约定,顶点以逆时针顺序出现在屏幕上的多边形称为“正面”可以使用glFrontFace()函数,交换OpenGL的正面

12、和背面的概念。glCullFace()函数的功能为剔除,其参数为GL_BACK、GL_FRONT或者GL_FRONT_AND_BACK。同时调用参数为GL_CULL_FACE的glEnable()函数点画多边形在默认情况下,填充多边形是一种实心模式绘制的。此外,它们还可以使用一种32位*32位的窗口对齐的点画模式。可以使用glPolygonStipple()函数指定多边形点画模式。除了定义当前多边形点画模式外,还必须启用多边形点画功能:glEnable(GL_POLYGON_STIOOLE);标记多边形的边界边OpenGL只能够渲染凸多边形,因此,为了绘制凹多边形,通常将它们分解成几个凸多边形

13、。这其中,就涉及到了边界边绘制的问题。此时,可以使用glEdgeFlag*()函数手工控制边界标志。接受两个参数,GL_TRUE则该点为边界边的起点,GL_FALSE则改点不是边界边的起点。法线向量glNormal*()函数,把当前的法线设置为这个函数的参数所传递的值。glVertex*()函数的调用就把当前法线向量分配给它所指定的顶点。每个顶点常常具有不同的法线,因此需要交替调用这两个函数。由于法线向量只表示方向,因此它的长度是无关紧要的。可以把法线指定为任意长度,但在执行光照计算之前,它的长度会边转换为1.让OpenGL自动对法线向量进行规范化,可以调用glEnable(GL_NORMAL

14、IZE)如果提供了单位长度的法线,并且只进行了均匀的缩放,可以使用glEnable(GL_RESCALE_NORMAL)用一个i额常量因子对法线进行缩放,使它在变换之后恢复到单位长度。后者比前者开销小顶点数组使用顶点数组对几何图形进行渲染需要3个步骤:1. 激活(启用)最多可达8个的数组,每个用于存储不同类型的数据:顶点坐标、表面法线、RGBA颜色、辅助颜色、颜色索引、雾坐标、纹理坐标以及多边形的边界坐标。2. 把数据放入数组中。数组是通过指向它们的内存位置的指针进行访问的。在客户机-服务器模型中,数据存储在客户机的地址空间中。3. 用这些数据绘制几何图形。OpenGL通过对指针进行解引用,从

15、所有被激活的数组中获取数据。在客户机-服务器模型中,数据被传输到服务器的地址空间中。有3种方式可以完成这个任务:访问单独的数组元素(随机存取)创建一个单独数组元素的列表(系统存取)线性地处理数组元素步骤1:启用数组第一个步骤是调用glEnableClientState()函数,激活被选择的数组。该函数可以接受如下八个参数:GL_VERTEX_ARRAY、GL_COLOR_ARRAY、GL_SECONDARY_COLOR_ARRAY、GL_INDEX_ARRAY、GL_NORMAL_ARRAY、GL_FOG_COORDINATE_ARRAY、GL_TEXTURE_COORD_ARRAY和GL_EDGE_FLAG_ARRAY步骤2:指定数组的数据我们可以通过一种简单的方法,用一条命令指定客户空间中的一个数组。共有8个不同的函数可以用来指定数组,每个函数用于指定一个不同类型的数组。另外,还有一个函数可以一次指定客户空间的几个数组,它们均来源于一个混合数组。glVertexPointer()、gl*Pointer()例子为varray.cpp步骤3:解引用和渲染、

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 机械/制造/汽车 > 工业自动化

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号