一直老混淆的理解这两个概念,迷惑了很久,也一直没在网上找到两者区别的文章,作为图形学入门者自己粗浅的总结一下。
以下,仅仅代表个人观点,由于本人3D只处于入门阶段,一直也没有直接从事3D相关工作,也没有名师指点,不保证理解正确。
首先,纠正下,背面消影消除的面是指一个盒子被前方挡住的面,并不是指同一个面的前后两面。同一个面的前后两面在3D中同一位置的点永远是一模一样颜色的,面没有厚度。【我发现一些和我一样的入门菜鸟都容易在这里理解错误】
在学习了图形学一段时间后,一直觉得消影和深度测试干的是同一件事情,本质都是去除被遮挡住的顶点(更准确的说是像素)。我认为即使没有背面消影处理,只有有深度测试,最终结果也一样(纯个人入门理解)。但为什么必须要做背面消影处理,并且还是处于渲染管线比较靠前的阶段,是因为背面消影是成片的去除三角形面片,效率很高,而深度测试是一个一个像素的测试,效率低下,提前做背面消影处理可以成块剔除大量顶点。
但是,必须明确一下,虽然我认为没有背面消影处理,仅仅有深度测试,也能正确绘制出图形(只是效率低了),但反过来,即仅仅有背面消影,而没有深度测试是不能够正确绘制出图形的,下面这个图形可以体现出来(我也是见到了这个图形,才产生了本文)。
上图中,“用法向量判别法”指的就是背面消影,“做更多测试”就是指做深度测试。
从上图中容易看出仅仅用背面消影,阴影部分的面整个面都应该是可见的,因这个面朝向视点,但实际上这个面有一部分是应该被其它面遮挡住了,所以只有部分可见。
下面补充背面消影的概念:
我们知道如果在渲染过程中多边形越多,那么要不处理的内容就越多,就越消费计算机的处理能力。对于物体来说,一般我们只看到它面对我们的面,可能不是正对着,但是肯定有很多面是完全背对我们的,我们就应该在渲染时跳过他们。这将减少大约一半的三角形渲染量。原理其实很简单,就是向量与平面的关系,这个原理我在参数化直线与平面的那篇文章中特意推导了整个来龙去脉。
我喜欢在2D俯视图中来分析问题,如下图:
上图就是背面消影的原理图。注意图三角形每个边都代表一个面(垂直于屏幕的面)。
更多细节的东西和深度的东西,参见博客:http://blog.csdn.net/cppyin/article/details/6207206
下面补充一点深度测试需要注意的地方:【仅个人入门理解】
为什么深度测试是不是基于顶点的?
深度测试需要注意两个三角形面片相交的情况,此时两个三角形面片就没有绝对的谁在谁后面之说了,可能一个三角形面片上的某些点靠视点近点,但其它一些点靠视点原点(相对于与它相交的三角形面片)。这也是为什么深度测试不是基于顶点的,而是基于像素的(更准确的说是图素,我也对像素和图素的区别模模糊糊)。