分享

详细的学习一下BF算法引擎具体是什么原理

 步行d天涯 2019-08-08

今天我们来详细的学习一下BF算法引擎具体是什么原理。运算上我们在上一遍文章里已经了解过了,所以这里就不再多说了。首先我们要知道BF算法。

根据我们所说的:它会从摄像机投射出搜寻光线,那么他到底投射出了多少条搜寻光线呢?图中假设在生活中有一面墙和一盏灯。事实上这个灯会投射无数条光线到这面墙上;也会反射无数条光线到摄像机里面.同时墙面上有无数个点,每个点都有它不同的亮度,所以最终才构成了这面墙整体给我们看到的光照感觉。

我们先看一下需要渲染的图像,生活中与计算机里有什么不同呢?在计算机中我们所看到的只是图像而已,那这个图像又是如何构成的呢?

我们来看一张例图,文中图像是由一个一个的像素点构成的,这一点只要是学过平面知识的应该都很清楚。计算机中的图像它都是由一个一个像素点组成的。每个像素点都是一种颜色,不可能有第二种颜色变化。

 

BF算法会向每个像素点都投射一条搜寻光线,所以它不可能是一种无限的运算。因为生活中的一面墙的点数可以说是无数个,你甚至可以细分到原子。但是在图像里面最小的就是一个像素。

那么这个图像到底是多大呢?在这里可以看到它是640乘以480这么大。也就是说横向有640个像素点,纵向有480个像素点。所以用BF算法总共投射了多少条射线呢?结果就是640乘以480条射线。所以它的搜寻光线很容易从分辨率表现出来。

 

那么如果我选择的分辨率比如是800600,那么从摄像机发出的搜寻光线就是480000个搜寻光线,我们把这种预测方法称之为每点采样(就是每个像素点它都会发射一条网线)。很显然这种方法渲染效果会非常好,但是运用这种方法渲染的时间肯定会特别长。这是为什么BF算法用的并不是很多,只在某些特定条件下使用的原因。就在于它是每一点采样。也就是说BF会对当前摄像机所能看到的所有物体形成的图像的每个像素点,都发射一条搜寻光线。

然后我们再看第二个问题,看下文的图解。假设从摄像机发出一条搜寻光线,搜到了红框中的这个像素点。那么运算这个点的亮度是多少?(在这里只说它的间接照明,不说直接照明)要知道这个点的亮度是多少时,要综合考虑它可能会从哪里地方获得光线。可能从屋顶、地面、左墙壁获得。

 

所以如果想把这个点的间接照明算的准确,那么是不是从更多的途径获得光线才能算的更加准确呢?所以就会出现这样一个问题:这条搜寻光线到达红框点的时候可能会分成好几条,以便运算它这个效果。这种效果感觉像分裂,从更多的地方获得光线才会运行得更准确。那么到底分裂出多少条呢?事实上他分裂的是64条。

 

为什么是64条呢?大家看我使用BF引擎的时候,这个细分值是8,8的平方正好是64. 这就是这个值的意义。它代表搜寻光线分裂成多少条。如果这个值是10,那就分裂成为100条。所以算红框点的间接照明时会从64个地方获得它的间接照明信息。这就是细分值的意义,下面的反弹先不用管。

在这个图解里,它只表现得出了三条红色的光线。假设图中的搜寻光线设定为8,肯定会分裂成64条。如果我们的二次引擎仍然使用BF算法,反弹次数为3.那么搜寻光线在1号框点位分出64条,其中一条它会运算2号框点位的间接照明。那它运算2号框点位的时候会不会再分裂成64条呢?就不会了。

图解旁边说的很清楚,红色线代表主反弹运算,是很多光线在被运算;蓝色的这个是二级反弹,可以看到二级反弹显示的是一个单一的光线将被集中。也就是说它的分裂仅发生在第一次,之后分裂出的光线再进行运算时只是一条单一的光线。这就是BF算法的一个原理。

所以说BF算法首先只会对它所能看到这个部分进行搜寻光线的发射,同时对看到的每部分进行精确的运算。但这会使很多人产生误解,这样的话是不是一个全场的运算呢?什么叫全场运算:就是把场景中的所有物体(不管看的见还是看不见)的各处的受光效果都运算出来,这叫全场景运算。那么BF算法不算是一种全场景运算。

 

  为什么这样说呢?全场景运算就等同于把整个场景中的每个像素点都算一遍,但是BF算法不需要,它只会对当前摄像机能看到的区域投射搜寻光线。

可是你可能会问:当它搜寻到1号点的时候那2号点难道不运算吗?对,这个2号点肯定是会运算的。但是会有这样一种可能不会:所有的搜寻光线都没有反射到2号红色区域这一块,也就是说无论怎么反弹都没有反弹到这一块儿,他就不会运算这一块的受光效果。

所以事实上它这个速度还是比较快的。也就是说BF算法会把它看到的地方进行一个精确的运算。它所看到的某些地方可能也会运算,否则的话没法算出它所看到区域的亮度。但并不代表它会把场景中所有物体都运算。所以从这一点来说BF算法并不是一个全场运算的算法,这个要注意。

这些引擎除了光子图,其他的都不是全程运算。这是为什么有些时候使用的方法运算会很快,有的很慢。那么以上所说的就是BF算法它的原理,包括图中两个参数的用途。

 

在这里一定要把引擎的反向运算掌握好,然后搭配它这些参数,就能很好地理解V Ray到底是如何计算的照明效果的。这样的话当我们再学习一些复杂的引擎时,很多参数就会变得非常的简单了。

今天我们通过一个引擎来了解反向运算的的原理。

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

 

这个是摄像机的视图。

 

在这简单的加上了一个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图解主要是给大家说明什么叫反向运算。虽然这几个引擎的算法都不相同,但毫无例外的是他们都是反向运算。不同的是他们的采样点等等,但这个反向原理是一模一样的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多