反向运算原理详解(BF引擎)

大家好,我是逆水,今天我们通过一个引擎来了解反向运算的的原理。

这是一个简单的场景:在这里我们加设了一架摄像机,摄像机所看到的是相对应位置的物体。

 

这个是摄像机的视图。

 

在这简单的加上了一个V Ray的灯光。我们先渲染一下,注意在渲染前了GI(也就是全局照明)并没有打开。

 

我们看一下现场结果图,由于没有开启全局照明所以出现了层黑的地方。原因就在于它仅计算直接照明,不计算间接照明。导致这些位置无法获得直接光照。我们先将当前效果保存一下,同时启用全局照明,二次引擎我们选择无,就是不打开,所以也不进行二次反弹。首次反弹引擎我们选择BF算法。BFbrute force的缩写,意思为蛮力或暴力运算的方法。

 

选择这种方法的时候下面就会出现它的参数。也就表示着选择不同的算法,下面就会出现不同算法的参数。选择BF下面就是BF算法的参数,它有两个值包括细分和反弹。当前反弹是灰色的,表明不可用。

 

然后我们先渲染一下看一下效果,对比一下二者的不同。渲染完成我们会发现渲染的时间大大地增加了,这次用了52秒之前只用了4.8秒。注意:最后渲染得出的效果图都放在最上面。同样,上面的设定为A,下面的设定为B。会发现层黑的地方消失了,整个图像变亮了。

 

原因就在于它运算了间接照明,这样层黑的地方就消失了。那么具体是一个什么样的原理呢?大家要注意这个原理很重要,便于你理解其他的知识点。

我们做一个矩形表示一个屋子,然后架上一台摄像机。首先摄像机会发射出搜寻光线,这个搜寻光线范围就在摄像机所能看到的物体范围内。摄像机看不到的它不会发射搜寻光线。

 

当搜寻光线发射到图中的红放框点内的时候,它会判断一下这个点的亮度是多少。那么这个点多亮由什么决定呢?肯定是由直接照明和间接照明来决定。此时判断一下这个点有没有收到直接照明。有的话就先算直接照明,再算间接照明。如果这个点没有直接照明,那么就直接运算它的间接照明。就是这样一个道理。所以我们对比一下,可以看到有直接证明没间接照明的区别就在这儿。

 

之前这些点是纯黑的,是因为在这些区域只运算了间接照明。而图中的瓶子你会发现也变亮了,这是因为除了直接照明,又运算了它的间接照明,所以它就会变亮。

在这儿要改变一下思维。因为正常生活是这样的:比如这个球体就是灯(光源)。光源发射光线,摄像机会发出搜寻光线。比如这个红框内的点,搜寻光线会算一下这个点有没有直接照明,如果有就先算一下直接照明。然后再算它的间接照明,但是这个间接照明有个问题:就是这个间接照明从哪来的?有可能从屋顶来的,也有可能从地面来的。为什么这样说呢?因为你会发现,如果正向运算的话,灯光会发射光线到屋顶然后反射到这个点上;灯光也会发射光线到地面再反射到这个点上;它也会发射光线到左边这面墙然后再反射到这个点上。这都是有可能的。

 

所以我们现在就只说其中的一条,其中的一个可能。

摄像机发射搜寻光线到这个点上的时候,发现除了直接照明,它的间接照明来源于屋顶,从屋顶的点反射到右墙壁上的点。那么屋顶上的点的亮度是多少呢?V Ray BF计算屋顶点的亮度是多少才能算出它反射到墙壁点的光线亮度是多少。注意屋顶点的亮度同样也要算直接照明和间接照明。

  但是在我们的实例里屋顶点是不会运算间接照明的,为什么这样说呢?因为我们之前把二次引擎选择了无。只有首次引擎的运算,也就是说只有第一次反弹运算。

所以它最终的算法是这样的:首先发射出搜寻光线,搜寻到了墙壁上的点,然后算出这个点的直接照明,接着算它的间接照明。其中的一条线算到了屋顶上的这个点,然后再算一下这个点的直接照明,不再继续算。而在生活中这个点也有可能从其他地方反射过来。比如灯光发出的光线可能会照射到左边的墙,反射到地面,再反射到屋顶点上,这种情况是有可能的。

以上整个过程叫首次反弹运算。要注意屋顶上的点只算直接照明,不算间接照明。

然后现在呢我们把二次引擎也选择BF算法,注意如果你二次引擎选择了BF,下面的反弹不再是灰色,里面的数值是可以使用的。比如数值选择反弹一次,我们先渲染一下做对比然后再看图解。

 

渲染完毕后同样点一下保存,这次用了128秒,做一下AB对比,会发现加入了二次反弹之后图像明显比原本亮了。原因在于什么呢?

 

在于把二次引擎打开了,并且使用了BF算法,选择反弹次数为一次。此时运算同样的墙壁点位,反射到屋顶这个点,同时运算它的直接照明并且运算它的间接照明,运算它有没有从其他地方反弹过来的光线。因为反弹次数是一次,所以当他运算这个点时只运算直接照明,不再运算间接照明。

如果反弹次数为二会是什么结果呢?比如反弹次数为二,搜寻光线搜寻到这个点,再到屋顶,然后运算到地面。现在还运算吗?任然还运算,因为二次反弹只运算了一次,也就是首次反弹。所以它会继续运算到左墙上的这个点。之后这个点还会不会再运算?不会运算了,直接追溯到灯光就可以了。这是因为反弹次数是两次。

  从这下图可以看出:一段是首次反弹,二三段是二次反弹,追溯到光源的那条就不叫反弹了,因为直接运算到灯光处了。也就是左墙点只运算它的直接照明不再运算它的间接照明。这就是反弹次数的意义,同理也可以理解三次、四次反弹次数了。

 

很明显,运算次数越多将导致这个点运算获得的光线越多,所以它就会更亮一些,最终将导致摄像机搜寻到的右墙点的亮度也会更亮一些。这就是为什么反弹次数越多得到的图像就越亮,照明效果也越准确,就是这个道理。

下面我们再把反弹次数改为三次,刚才128秒是反弹次数为一的效果,我们改为3后来对比一下效果有什么不同。

可以看到这次用了两分半钟才把它渲染完毕,时间明显比反弹次数为一的时候长。同样做一下AB比对,会发现亮度变的更亮了。到这个地方就能够理解这种反射到底是如何完成的。

那么我们再看一下官方的Brute Force GI图解。可以看到红色代表首次反弹,摄像机发射出的搜寻光线照到了墙壁点上,运算这个点亮度除了直接照明,还运算出了间接照明。从这个图解中可以看出来源有三处:屋顶、地面、地面上的物体。其中屋顶这一条在算亮度的时候它的亮度是多少呢?

如果需要运算它的间接照明的话,你会发现这有一个蓝色条提示你这是二级反弹。这是为什么到这儿它会变成一个蓝色的箭头。如果你二级引擎没有打开,屋顶点就不会再进行运算了,直接运算到灯光,算它的直接照明,到这所有的运算就都完成了。

Brute Force GI图解主要是给大家说明什么叫反向运算。虽然这几个引擎的算法都不相同,但毫无例外的是他们都是反向运算。不同的是他们的采样点等等,但这个反向原理是一模一样的。

那么今天呢,就给大家分享到这里,如果你觉得文章对你有帮助,希望将网站分享给你的朋友。感谢大家支持!

1
封面图

评论0

请先

社交账号快速登录