什么是消隐
全称是消除隐藏面或消除隐藏线
上图中绘制不同的线条会有不同的效果
消隐主要是消除二义性 在绘制时消除被遮挡不可见的线或者面
线消隐
消隐对象是物体上的边 消除物体上不可见的边
面消隐
消隐对象是物体上的面 消除物体上不可见的面
Roberts算法
每个物体先对自身考虑 找到被遮挡的面和线(自消隐)
再将没有被消除的边与其他物体进行比较 留下最终完全可见的部分
如果物体之间有贯穿 则要确定新的显示面 显示边
但是他主要考虑的都是凸面体
光线投射算法
求光线与场景的交点 这个光线就是视线
就是将这条线接触到的像素做一个排序 在前面的像素自然就是被看到的
缺点就是需要求交点 计算量特别大
Z-Buffer消隐算法(深度缓冲器算法)
简单来说就是先在Z-Buffer缓冲器中存储最小的深度值 屏幕上每一个像素点都有一个深度值 然后再将各多边形的深度值与其投影在屏幕上像素点的深度值进行比较 如果大于则保存该深度值 则说明该多边形的这一点是可以被看到的 那么就用该点的颜色值作为屏幕上该点的像素值
缺点
占用空间太大 因为要开辟一个和屏幕分辨率一样大的数组来存储z值
没有利用图形的相关性和连续性
相较于空间问题的改进
这个改进和上面那个方法的区别主要是
1.上面那个方法是遍历每个多边形内的像素和该像素在屏幕上的该位置的像素进行比较 所以需要屏幕上每个位置都需要存储一个z值
而该方法是遍历屏幕上每个像素 将该点和多边形进行比较
2.不再创建一个和屏幕分辨率一样大的数组来存储z值 而是只用一个变量来存储z值
流程
从每屏幕左上角开始逐像素的 先让该像素和每个多边形进行用该点和每个多边形的每个像素进行比较了)比较(如果不进行比较就需要) 如果在多边形内 则和多边形内该点的z值进行比较 然后如果多边形的该点的z值大于原来的z值 则计算该点的光照等作为该点的颜色
缺点
需要计算是否在多边形内
关于计算多边形上某个(x,y)的深度值
首先我们是知道多边形每个顶点的深度值 然后通过平面方程求
如 平面方程为 ax+by+cz+d=0
depth = (ai + bj+d)/c
关于计算某点与多边形是否包含
射线法
弧长法
第一张图就是0 第二张图就是2π
代数和为0就在多边形外部
代数和为2π就在多边形内部
代数和为π就在多边形边上
缺点是计算弧长不容易
弧长累加法
就是上面方法的改进 以点p为坐标轴原点建立坐标系 同一个象限认为0 跨过一个象限就为π/2 跨过两个象限就为π以此类推
区间扫描线算法
红色的就是扫描线 求出扫描线和多边形的交点 如果计算出两个区间之间的一个像素为什么颜色 则该区间的其他像素都是这个颜色了
如果区间上没有多边形则显示背景色 如a4 a5
如果区间上只有一个多边形则显示该多边形颜色 如a1 a2
如果区间上右多个多边形则需要进行深度测试 判断那个多边形课件 如a6 a7
优点
将像素计算改为逐段计算
Warnock算法(区域子分割算法)
主要是采用了分治的方法和堆栈的数据结构
过程
把物体投影到窗口上 然后进行递归分割窗口(例如分成四个小窗口) 直到窗口内目标足够简单到可以直接显示为止
如果窗口分割到只有一个像素那么大了 还有两个以上物体则此时不必再分割 只取窗口内最近的颜色或者可见面的平均颜色作为像素的值
什么是足够简单可以直接绘制
判断方法就是计算物体包围盒 然后与窗口进行比较