文档介绍:第6章真实感图形的生成技术
消隐技术
光照技术
物体表面细节的模拟
阴影的生成
图形反走样技术
用OpenGL生成真实感图形
消隐技术
真实感图形绘制:借助数学、物理、计算机等学科的知识在计算机二维显示屏上产生三维场景的真实逼真图像、图形。
应用:计算机辅助设计、多媒体教育、虚拟现实系统、科学计算可视化、动画制作、电影特技模拟、计算机游戏等。
图6-1 图形具有二义性 (a)线框图(b)从右上往下看(c)从左下往上看)
将三维场景绘制在计算机二维显示屏上必须经过投影变换,投影变换将三维信息变换到二维平面上,这个过程中深度信息被丢失,生成的图形往往具有二义性,早期判别可见面的算法有消除隐藏线、消除隐藏面算法。现在有画家算法、Z缓冲器算法、扫描线缓算法、光线追踪算法等等。
物空间算法是在定义、描述物体的世界坐标系中实现的,以场景中的物体为处理单元:
for(场景中的每一个物体)
{
将其与场景中的其它物体比较,确定其表面的可见部分;
显示该物体表面的可见部分;
}
像空间算法是在观看物体的屏幕坐标系下实现的,它以窗口内的每个像素为处理单元:
for(窗口内的每一个像素)
{
确定与此像素对应的距离视点最近的物体,
以该物体表面该处的颜色来显示像素;
}
判别可见面算法通常按它们在实现时所基于的坐标系分为两类:物空间算法和像空间算法。
理论上讲,物空间算法的计算量少于像空间算法的计算量,但实际上物体到视点距离的排序与遮挡判别比较复杂,算法效率很大程度上取决于排序的效率。而以扫描线的方式实现像空间算法时容易利用连贯性质从而使得像空间算法更具效率。
(1)将线段和多边形投影到投影平面上得到线段和多边形。
(2)计算线段和多边形各条边的交点。
(3)交点将分成若干个子线段,特别地当交点不存在时,
子线段只有一个,即自身。现在每个子线段上的所有点具有
相同的隐藏性。
(4)分别判断各个子线段的隐藏性。
多面体隐藏线消除
隐藏线的产生是因为在给定的观察方向下,某些棱(或棱的一部分)被表面多边形的遮挡成为不可见,因此多面体隐藏线消除可以归结为一个根本问题:在给定的观察方向下,给定一条空间线段和一个多边形,判断线段是否被多边形遮挡。如果遮挡,求出遮挡部分。步骤如下:
取子线段的中点,判断该点是否在多边形内。
如不在多边形内,子线段与多边形不存在隐藏关系,子线段是可见的。
如在多边形内,从子线段中点向视点引射线,如果射线与多边形相交,则该子线段被多边形隐藏,否则该子线段可见。
消除自隐藏线、隐藏面
利用多面体表面多边形的法矢判别“朝后的面”,即不可见面。
深度测试
在观察坐标系下判断线段与多边形的前后关系。如多边形完全在线段之后,则线段完全可见,无需就线段和多边形的遮挡关系进行进一步判断。
包围盒测试
包围盒不相交,线段和多边形也不相交,线段完全可见,无需就线段和多边形的遮挡关系进行进一步判断。
线段和一个多边形进行隐藏性判断时,涉及到的运算包括投影变换,平面上线段和多边形的求交,判断点是否在多边形内,空间中射线和平面求交。如果将多面体的每条棱与每个多边形都按上面的方法消除隐藏线,那么计算量将非常大。采取如下措施可以减少计算量:
Z缓冲器消隐算法
Z缓冲器消隐算法是最简单的消除隐藏面算法之一。在这个算法里,除了有一个帧缓冲区用来存放每个像素的亮度值,还要有一个Z缓冲区用来存放每个像素的深度值。帧缓冲区和Z缓冲区的存储单元数目相同,并且都等于屏幕上像素的个数,见图。
for(各个多边形)
{
扫描转换该多边形;
for(多边形所覆盖的每个像素(x,y))
{
计算该像素所对应多边形上的点在观察坐标系下的z坐标值Z(x,y);
if(Z(x,y)大于Z缓冲区在(x,y)处的值)
{
Z缓冲区中(x,y)处深度值替换为Z(x,y);
帧缓冲区中(x,y)处亮度值替换为多边形在(x,y)处的亮度值;
}
}
}
帧缓冲区置成背景色;
Z缓冲区置成某初始值,该值比场景在观察坐标系下的最小z值还小;
Z缓冲区算法的流程为:
光照技术
图6-5 (a) 经过光照计算的球
(b) 不经过光照计算的球
单纯判别物体表面的可见性,远远不能反映物体表面的真实感。
物体表面所呈现的颜色是由表面向视线方向辐射进入人眼中光决定的。建立数学模型模拟物体表面的光照明物理现象,按照数学模型计算物体表面向视线方向辐射进入人眼中的光亮度,即可获得像素所对应的物体上的可见点的颜色,这样绘制出来的图形具有较强的真实感,如图6-5(a)。这些数学模型就称为明暗效应模型或者光照明模型。
当光照射到物体表面时,光可能被吸收、反射和透射