目标分析

分析对于一个Mesh的一次Draw调用,其中的三角形会产生以下三种情况

图-1

1.三角形在可视范围内,顶点都保留
2.三角形在与视范围相交,去掉外围点,产生新点
3.三角形不在可视范围内,丢弃所有顶点

Sutherland-Hodgman算法

也叫逐边剪裁法,该算法采用了分割处理、逐边剪裁的方法

算法思想(二维)
一次用窗口的一条边所在直线裁剪多边形,循环多次;
每次,构造一个空的点数组DST;原数组为SRC
每次,所有顶点从0号开始,作为S点,S后面的点为P点,依次进行测试,结果输出点到DST,剪裁原则如下:

图-2

Sutherland-Hodgman算法举例演示(1)

输入0-1-2考察右侧边

图-3

如法炮制考察剩余三边后,输出三角形0`-1-1`的点

Sutherland-Hodgman算法举例演示(2)

输入0-1-2考察上侧边

图-4

如法炮制考察剩余三边后,输出0`-1-2-2`

输入0`-1-2-2`考察右侧边

图-5

如法炮制考察剩余三边后,输出1-1`-2``-0`

对其他两条边如法炮制,最终可以获得下方所示数组:

图-6

接下来进行三角形重建:永远以数组第一个顶点为起始点,递进构建三角形: 1-1`-2` 1-2``-0`

图-7

算法总结图解

图-8

剪裁产生新点属性插值

当两个点位于平面内外两侧,我们需要对其进行插值,从而得到相交点的位置/颜色/uv等属性

图-9

插值计算流程:
1.得到边界线的方程表达式
2.将p/s点代入求出边界距离
3.选择任何一条距离作为系数,执行线性插值

图-10

注意:L和d都是有方向的,Ls是正数,比上Ls-Lp,这个的Lp是负数,减去就相当于相加,所以就是和直线插值算法是一样的,改成投影方便计算

Sutherland-Hodgman算法(三维)

三维情况下,剪裁边变成了剪裁平面;我们选择在NDC构成的-1到1盒体内进行剪裁,但必须保证顶点在摄像机前方,顶点z值不为0(即不与摄像机重合)

图-11

判定条件

根据上述条件以及NDC下坐标必须为-1到1内,可使用剪裁空间坐标对内外进行判定:

图-12

再将上面的判断条件展开,得到:

图-13

任意点代入方程后,得到的结果,都是距离判定平面的“有向距离”
插值交叉点的方法,也可采用前述的距离插值方法