1、显示列表显示列表求值器求值器顶点操作顶点操作光栅化光栅化逐个象素操作逐个象素操作帧缓冲帧缓冲纹理纹理CPU后象素处理后象素处理顶点变换与光照计算纹理映射帧缓冲区操作像素级光照计算OpenGL其他高级课题混合深度测试抖动逻辑操作裁剪测试模板测试Alpha测试象素帧缓冲区透明度的度量 模拟透明物体 玻璃、水等 合成图像 反走样 混合状态下有效 glEnable( GL_BLEND );基于alpha值选择象素 glAlphaFunc( func, value ) glEnable( GL_ALPHA_TEST );在纹理映射时用alpha值作为蒙板结合输出与帧缓冲器中原有的象素值glBlendFu
2、nc( src, dst )混合方程pfrCdstCsrcC其他的裁剪测试 glScissor( x, y, w, h )包围盒外的象素被裁剪掉便于更新视域的一小块区域 影响glClear()操作用模板缓冲区的值控制绘制 无法通过模板测试的象素将不被绘制 例子:在模板缓冲区中创建一个蒙板,并仅绘制那些不在蒙板区域内的物体glStencilFunc( func, ref, mask ) 用func比较缓冲区的值与 ref 只对那些mask值为1的象素进行操作 func 是一个标准比较函数glStencilOp( fail(模板失败), zfail(模板通过,z失败), zpass(两者都通过)
3、) 基于模板测试和深度测试的结果相应调整模板缓冲区的值: GL_KEEP, GL_INCRglInitDisplayMode( |GLUT_STENCIL| );glEnable( GL_STENCIL_TEST );glClearStencil( 0 x0 );glStencilFunc( GL_ALWAYS, 0 x1, 0 x1 );glStencilOp( GL_REPLACE, GL_REPLACE, GL_REPLACE );绘制蒙板当stencil = 1绘制物体glStencilFunc( GL_EQUAL, 0 x1, 0 x1 )当stencil != 1绘制 glSten
4、cilFunc( GL_NOTEQUAL, 0 x1, 0 x1 ); glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); glEnable( GL_DITHER );抖动用于加强视觉效果 用于模拟更多颜色打印设置目前,该功能很少被用到使用位逻辑操作结合多个象素值 glLogicOp( mode );命令模式 GL_XOR GL_AND目前,该功能很少被用到目前,该功能很少被用到颜色缓冲器合成的问题 有限颜色分辨率 截断 精度损失 累积缓冲区扮演着“浮点”颜色缓冲区的角色 合成到积累缓冲区 将结果转换到帧缓冲区glAccum( op, value ) 操作 在积
5、累缓冲区中的操作: GL_ADD, GL_MULT 读缓冲区操作: GL_ACCUM, GL_LOAD 写缓冲区操作: GL_RETURN glAccum(GL_ACCUM, 0.5)将写缓冲区的每一个值乘以0.5,然后加到累积缓冲区中颜色合成:透明全屏反走样:A-buffer算法景深:Depth Cue滤波:运动模糊: Motion blur消除锯齿状glEnable( mode ) GL_POINT_SMOOTH GL_LINE_SMOOTH GL_POLYGON_SMOOTH 象素的Alpha值由象素被覆盖大小决定 可以是RGBA或颜色索引模式当我们略微移动视点时,图像随之平移 每一幅图
6、像有不同的走样情况 用积累缓冲区对图像作平均,将消除这些走样沿平行焦平面的方向移动视点前平面后平面焦平面眼睛位置1眼睛位置2景深景深glFogif( property, value )景深效果处理 指定线性雾化渐变区域大小 GL_FOG_LINEAR环境效果 模拟真实雾化效果 GL_FOG_EXP GL_FOG_EXP2成像子集 只有当GL_ARB_imaging有定义时才有效 颜色矩阵 卷积 颜色表 直方图 MinMax 高级混合立即模式(immediate mode) 图元直接发送到绘制流水线并显示 不需要显卡内存显示列表(display list) 图元保存在显示列表中、显示列表保存在显
7、卡中保留模式(retained mode) 所有数据预先置入显存立即模式列出显示显示显示列表列表多项式多项式求值器求值器顶点操作顶点操作和和图元组装图元组装光栅化光栅化象素象素操作操作纹理纹理内存内存CPU象素象素操作操作帧帧缓冲缓冲创建显示列表GLuint id;void init( void ) id = glGenLists( 1 ); glNewList( id, GL_COMPILE ); /* other OpenGL routines */ glEndList();调用显示列表void display( void ) glCallList( id );不是所有的OpenGL程序都
8、能存储在显示列表当中显示列表创建后,状态仍然能够被改变显示列表可以嵌套调用显示列表一旦创建,不能进行编辑 令列表(A) 调用其他列表(B, C, 或D) 删除A并按照要求调用B, C或D考虑一个汽车模型 创建底盘显示列表 创建轮胎显示列表glNewList( CAR, GL_COMPILE );glCallList( CHASSIS );glTranslatef( );glCallList( WHEEL );glTranslatef( );glCallList( WHEEL );glEndList();将顶点、颜色数组一次性送至显存处理glVertexPointer( 3, GL_FLOAT,
9、 0, coords )glColorPointer( 4, GL_FLOAT, 0, colors )glEnableClientState( GL_VERTEX_ARRAY )glEnableClientState( GL_COLOR_ARRAY )glDrawArrays( GL_TRIANGLE_STRIP, 0, numVerts );所有有效数组被用于绘制ColordataVertexdata比直接绘制模式效率更高显示列表可以在多个OpenGL操作描述表之间共享,降低内存要求顶点数组便于内存访问的方式组织数据D3D和最近的OpenGL支持保留模式Bernstein 多项式求值器 G
10、LU NURBS(Non-Uniform Rational B-Splines,非均匀有理B样条)的基础GLU二次曲面物体 球面 圆柱(或圆锥) 圆盘(或圆)未绘制的光栅化后的顶点数据返回应用程序 确定哪些图元最终被绘制到屏幕上需要指定反馈缓冲区glFeedbackBuffer( size, type, buffer )选择绘制反馈模式 glRenderMode( GL_FEEDBACK );决定哪些图元在视域当中需要一个缓冲区放置返回结果选择绘制的选择模式 glRenderMode( GL_SELECT )用名字区别各个图元 “名字”用整数而非字符串表示名字建立在堆上 允许层次化图元名字选择
11、程序 glLoadName( name ) glPushName( name ) glInitNames()拾取是选择的特殊情况编程步骤 限制鼠标周围的一小块区域为当前绘制区域在投影矩阵上使用gluPickMatrix() 进入选择模式; 重绘屏幕 被视见体裁剪的每个图元引起一个选择命中 退出选择模式; 分析命中记录纹理映射的基本原理凹凸纹理映射(bump mapping)位移映射(displacement mapping)环境纹理映射(environment mapping)基于光照映射的快速绘制(light mapping)高级纹理映射技术总结将一个一维、二维、三维的图像映射到几何物体上的
12、过程纹理映射的用途 仿真自然界的材质 减少几何复杂度 图像warping 反射效果模拟 。stxyz图像:即纹理几何屏幕图像和几何在不同的管道中处理,最后在光栅处理器中融合。 复杂的纹理不影响几何的复杂性。几何管道顶点象素管道图像光栅处理器256 x 256的图像映射到 一个长方形,并进行透视投影。 二维纹理图像 纹理坐标 纹理映射到三维空间中平面 三步设置纹理读入或者生成图像将图像赋到某个纹理上打开纹理映射功能将纹理坐标赋到顶点上设置纹理参数 Wrapping(重复pattern的方式), filtering(纹理采样的滤波方式):类似于纹理图像序列的显示列表(可加快速度) 每个纹理对象对应
13、一个图像 可以由多个图形上下文共享生成纹理名字glGenTextures( n, *texIds );绑定纹理图像(id为纹理对象名字)glBindTexture( target, id );从CPU内存的一块图像定义一个纹理对象glTexImage2D( target, level, components, w, h, border, format, type, *texels ); 图像的尺寸是 2的幂次纹理颜色由象素处理管道处理如果图像的维数不是2的幂次 gluScaleImage( format, w_in, h_in, type_in, *data_in, w_out, h_out,
14、 type_out, *data_out ); *_in 源图像源图像 *_out 目标图像目标图像 Format:图像格式(图像格式(GL_RGB) Type:图像数据格式图像数据格式在缩放过程中进行插值和滤波将帧缓冲器的内容设定为纹理图像的来源设置某个纹理的一部分拷贝部分纹理 glCopyTexSubImage2D(.)基于参数化的纹理坐标glTexCoord*() 指定每个顶点处的纹理st1, 10, 10, 01, 0(s, t) = (0.2, 0.8)(0.4, 0.2)(0.8, 0.4)ABCabc纹理空间物体空间纹理映射区域通常是平面或曲面,计算任意空间曲面与纹理域的对应关系
15、本质上是一个参数化的过程 避免出现扭曲、变形的效果 最好是保角映射或保面积映射平面方程数学曲面物体表面属性 过程式纹理函数生成自动生成纹理坐标 glTexGenifdv()指定一个平面 基于到平面的距离生成纹理坐标生成模式 GL_OBJECT_LINEAR GL_EYE_LINEAR GL_SPHERE_MAP0DCzByAx纹理滤波模式 缩小或放大时的滤波方式 mipmap 缩小滤波纹理取址方式 Clamping(边界颜色) repeating(重复)纹理融合函数 如何混合纹理的颜色与物体表面计算的颜色: 融合,modulate 或者替换纹理多边形放大时缩小多边形纹理例如:Mipmap 允许
16、对一个纹理进行预处理,生成小尺寸纹理对于小的物体,能减少插值错误,加快绘制速度Mipmap由OpenGL自动生成可以在定义纹理的时候声明mipmap层次GLU mipmap 生成函数OpenGL 1.2 引入了高级的 LOD(层次细节) 控制纹理插值模式函数使用例子:glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP )glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT )(上左)重复;(上右)镜像;(下左)截断;(下右)重复边界颜色 控制纹理是如何映射到物
17、体上 glTexEnvfiv( GL_TEXTURE_ENV, prop, param ) GL_TEXTURE_ENV_MODE 模式: GL_MODULATE GL_BLEND GL_DECAL(GL_REPLACE)设置混合颜色: GL_TEXTURE_ENV_COLORDemo: MFCTex对同一个物体实施多步光照明计算和多个纹理映射,这就是三维绘制引擎中的多步纹理技术(multipass texture mapping)两步绘制: 计算漫射分量并与纹理相乘 计算镜面分量并与第一步计算结果相加。 在每一步中,纹理值可以和其他光照明分量进行多种融合操作,包括替代、相加、混合等。alph
18、a通道扮演了一个远远超过透明度的角色。第1到第4步:累积凹凸映射;第5步:漫射光分量;第6步:基纹理;第7步:镜面光分量(可选);第8步:自身发射光分量(可选);第9步:体/雾/大气效果(可选);第10步:屏幕闪烁(可选)。在单个绘制步骤中应用两个或多个纹理:单步多纹理映射技术(multi-texture mapping)。定义由一系列纹理步骤组成的纹理融合嵌套流水线。通常,第一个纹理步骤融合两个纹理值(或者插值后的顶点值)的RGB和alpha分量。其结果送入第二个步骤与其他的纹理值(或者插值后的顶点值)进行处理,直到完成所有的纹理步骤,最后与保存在帧缓冲器中的值进行融合或替代操作。可编程图形硬件可以处理8个纹理的同时融合 步 数速 度显 卡 支 持优 点缺 点多步纹理映射多步慢全部步骤无限制完成功能有限单步多纹理映射 单步快部分可完成多种功能单步内纹理映射数有限