1. Hidden Line Removal (HLR)
在光栅化的文章中,我们使用Z-Buffer来判断三角形面片是否遮挡,但Z-Buffer不适用于纯线框的模型的遮挡剔除。原因如下。
就如同上图左侧,在A点的位置,左侧的三角形由于只画边不画面,所以A点它是不画的,所以就没有Z值来与右侧的三角形的A点的Z值做比较,因此就没法判断A点是谁在前谁在后。
HLR算法总结
-
Raycasting(光线投射)
- 算出每条光线在屏幕上某个像素点上的交点位置
- 在该像素点上只保留最近的交点
Painter’s Algorithm(画家算法)
简单粗暴,先画后面的物体,后画前面的物体,就像画画一样,后涂的颜色会覆盖掉先涂的颜色。
比较两个物体,当前视角来看,如果A的点全都在B的点前面,那么先画B再画A
但缺点也很明显:
1)如果A的点不全的B的前面,即A有些点从当前视角看是在B的某些点后面,就会失败。
2)物体之间有相交的面时,会失败。
(好像飞机的雷达显示是用的这个算法?)-
Warnock Algorithm (沃诺克算法)
核心:分而治之
不停的四分屏幕(一般是四分,也可以二分或者其他分),直到被细分的子空间只存在简单的前后关系(就是画家算法的那个要求),或者子空间已经细分到了一个像素点的大小。
在曲面和抗锯齿中很有用。
1)当前子空间没有多边形:完成!
2)当前子空间只有一个多边形:画!
3)当前子空间有简单的前后关系:画前面的!
4)当前子空间只有一个像素那么大了:画离该像素点距离最近的多边形!
5)否则,继续递归细分 -
BSP-Tree (Binary Space Partioning trees, 二维空间分割树)
不停二分,在每个存在简单前后关系的子空间里使用画家算法。
优点
1)可以处理带透明度的遮挡
2)快:不用每个像素点都计算Z并检测 Z-buffer
新建一个数组,叫Z-buffer。
每次将像素点颜色写入frame buffer时,把该点的Z值也写入Z-buffer。
每次将像素点颜色写入frame buffer之前,如果该位置已经被写入过,拿出它的Z值与正准备写的点的Z值比较一下,谁离屏幕近写谁。
是目前最流行的方法。
优点
1)简单
2)高效
缺点
1)增加了内存空间,因为多了个Z-buffer
2)受限于Z的量级 / 精确度
3)过度渲染:每个像素点可能会写入多次。
4)不支持透明度!(不支持透明度竟然还会最流行?)
2. 面片消除(Culling)
Portals
预先根据视角计算出哪些三角形可见,那些三角形不可见。
(一换视角就GG了)-
视锥Culling
如果某物体全部顶点都在视锥外面,则不显示。 Backface Culling (背面消除)
只适用于封闭物体
通过每个面的法线来判断是正面还是背面,如果是背面,就隐藏。