在图形渲染中有一个很大的敌人就是渲染不必要的多边形,比如处于背面的三角面片。拿起一本数,无论你怎么看最多也只能看到书的三个面,有的时候只能看到书的一个面。看不到的面我们完全可以把它剔除掉,这门武功就叫做背面剔除。

如果是软光栅化,背面剔除通常在世界空间或相机空间中做,算法很简单如果平面的法线和视向量(平面上的一个点到视点的向量)的夹角小于90度那么这个三角面就是正面,否则是背面。这里的背面剔除只和平面法线及相机位置有关,与相机的朝向无关,也就是说即便背面剔除测试通过,这个三角面片也有可能不被渲染,比如它根本就没有在视锥体内。

现在的背面剔除都是gpu来做,背面剔除发生在顶点变换之后,光栅化之前。为什么不在顶点变换的时候做呢?因为顶点变换阶段VS输入的都是点信息(方便gpu并行计算)这时候还没有图元信息,所以无法做背面剔除。光栅化阶段的输入是图元信息,因为我们需要根据图元做屏幕空间裁剪和以及线性插值。在屏幕空间中如何做背面剔除,这个是根据三角形三个顶点的绕序。比如DX默认情况下顺时针绕序是正面,逆时针是背面。当然我们也可以通过改变渲染状态,把它颠倒过来。绕序也就是三角形两条边叉乘得出的法向量是正是负。

unity ui遮挡剔除 unity 背面剔除_三角面片

上图代表了两种背面剔除的算法,如果按逆时针是正面的化,蓝色的多边型是背面。视空间中a是背面,因为夹角大于90度。

背面剔除可以打开也可以关闭,unity在shader中设置,图形API可以通过渲染状态设置。

我们在一个立方体内部向外看,往往是看不到立方体的,因为背面剔除把立方体的面都剔除了。3D模型的法线都是朝外发散的,所以我们在模型外面看模型是没有问题的。或者说3D模型的面片的绕序是保证在外面看是正面的。

要想在里面也能看到模型,关闭背面剔除。

单面多边形和双面多边形的区别是什么?双面多边形怎么看都不会被剔除。

单面多边形想不被剔除,又不想关闭背面剔除,怎么办,上Billboard哈哈哈。

图形渲染中的知识点太多,必须彻底理解每一个知识点才能灵活运用。