作者:i_dovelemon
来源:优快云
日期:2014 / 10 / 28
主题:View Frustum, Culling
引言
在前面的一篇文章获取View Frustum的6个面中讲述了如何根据View-Proj矩阵来获取View Frustum在世界坐标系中的6个平面。研究过场景管理的同学就会知道,在将图元数据传入到流水线之前,我们需要对数据进行组织。而场景管理通常就是进行这样的工作,通过场景管理,我们剔除(Culling)那些不在View Frustum中的物体,也就是在显示器中看不到的几何物体。读者可能会问,硬件不也会进行裁剪操作吗?是的,的确会这样。但是裁剪操作是发生在光栅化操作中。也就是说,很多的数据在最后光栅化的时候,被裁剪掉了,但是在前面的光照计算,纹理过程等等操作中都进行了,这明显浪费了资源,让系统做了不需要进行的工作。而今天讲解的View Frustum Culling就是来判断一个物体是否会显示在界面上,如果不显示,那么在应用程序阶段就将它剔除掉,这样就不用浪费资源来进行操作了。更彻底的,读者还可以实现那些被前面物体遮挡的物体剔除的算法。但这不再本文的讨论范围之内。好了,废话不多说,来讲解今天的内容吧!!!
AABB-Plane Intersecting
进行View Frustum Culling的关键技术在于进行AABB-Plane检测。在前面的文章中,我们获取到了6个平面,如果能够判断一个物体的AABB包围盒完全的在其中一个平面的负半空间中的话,就表明这个物体一定不再View Frustum中。这里,需要理解一个概念,什么是负半空间?
理论上,一个平面会将空间