0评论

渲染管线之背面消隐

文章来自https://blog.csdn.net/sixdaycoder/article/details/72637527 2019-03-12 24浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏开发行业精英群711501594

1、什么是背面消隐

我们使用三角网格描述物体,在物体被转换到视空间之后,下一步就将被转换到屏幕坐标。

背面消隐指的是删除背向视点(相机的观察点)的多边形。

2、算法原理

基本的背面消隐算法数学原理很简单:

(1)要求所有的三角形按照统一的方式(顺时针或者逆时针)排列顶点,这很重要,因为关系到平面法向量的计算。

(2)根据三角形的顶点信息计算该三角形的外法向量。

(3)使用观察向量(观察向量是指相机点到三角形某个顶点的向量)测试三角形的外法向量,如果这两个法向量的夹角严格小于90度,那么多边形对于观察者而言是可见的。

简单说明一下(1):

对于该物体,显然面OAB和OBC与ABC对于观察者来说不可见,假设观察向量为view,四个面的法向量计算结果为n1,n2,n3,n4。(面法向量是由顶点的叉乘计算出来的)

根据我们的算法,应当只有view与n1(OAC的外法向量)严格小于90度,但是如果不规定三角形顶点的存储顺序,那么n1,n2,n3,n4的计算方式就会不统一。又面法向量是由顶点叉乘计算得来的,且叉乘是不可交换的,所以可能会出现view与n2,n3,n4的夹角小于90度的情况。

3、实现
 bool BackFaceCulling(Vertex p1, Vertex p2, Vertex p3)
{//其中p1 P2 p3必定严格按照逆时针或者顺时针的顺序存储
    Vector3D v1 = p2.point - p1.point;
    Vector3D v2 = p3.point - p2.point;
    Vector3D normal = Vector3D.Cross(v1, v2);//计算法线
    //由于在视空间中,所以相机点就是(0,0,0)
    Vector3D viewDir = p1.point - new Vector3D(0, 0, 0);
    if (Vector3D.Dot(normal, viewDir) > 0){//夹角小于90度
         _showTrisCount++;//记录一下被渲染的三角形的数量
         return true;
    }
    return false;
}