850 likes | 1.02k Views
第七章 真实感图形显示. 7.1 线 消 隐. 7.2 面 消 隐. 7.3 光 照 模 型. 7.4 光 线 跟 踪. 7.5 表面图案与纹理. 7.6 颜 色 空 间. 基本概念. 一 . 为什么要消隐 因为计算机图形处理的过程中,不会自动消去隐藏部分,相反会将所有的线和面都显示出来。 所以 :如果想有真实感地显示三维物体,必须在视点确定之后,将对象表面上不可见的点、线、面消去。执行这种功能的算法,称为消隐算法。 例如:. 7.1 线 消 隐. 7.1.1 消隐的分类 线消隐 (Hidden-line)
E N D
第七章 真实感图形显示 7.1 线 消 隐 7.2 面 消 隐 7.3 光 照 模 型 7.4 光 线 跟 踪 7.5 表面图案与纹理 7.6 颜 色 空 间
基本概念 一.为什么要消隐 因为计算机图形处理的过程中,不会自动消去隐藏部分,相反会将所有的线和面都显示出来。 所以:如果想有真实感地显示三维物体,必须在视点确定之后,将对象表面上不可见的点、线、面消去。执行这种功能的算法,称为消隐算法。 例如:
7.1 线 消 隐 • 7.1.1 消隐的分类 • 线消隐 (Hidden-line) • 对象:线框模型 • 面消隐 (Hidden-surface) • 对象:填色图 线框模型 填色图
7.1 线 消 隐 • 线消隐是以场景中的物体为处理单元,将一个物体与其余的 k-1 个物体逐一比较,仅显示它可见的表面以达到消隐的目的。 • 此类算法通常用于消除隐藏线。 • 假定场景中有 k 个物体,平均每个物体的表面由 h 个多边形构成,其计算复杂度为 O((kh)2)。
7.1 线 消 隐 算法描述如下: for (场景中的每一个物体) { 将该物体与场景中的其它物体进行比较,确定其表面的可见部分; 显示该物体表面的可见部分; } (示例如右图) 线消隐示例
7.1 线 消 隐 • 面消隐是以窗口内的每个像素为处理单元, 确定在每一个像素处,场景中的物体哪一个距离观察点最近(可见的), • 从而用它的颜色来显示该像素。此类算法通常用于消除隐藏面。 • 若显示区域中有 m×n 个像素,则其计算复杂度为O(mnkh)。
7.1 线 消 隐 算法描述如下: for (窗口内的每一个像素) {确定距观察点最近的物体,以该物体表面的颜色来显示像素; } 面消隐示例
7.1 线 消 隐 7.1.2 凸多面体的隐藏线消隐 凸多面体是由若干个平面围成的物体。假设这些平面方程为 aix+biy+ciz+di=0, i=1, 2, …, n (8.1) 变换方程的系数,使(ai, bi, ci)指向物体外部的。那么: 假设式(8.1)所定义的凸多面体在以视点为顶点的视图四棱锥内,视点与第i个面上一点连线的方向为(li, mi, ni)。那么自隐藏面的判断方法是: (ai, bi, ci)(li, mi, ni)>0 任意两个自隐藏面的交线,为自隐藏线。(自隐藏线应该用虚线输出)。
7.1 线 消 隐 • 8.1.3 凹多面体的隐藏线消隐 • 凹多面体的隐藏线消除比较复杂。 • 假设凹多面体用它的表面多边形的集合表示 ,消除隐藏线的问题可归结为: • 对于一条空间线段P1P2和一个多边形,判断线段是否被多边形遮挡 。如果被遮挡,求出隐藏部分
7.1 线 消 隐 • 线段和多边形的关系有: • 线段与多边形的任何边均不相交。处理方法比较简单。 • 线段与多边形相交。那么多边形的边把线段投影的参数区间[0, 1]分割成若干子区间,每个子区间对应一条子线段(如下图所示),进一步判断各子线段的隐藏性 。 线段投影被分为若干子线段
7.1 线 消 隐 • 把各个子线段与所有需要比较的多边形依次进行隐藏性判别,记下各条隐藏子线段的位置。最后,对这些区间进行求并集运算,即可确定总的隐藏子线段的位置,余下的则是可见子线段 (右图) 可见子线段的确定
7.2 面 消 隐 7.2.1 区域排序算法(1) 基本思想: • 在图象空间中,将待显示的所有多边形按深度值从小到大排序,用前面可见多边形去切割后面的多边形,最终使得每个多边形要么是完全可见,要么是完全不可见。用区域排序算法消隐,需要用到一个多边形裁剪算法。
7.2 面 消 隐 区域排序算法(2) • 当对两个形体相应表面的多边形进行裁剪时,我们称用来裁剪的多边形为裁剪多边形,另一个多边形为被裁剪多边形。算法要求多边形的边都是有向的,不妨设多边形的外环总是顺时针方向的,并且沿着边的走向,左侧始终是多边形的外部,右侧是多边形的内部。若两多边形相交,新的多边形可以用“遇到交点后向右拐”的规则来生成。于是被裁剪多边形被分为两个乃至多个多边形;我们把其中落在裁剪多边形外的多边形叫作外部多边形;把落在裁剪多边形之内的多边形叫作内部多边形。
7.2 面 消 隐 算法的步骤: ⑴ 进行初步深度排序,如可按各多边形z向坐标最小值(或最大值、平均值)排序。 ⑵ 选择当前深度最小(离视点最近)的多边形为裁剪多边形。 ⑶ 用裁剪多边形对那些深度值更大的多边形进行裁剪。 ⑷ 比较裁剪多边形与各个内部多边形的深度,检查裁剪多边形是否是离视点最近的多边形。如果裁剪多边形深度大于某个内部多边形的深度,则恢复被裁剪的各个多边形的原形,选择新的裁剪多边形,回到步骤⑶再做,否则做步骤⑸。 ⑸ 选择下一个深度最小的多边形作为裁剪多边形,从步骤⑶开始做,直到所有多边形都处理过为止。在得到的多边形中,所有内部多边形是不可见的,其余多边形均为可见多边形。
7.2 面 消 隐 • 8.2.2 深度缓存(Z-buffer)算法 • 由来: • 帧缓冲器 – 保存各像素颜色值(CB) • z缓冲器 --保存各像素处物体深度值(ZB) • z缓冲器中的单元与帧缓冲器中的单元一一对应 • 思路: • 先将z缓冲器中个单元的初始值置为+Zmax (大于场景中的所有Z值)。当要改变某个像素的颜色值时,首先检查当前多边形的深度值是否小于该像素原来的深度值(保存在该像素所对应的Z缓冲器的单元中),如果小于,说明当前多边形更靠近观察点,用它的颜色替换像素原来的颜色;否则说明在当前像素处,当前多边形被前面所绘制的多边形遮挡了,是不可见的,像素的颜色值不改变。
7.2 面 消 隐 深度缓存算法 ( Z—Buffer算法) Z—Buffer ---- 用于存放与屏幕上像素点对应的物体上点的深度值。 y 投影面 视线方向 z x 视点位置 屏幕像素 F — Buffer Z—Buffer
7.2 面 消 隐 Z-buffer算法的步骤如下: ⑴ 初始化ZB和CB,使得ZB(i, j)=Zmax,CB(i, j)=背景色。其中,i=1, 2, …, m,j=1, 2, …, n。 ⑵ 对多边形,计算它在点(i, j)处的深度值zi, j。 ⑶ 若zijZB(i, j),则ZB(i, j)=zij,CB(i, j)=多边形的颜色。 ⑷ 对每个多边形重复⑵、⑶两步。最后,在CB中存放的就是消隐后的图形。
7.2 面 消 隐 • 这个算法的关键在第⑵步,要尽快判断出哪些点落在一个多边形内 ,并尽快求出一个点的深度值 。 • 缺点: • (1):ZB和CB两个缓存数组占用的存储单元太多 ,需要有一个较大容量的 Z—Buffer 。 (2):在每个多边形占据的每个像素处都要计算深度值,计算量大
7.2 面 消 隐 • 8.2.4 扫描线算法 • 在多边形填充算法中,活性边表的使用取得了节省运行空间的效果。用同样的思想改造Z-buffer算法:将整个绘图区域分割成若干个小区域,然后一个区域一个区域地显示,这样Z缓冲器的单元数只要等于一个区域内像素的个数就可以了。如果将小区域取成屏幕上的扫描线,就得到扫描线Z缓冲器算法。
扫描线算法描述 for ( 各条扫描线) {将帧缓冲器I(x)置为背景色; 将Z缓冲器的Z(x)置为最大值; for (每个多边形) { 求出多边形在投影平面上的投影与当前扫描线的相交区间 for (该区间内的每个像素) if ( 多边形在此处的Z值小于Z(x) ) { 置帧缓冲器I(x)值为当前多边形颜色; 置Z缓冲器Z(x)值为多边形在此处的Z值; } } }
7.3 光 照 模 型 7.3.1 光源特性和物体表面特性 Shading :显示一个物体的色彩以及色彩在光照环境下的明暗变化 的描绘方法。 (相关因素:光源特性和物体表面特性。) 一:光源特性 包括 1:光的色彩 (R、G、B ) 2:光的强度 由R,G,B三种色光的强弱决定,总的光强为: Total_Value=0.30*Value_R+0.59*Value_G+0.11*Value_B 点光源 3:光的方向 分布式光源 漫射光源
7.3 光 照 模 型 • 右边是三种光源的示意图。其中点光源和分布式光源合称直射光源; 三种光源
7.3 光 照 模 型 物体表面特性包括如下内容: ⑴反射系数 由物体表面的材料和形状决定,分为漫反射(Diffuse Reflection)系数和镜面反射(Specular Reflection)系数。 ⑵透射系数 记为Tp,描述物体透射光线的能力,且有0≤Tp≤1。 ⑶表面方向
7.3 光 照 模 型 7.3.2 光照模型及其实现 • 光照模型(Illumination Model)描述物体表面的色彩明暗同光源特性、物体表面特性之间的关系。 • 光照模型分3个部分描述这种关系,即漫射光线的情况、直线光线的情况和透射光线的情况。
7.3 光 照 模 型 • 1.直射光线的情况 • 在这种情况下,物体表面的明暗随表面法矢量和入射光线Is的夹角I的改变而变化。此时,物体表面会发生两类反射,即漫反射和镜面反射。 • 在直射照明下,物体表面P点的漫反射和镜面反射的模型根据Lambert定律和Bui-Tuong Phong的实验提出(图8.5)。 • EPs=RPcos iIPs+WP(i)cosnsIPs
7.3 光 照 模 型 EPs= RPcos iIPs+WP(i)cosnsIPs Eps: P点反射的直射光线IPs的光强 RP: P点的漫反射系数 光照模型中各参数的图示 I: P点的法矢量N与入射光方向L的夹角 Ips:入射的直射光线的强度 WP(i):P点的镜面反射系数(入射角i的函数)
7.3 光 照 模 型 • WP(i)是P点的镜面反射系数(入射角i的函数)。由于W(i)的计算比较复杂,实际中常用一个常数W代替。 W(i)与i的关系
n控制高光的聚散,它和P点的材料有关。对于光滑发亮的金属表面,n值取得大,从而产生会聚的高光点 n与高光区域大小的关系
7.3 光 照 模 型 • 2.透射光线的情况 • 透射模型如下: • EPt = TPIPb • 其中: • Ept:物体表面P点处透射出的光强 • TP:P点的透射系数(取值范围为0~1) • Ipb:到达P点背后的光强。
7.3 光 照 模 型 3.漫射光线的情况 漫射光源是从四面八方均匀照来的,物体表面的色彩明暗与表面的形状无关,仅与表面的反射系数有关 。 漫射光源照明的模型为 EPd = RPId 上式可以写为 EPd-r=RP-rId-r,EPd-g=RP-gId-g,EPd-b=RP-bId-b
将上述3种情况综合起来,便获得物体表面P点处所发光强EP的计算公式:将上述3种情况综合起来,便获得物体表面P点处所发光强EP的计算公式: • EP=EPd+EPs+EPt • = RPId+(RPcos i+WPcosns)IPs+TPIpb • 上式中只有cos i和cos s的值是未知的,需要推算。(详见7.3.2)
7.3 光 照 模 型 7.3.3 明暗的光滑处理 在计算机图形学中,曲面体(例如球)通常是用多面体逼近表达的。这时,分别计算各个面的亮度,就会在多边形与多边形的交界处产生明暗的连续变化,影响曲面的显示效果。 解决方法: 采用插补的方法,使得表面明暗光滑化。最常使用的表面明暗光滑化的方法有两种,称为Gourand方法和Phong方法。
7.3 光 照 模 型 Gourand光滑方法如下: 基本思想:在每个多边形顶点处计算颜色,然后在各个多边形内部进行线性插值,得到多边形内部各点颜色。即它是一种颜色插值着色方法。 基本步骤: ⑴ 先计算出多面体顶点的法线方向 ⑵ 用光照模型求得V点的亮度。 ⑶ 由两顶点的亮度,插值得出棱上各点的亮度。由棱上各点的亮度,插值得出面上各点的亮度。 (下面详细介绍每步)
7.3 光 照 模 型 Step1: 计算多面体顶点的法线方向 • 设与多面体顶点V相邻的多边形为P1,P2,…,Pn,它们的法线分别为N1(a1, b1, c1),N2(a2, b2, c2),…,Nn(an, bn, cn)。则V的法线nV取做: nV = (a1+a2+…+an)i+(b1+b2+…+bn)j+(c1+c2+…+cn)k
7.3 光 照 模 型 Step2: 用光照模型求得V点的亮度。 Step3:由两顶点的亮度,插值得出棱上各点的亮度。由棱上各点的亮度,插值得出面上各点的亮度 。
如果希望在某处不处理成光滑而要保留折痕效果(例如abc)方法是在顶点b设置2条法线。分别用于A和B,C和D之间的插值如果希望在某处不处理成光滑而要保留折痕效果(例如abc)方法是在顶点b设置2条法线。分别用于A和B,C和D之间的插值 保留abc折痕的情况
Gourand光滑化方法 • 优点:能有效的显示漫反射曲面,计算量小 • 缺点: • 1、高光有时会异常 • 2、当对曲面采用不同的多边形进行分割时会产生不同的效果。 • 3、Gouraud明暗处理会造成表面上出现过亮或过暗的条纹,称为马赫带(Mach_band)效应 • 改进-Phong提出双线性法向插值,以时间为代价,解决高光问题
Gourand光滑化方法 • 明暗变化失常 • 马赫带效应
Phong光滑方法 • 基本思想:通过对多边形顶点的法矢量进行插值,获得其内部各点的法矢量,又称为法向插值着色方法。 • 步骤 • 1、计算多边形单位法矢量 • 2、计算多边形顶点单位法矢量 • 3、对多边形顶点法矢量进行双线性插值, 获得内部各点的法矢量 • 4、利用光照明方程计算多边形内部各点颜色
7.3 光 照 模 型 Phong着色方法 • NA由N1、N2线性插值得到:
两种方法的比较1 • Phong着色方法绘制的图形比Gouraud方法更真实,体现在两个方面:高光区域的扩散,产生正确的高光区域 • 1:Phong着色方法计算量远大于Gouraud着色方法 • 2:在处理某些多边形分割的曲面时,Phong算法还不如Gouraud算法好。
两种方法的比较2 • Phone方法可以产生正确的高光区域 Gouraud Phone
7.3.4 阴影生成 • 目的:增加图形的立体感和场景的层次感 ,真实感
阴影可分为两种: 本影:本影即景物表面上那些没有被光源(景物中所有特定光源的集合)直接照射的部分 半影:而半影指的是景物表面上那些被某些特 定光源(或特定光源的一部分)直接照射但并非被所有特定光源直接照射的部分。 一般来说,半影的计算比本影要复杂得多
方法一:影域多边形方法 • 所谓影域,就是物体投射出的台体 。判断点是否在台体中即可确定是否在阴影中。
为了判别一可见多边形的某部分是否位于影域内,可将影域多边形置入景物多边形表中(右图)为了判别一可见多边形的某部分是否位于影域内,可将影域多边形置入景物多边形表中(右图) S5 S1 S4 S2 S3 I II III 利用影域多边形进行阴影判断
方法2:曲面细节多边形方法 • 首先取光源方向为视线方向对景物进行第一次消隐,产生相对光源可见的景物多边形(称为曲面细节多边形),并通过标识数将这些多边形与它们覆盖的原始景物多边形联系在一起。位于编号i的原始景物多边形上的曲面细节多边形也注以编号i。接着算法取视线方向对景物进行第二次消隐。
方法3:z缓冲器方法 • 为了方便地在光滑曲面片上生成阴影 ,Williams提出一种z缓冲器方法 首先,利用z缓冲器消隐算法取光源为视点对景物进行消隐。所有景物均变换到光源坐标系 第二步,仍采用z缓冲器消隐算法按视线方向计算画面
方法3:光线跟踪方法 • 1980年Whitted提出了整体光照明模型,并用光线跟踪(raytracing)技术来解这个模型 • 在光线跟踪算法中,要确定某点是否位于某个光源的阴影内,只要从该点出发向光源发出一根测试光线即可