齐次空间裁剪
齐次空间裁剪是指发生在vertex shader之后,透视除法( 顶点坐标/w )之前的一段操作。其目标非常直接,因为我们并没有必要去渲染视锥体之外的物体,如下图:
只有位于视锥体之内的部分,我们才需要去光栅化该三角面,因此裁剪就是将所有不在视锥体之内的三角面进行剔除的一个过程,而齐次空间裁剪则是将这个过程在四维的齐次空间进行。
本文目录:
- 1 简单裁剪及其缺陷
- 2 齐次空间裁剪
- 2.1 点与面的关系判断
- 2.2 线与面的关系判断和求交点
- 2.3 凸多边形与面的剪裁
- 2.4 凸多边形与视锥体的剪裁
- 2.5 齐次坐标下的裁剪
- 2.6 三角形组合(triangle assembly)
- 3 总结
- Reference
1 简单裁剪及其缺陷
首先举一个非常直观的裁剪方法,假设现在所有的顶点都已经经过的model,view,perspective 和 透视除法的操作,那么我们的视锥体的三维空间范围应该转化为了
这种方法的优点是简单直观并且效率很高,在早期硬件性能较低的时候有不少的游戏制作确实采用了这种方法。但其缺点也是非常明显的,如果一个三角形并不是完全在标准立方体之外的话(即一部分在内,一部分在外),那么将这个三角形面完全剔除似乎并不是一种合理的方法,其得到裁剪的效果如下:
仔细观察琪亚娜的脑壳和底边的衣物,有许多突兀的缺损一部分的情况,而这正是简单裁剪的问题,我们希望得到的裁剪结果在边缘应该是平滑的,如下图所示,从单个三角面的角度考虑:
三角形ABC是待被裁剪的三角面,plane是裁剪平面(横截面角度观察),plane左边为外侧,右边为内侧,我们希望保留内侧部分,如果按照简单裁剪的方法,由于点A位于裁剪平面外侧,则整个三角面都会被抛弃。正确的做法应该是求出CA,AB与裁剪平面plane的交点P1,P2。并将P1,P2,B,C重新组合成2个新的三角面,即P1P2B 和 P1BC,接下来就会一步步去具体介绍如何达到这种效果。
2 齐次空间裁剪
2.1 点与面的关系判断
想要进行三角面的裁剪,重要的是能够正确判断三角面的裁剪空间的位置关系,而三角面与裁剪空间的位置关系是由构成三角面的边与裁剪空间的关系决定的,更进一步,边与裁剪空间的关系则是由构成这条边的两个顶点与裁剪空间的关系决定的。
理清上面的逻辑,我们所要做的第一步便是判断点与裁剪空间的关系(即点在内部还是外部),不过这里做一个小小的简化,先不直接考虑点与裁剪空间的关系,而是考虑点与单一裁剪平面的关系(这其实是判断与裁剪空间关系的基础,后文会做详细解释)。
如上图所示,依然从横截面去观察裁剪平面与点。一个平面可由一个平面上的点