




已阅读5页,还剩40页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章混合、反走样、雾化效果,学习目标:,掌握颜色混合的方法掌握反走样技术掌握雾化效果的实现掌握真实感效果场景的创建方法,9.1混合,这一章主要讲述OpenGL的三个特殊效果处理:混合、反走样和雾化。如果能很好地运用这些特殊效果,那么会发现其中有无数的奥秘,将用它们构造出千变万化的图形世界来。例如:透明的玻璃窗,半透明的紫色水晶,光滑的地板,五彩的肥皂泡,雾化的场景等等。同时,本章还简单介绍一下有关的图形学概念。Alpha值在前面几章中已经提到过,但是几乎所有例程都将它设置为1.0,没有详细讨论它为其它值时的情况。融合,是本章的重点,它是透明技术、数字合成和计算机绘画技术的核心。固名思义,融合就是指两种颜色各分量依据一定的比例混在一起合二为一。而这种比例就来源于Alpha值,即RGBA中的A或(r、g、b、a)中的a值,通常称a为不透明性,称(1-a)为透明性。因为在颜色表方式下不能说明a值,因此融合操作不能在颜色表方式下进行。,9.1.1源因子和目标因子,在OpenGL的融合操作中,实际上包含了两个因子的操作,这两个因子就是源因子(SourceFactor)和目的因子(DestinationFactor)。从数学的角度来看,设源因子和目的因子分别为(Sr、Sg、Sb、Sa)与(Dr、Dg、Db、Da),则融合的最终结果是:(Rs*Sr+Rd*Dr,Gs*Sg+Gd*Dg,Bs*Sb+Bd*Db,As*Sa+Ad*Da),并且其中每个元素值都约简到0,1之间。在OpenGL中,由函数gjBlendFunc()来产生这两个融合因子的值。其函数形式为:voidglBlendFunc(GLenumsfactor,GLenumdfactor)控制源因子和目的因子的结合。参数sfactor指明怎样计算源因子,dfactor指明怎样计算目的因子。这些参数的可能值见表15-1所示。注意:融合因子的值在0,1范围内,且两因子结合后也要约简到0,1内,源与目的的RGBA值分别带有s和d下标。,示例程序9-1Alpha二维融合例程,将alpha值做适当修改,看看设置较大或较小的值对运行效果的影响。,学生任务,9.1.2混合的简单使用,对于混合因子和目标混合因子,并不是所有的组合都是合理的。绝大多数应用程序只使用其中一小部分组合方式。下面各个段落描述了源混合因子和目标混合因子的各种组合方式的典型用途。有些例子只使用新片断的alpha值,因此它们在帧缓冲区不存储alpha值的情况下依然可行。注意,常常可以使用多种方式来实现相同的效果。,如果想绘制一幅这样的图:它的一半来自一幅图像,另一半来自另一幅图像,他们以相同的数量混合在一起。为此,可以把源混合因子设置为GL_ONE,把目标混合因子设置为GL_ZERO,并首先绘制第一幅图像。然后,把源混合因子设置为GL_SRC_ALPHA,把目标混合因子设置为GL_ONE_MINUS_SRC_ALPHA,并用0.5的alpha值绘制第二幅图像。混合因子的这种用法可以说代表了最常用的混合操作。如果需要把第一幅图像的75%与第二幅图像25%进行混合,我们仍然按上面的方法绘制第一幅图像,然后用0.25的alpha值绘制第二幅图像。,为了以相同的比例混合3幅不同的图像,可以把目标混合因子设置为GL_ONE,把源混合因子设置为GL_SRC_ALPHA。用0.333333的alpha值绘制每幅图像。使用这种技巧,每幅图像的亮度是它原来的1/3。在图像并不重叠的地方,还是比较容易注意到这个效果。,假设我们正在编写一个绘图程序,并想拥有一个能够逐渐增加颜色的画刷。用这个画刷每刷一道可以在图像的当前颜色增加一些颜色(例如,10%的当前画刷颜色与90%的图像颜色进行混合)。为此,可以使用alpha值为10%的画刷来绘制图像,并使用FL_SRC_ALPHA(源混合因子)和GL_ONE_MINUS_SRC_ALPHA(目标混合因子)。注意,为了实现抗钜齿功能的画刷,可以是画刷在中央的颜色浓一些,在边缘的颜色淡一些。类似地,也可以通过把清除颜色设置为背景色来实现橡皮擦的功能。,使用源或目标颜色的混合函数(用于源因子的GL_DST_COLOR或GL_ONE_MINUS_DST_COLOR,以及用于目标因子的GL_SRC_COLOR或GL_ONE_MINUS_SRC_COLOR)允许我们有效地对各个颜色成分进行单独的调整。这个操作相当于应用一种简单的过滤器,例如把红色成分与80%相乘,把绿色成分与40%相乘,把蓝色成分与72%相乘,以模拟透过过滤20%的红色、60%的绿色以及28%的蓝色的照相底片观察场景的效果。,假设我们想绘制一幅由3个半透明表面组成的图片,这几个表面相互遮挡,并且都位于一个实心背景上。假设最远的那个表面能够传播它背后80%的颜色,第二个表面能够传播它背后40%的颜色,最近的那个表面能够传播它背后90%的颜色。为了合成这幅图片,首先用默认的源因子与目标因子绘制背景色,然后把混合因子改为GL_SRC_ALPHA(源)和GL_ONE_MINUS_SRC_ALPHA(目标)。接着,用0.2的alpha值绘制最远的那个表面,然后用0.6的alpha值绘制中间的那个表面,最后用0.1的alpha值绘制最近的那个表面。,如果系统具有alpha平面,就可以在某个时刻合成操作(包括它们的alpha值),将它们读回,然后对完全渲染的物体进行有趣的褪光合成操作。注意,用于图片合成的物体可以来自任何途径。它们可以是OpenGL函数渲染的,也可以是有诸如光线追踪或放射扫射等技巧(这些技巧是由其他图形函数实现的)渲染的,或者是通过扫描现有的图形获得的。,可以通过向图形中的单独片断分配不同的alpha值,实现非矩形光栅图形的效果。在大多数的情况下,对于透明的片断,向它们分别分配1.0的alpha值。例如,可以绘制一个树形的多边形,并应用一幅植物纹理的图像。如果把矩形的纹理图像中观察者可以“看穿”的那部分像素的alpha值设置为0,它们就不会被观察者看到。这种方法有时又称“billboarding”(公告牌技术),它比通过三维多边形来创建树形状得方法要快很多。混合也可以用于反走样,减少光栅屏幕上所绘制的几何图元的锯齿状边缘。,9.1.3具有深度缓存的三维混合,正如我们在前面那个例子中所看到的那样,多边形的绘图顺序极大地影响最终的混合效果,在绘制三维的半透明物体时,根据从前向后还是从后向前绘制各个多边形,最终的结果可能大相径庭。在决定正确的绘图顺序时,还需要考虑深度缓冲区的效果。深度缓冲区追踪观察点和占据屏幕窗口中一个特定像素的物体之间的距离。当另外一个物体也占据了这个像素时,它的深度值就会与存储深度缓冲区中原先物体的深度值进行比较,只有当这个物体的距离比原先物体更靠近观察点时,它的颜色值才会应用于这个像素,按照这种方法,被遮挡(隐藏)的表面部分就不需要绘制,因此不会用于混合操作之中。,如果想在同一个场景中同时渲染透明和半透明的物体,就需要使用深度缓冲区,对那些位于不透明物体后面的所有物体执行隐藏表面消除。如果一个不透明的物体遮挡住了一个半透明的物体或另一个不透明的物体,就需要利用深度缓冲区消除这些距离更远的物体。但是,如果半透明物体更靠近观察点,就需要把它与位于它后面的不透明物体进行混合。一般情况下,如果场景都是静止的,我们能够推断出多边形的绘图顺序。但是,如果物体或观察者是运动的,这个问题就会变得极为困难。,这个问题的解决方案是启用深度缓冲区,但是在绘制半透明的物体时让深度缓冲区出于只读状态。首先,绘制所有不透明物体,按正常的方式对深度缓冲区进行操作。然后,把深度缓冲区设置为只读,保持它里面的深度值。绘制半透明物体时,它们的深度值仍然与不透明物体的深度值进行比较。因此,如果它们位于不透明物体的后面,它们就不会被绘制。但是,如果它们更靠近观察点,它们并不消除那些不透明的物体,因为此时深度缓冲区的值是无法改变的。反之,它们与这些不透明的物体进行混合。为了控制深度缓冲区是否可写,可以使用glDepthMask()函数。如果向他传递GL_FLASE参数,深度缓冲区就设置为只读。如果向它传递GL_TRUE,深度缓冲区就可以进行正常的读写,9.2反走样,反走样(Antialiasing),又叫反混淆,是计算机图形学中的一个重要概念。由于计算机生成的图形是由离散点组成的数字化图像,因而生成的图形必然与真实景物之间存在一定误差。这种误差表现为图形上的直线或光滑的曲线呈现锯齿状、彩色花纹失去原有的形态和色彩、细小物体在画面上得不到反映等等。在光栅显示器上显示直线段或曲线段时或多或少地呈现走样。在用有限个像素表示连续的直线段、曲线段就必须对直线段、曲线段进行采样,最终在光栅显示器上表示直线段或曲线段的只是一个个离散的有一定面积的像素。这种用离散量表示连续量引起的失真现象称之为走样(aliasing)。见图9-1所示,绘制直线时,出现的锯齿状的走样线。用于减少或消除这种失真现象的技术称为反走样(antialiasing)。,9.2.1行为控制函数,在OpenGL中,许多细节的实现算法有所不同。这样,可以调用函数glHint()对图像质量和绘制速度之间的权衡作一些控制,但并非所有的实现都采用它。其函数形式为:voidglHint(GLenumtarget,GLenumhint);控制OpenGL行为的某些方面。参数target说明控制什么行为,其可能值见表15-2所示。参数hint可以是:GL_FASTEST(即给出最有效的选择)、GL_NICEST(即给出最高质量的选择)、GL_DONT_CARE(即没有选择)。,表9-2函数glHint()参数及其意义,9.2.1点和线的反走样,在OpenGL中虽然颜色表方式可以实现反走样,但建议最好用RGBA方式进行。不管何种方式,对图元进行反走样,首先要用glEnable()启动反走样(参数为GL_POINT、GL_LINE_SMOOTH或GL_POLYGON_SMOOTH),同时,也可以调用glHint()提供一个图像质量提示。但需注意的是,在RGBA方式下,必须启动混合,最可能用的混合因子是GL_SRC_ALPHA(源)和GL_ONE_MINUS_SRC_ALPHA(目的)。另外,可以使目的因子为GL_ONE,则线的交点处要亮一些。下面例子运行结果是显示一个反走样的网状八面体。,示例程序9-2反走样线,9.2.2多边形的反走样,对填充多边形的边缘进行反走样处理类似于对点和直线进行反走样处理。当不同的多边形具有重叠的边缘时,就需要对颜色值进行适当的混合。可以使用本节描述的方法,也可以使用累积缓冲区对整个场景进行反走样处理。使用第7章描述的累积缓冲区,从用户的角度而言也许操作起来更简单一些。但是,这种方法需要大量的计算,因此速度较慢。不过,本节描述的方法虽然速度较快,但是使用起来多少有些笨拙。,示例程序9-3多边形反走样,9.3雾,计算机图像有时候由于过于清晰和锐利,反而显得不太逼真。反走样处理是物体的边缘显得更为平滑,增加了逼真感。另外,还可以通过添加雾效果,使整幅图像变得更加逼真。所谓雾效果,就是使远处的物体看上去逐渐变得模糊。“雾”是一个通用术语,描述了一些类似于大气效果。雾可以用于模拟模糊、薄雾、烟或污染(见彩图9)。雾在本质上是一种视觉模拟应用了,用于模拟具有有限可视性的场合。飞行模拟器程序常常需要使用雾效果。,当雾启用之后,远离观察点的物体开始融入雾颜色中。可以控制雾的浓度,它决定了物体随着距离的增加而融入到雾颜色的速度。另外,还可以设置雾的颜色。也可以在雾的距离计算中为每个顶点指定一个雾坐标,而不是使用自动生成的深度值。雾在RGBA和颜色索引模式下都可以使用,不过雾的计算在这两种模式中稍有不同。由于雾是在执行了矩阵变换、光照和纹理之后才应用的,因此它对经过变换的、带光照和经过纹理贴图的物体产生了影响。注意,在大型的模拟程序中,雾可以提高性能,因为它可以选择不绘制那些因为雾的影响而不可见的物体。,9.3.1雾化步骤,在OpenGL程序中使用雾化效果非常容易。其步骤有三,如下:1)启动雾。函数调用为glEnable(GL_FOG);2)控制雾。函数调用为glFog*(),用它选择控制浓度和颜色的雾方程,其具体形式为:voidglFogifv(GLenumpname,TYPEparam);设置计算雾的参数和函数。其具体含义在9.3.2中介绍。3)若有必要,可用函数glHint(GL_FOG_HINT)提供一个值,选择使用效率最高的选项(GL_FASTEST)、质量最高的选项(GL_NICEST)或没有什么偏向(GL_DONT_CARE)的选项。,示例程序9-5RGBA方式下雾化,9.3.2雾的方程,雾根据雾混合因子把雾颜色与源片断的颜色进行了混合。这个因子f是根据下列这3个方程式之一进行计算的,并截取在0,1的范围之内:,9.3.3雾坐标,在默认情况下,z是根据观察点和片断的距离自动计算产生的。但是,也可以对雾的计算施加灵活的控制。我们可能想模拟一个雾方程式,而不是沿用OpenGL提供的方程式。例如,我们可能想让一个飞行模拟器具有“基于地面”的雾,以便使用像海平面一样的浓雾。在OpenGL1.4版本中,可以调用glFog(GL_FOG_COORD_SRC,GL_FOG_COORD)显式地为每个顶点指定z值。在显式的雾坐标模式下,可以用glFogCoord*()函数指定每个顶点的雾坐标。,把当前的雾坐标设置为z。如果GL_FOG_COORD是当前的雾坐标来源,当前的雾方程式(GL_LINEAR、GL_EXP或GL_EXP2)就会使用当前的雾坐标来使用雾。Z值应该是正的,表示视觉坐标
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学语言文字规范化管理工作计划
- 新能源汽车产业发展工作计划及措施
- 随班就读教学教研活动的心理辅导计划范文
- 中职学校学生心理健康与德育工作计划
- 科研攻关团队培优辅差计划
- 上海市宝山区2024年数学七上期末统考模拟试题含解析
- 小学五年级语文班主任课程计划
- 人口与计划生育工作报告
- 社交软件计划书
- 快递行业车辆与人力配备计划
- 2025年云南普洱市墨江天下一双文旅体育集团有限公司招聘笔试参考题库附带答案详解
- GB/T 28731-2012固体生物质燃料工业分析方法
- 第二季度护理红黄警示及核心制度试题含答案
- 有机废弃物资源化利用课件
- 护理工作中的人文关怀课件
- 住院患者身份确认表
- 2023年度万科集团合格供应商名录
- 水合肼项目安全评价报告
- 新版机动车检验检测机构程序文件模板
- GB∕T 1001.1-2021 标称电压高于1000V的架空线路绝缘子 第1部分:交流系统用瓷或玻璃绝缘子元件 定义、试验方法和判定准则
- DB11_T 1832.9-2022 建筑工程施工工艺规程 第9部分_屋面工程
评论
0/150
提交评论