计算机图形学_华中科技大学_中国大学MOOC(慕课)


9.3_光照明模型_上_Phong模型初步

首先,我们来看看光照模型发展的历史。

在1967年,Wylie等人,第一次在显示物体时加进了光照的效果。并且,认为光强与距离成反比。

进而在1970年,Booknight提出了第一个光反射模型。

主要就考虑了lambert漫反射加上环境光。

紧接着,1971年高洛德提出了漫反射模型加插值的思想。

到了1975年,冯提出了图形学中第一个有影响的光照明模型

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

此后,又有了全局光照的概念。所谓全局光照,就是除了考虑直接光照,还考虑间接光照。这样的一种渲染技术。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

首先我们来看环境光。

在没有光源的地方,景物没有受到光源的直接照射,但是它的表面仍然有一定的亮度使他们可见。这是因为光线在场景中经过复杂的传播之后,形成了弥漫于整个空间的光线,称为环境光。

环境光不是直接来自光源的,而是来自周围的环境对光的反射。

环境光的特点是照射在物体上的光,来自周围各个方向。又均匀地向各个方向反射。 就是这幅图画出来的。

物体上某一个点P所接收到的环境光,来自于它周围其他点发出来的反射光。而其他点发出的反射光又可能受到P点所发出的反射光的影响。

在辐射度方法中,将精确的模拟这种效果。可是在这里,会近似的认为同一环境下的环境,光是恒定不变的,对任何物体的表面都相等。

那么我们这里设IA为环境光的强度,于是,P点对应着环境光的反射强度,就是IE。这个IE就等于IA再乘以一个KA。这里的IE是环境光的反射强度。IA是环境光本身的强度,而KA是这个物体表面对环境光的反射系数。在同一环境光的照射下,物体表面呈现的光强未必相同。

这就是因为他们具有不同的KA。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

我们看漫反射光。

由于在简单光照明模型中,是采用的点光源照射物体。我们可以看看点光源发射的光线路径,比如在这幅图中,点光源,位于空间的某个位置的这个点向周围所发出来的这个辐射度。

我们看这幅图,点高原在中心这个点上向周围所有的方向上辐射等光强的光。我们把这个光强计为IP。在点光源的照射下,物体表面的不同部分亮度就不一样了。亮度的大小,依赖于它的朝向以及它与点光源之间的距离。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

那么再一个粗糙的无光泽的表面呈现就是漫反射。

当光线照射到这样的一个表面上的时候,光线沿着各个方向,都做相同的反射。所以从任何角度去看这种表面,都有相同的亮度。

漫反射的特点是,光源来自于一个方向,反射光均匀地射向各个方向。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

Phong光照模型 Id = IpKd * (L*N) //N*L就是Cosθ

物体表面P点,法矢量为N。

从P点指向光源的矢量为L,N和L的夹角是θ。

那么由Lambert余弦定理就可以得到在P点处的漫反射光强即为Id=IpKd * cosθ

Ip是入射光的强度,也就是点光源的光强

kd就是漫反射系数。而且,它由物体材料属性以及入射光的波长决定的。

θ就是这个角度,它的取值,在零到π/2之间。

从这个式子我们可以看出来,漫反射的光强只与入射角有关,而与反射角无关,也就是说与视点的位置没有关系。你这个是视移动到任何一个地方,观察到的漫反射光强都是相等的。

那么如果说θ小于零,或者说西θ大于π/2,那么这个光线可能就被物体自身遮挡而照射不到这个点上了

如果说把刚才的L和N都规格化为单位矢量,那么实际上刚才的cosθ就等于N和L这两个单位向量的点乘。

所以之前的对于Id的计算公式,就可以这样表示,Id等于Ip乘以Kd,再乘以L与N这两个单位向量的点乘结果。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

上面的光强计算,假定是只有一个点光源的,实际上有可能有多个点光源,比如说M个,那么漫反射的光照模型计算,也就是这M个点光源对应漫反射的叠加。所以这里的Id对应的就是一个Σ的一个求和。那么这里的求和I从1到M,对应着这M个点光源。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

镜面反射_Is = Ip * Ks * (R * V)^n

就遵循着反射定律了,反射光位于表面法矢的两侧。

对于理想的高光泽度反射面,反射角等于入射角的时候。光线才会被反射。也就是说,只有在等于入射角的反射角方向上,观察者才可能看到反射光。对于这种理想的反射面,镜面反射的光强,要比环境光和漫反射的光强高很多倍。这时候,如果观察者正好处在这个P点的这个镜面反射方向上,就会看到一个比周围亮得多的一个高光点。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

往往是非理想的反射面,只要它的表面是光滑的,比如说金属,或者瓷器的表面,那在点光源的照射下,也会产生一块特别亮的区域,我们把它叫做高光点,尽管这个时候镜面反射光的强度会随着这里的标出来的阿尔法角的增加而急剧的减少。但是观察者还是可以在阿尔法角很小的情况下接受到这种改变了方向的一部分的镜面反射光。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

所以,这种镜面反射情况,由Phong模型给出,就是这样的。

就是这里的Is代表它的反射出来的光强于等于IP乘以Ks,再乘以cos阿尔法的N次方。这其实是一个经验模型。

Is就是镜面反射光在观察方向上的光强了

Ip还是点光源的强度

Ks是这这个表面镜面反射的系数。

阿尔法就是视点方向V与镜面反射方向R之间的夹角。

那么如果R和V把它规格化为单位矢量,那么刚才的计算式又可以这样改变了,因为cos阿尔法就等于R和V的点乘的结果,所以说刚才的公式这个地方,就变成了R乘以V,然后再N次方。

N是与物体表面光滑度有关的一个常数,表面越光滑,N就越大。

左边的显然更光滑,那么这时候N相对较大。可是它对应的光斑反而更小。

右边的这个更粗糙,N也相对就比较小。可是它对应的光斑,就比较分散。

注意,镜面反射产生的颜色只是光源的颜色,在白光的照射下,高光点,就是白色。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

通过以上对环境光漫反射和镜面反射的分析。

我们知道从视点观察到物体任意一点P处的光强I, 应该是环境光反射光强I1。漫反射光强Id以及镜面反射光的光强Is的总和。所以综合起来,我们就得到了这样的一个公式,就把刚才的三个分量合计起来。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

那么大家看这样的一个球。这个球,分别的我们。这左边的三幅图,就是只给出了环境光漫反射和镜面反射的效果。

叠加以后就产生了一定的真实感

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

如果说N不同,也就是表面的粗糙程度不同,对漫反射和镜面反射的系数不同。我们也就会得到不同的计算结果。

那么这里需要补充说明一下

因为环境光Ambient的首字母是A

漫反射Difuse的首字母是D

镜面反射Specular的首字母是S

所以,我们刚才对应的下标分别就是A,D,S,这里补充说明一下。到这里,我们就明白了冯模型的基本思想。可是这个,距离我们实际的使用还有一个过程,包括计算。结合颜色模型。最终还要看再Opengl中如何处理。而这些内容,


9.3_光照明模型__Phong模型实现

上次课,我们为大家介绍了经典的光照明模型Phong模型。

知道通过环境光、慢反射光和镜面反射光,可以来模拟真实的光照。也得到了这样的一个光照的计算公式了。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

当然这里是一个点光源的情况。大家也会发现,

其实还是很复杂的。在实际的处理过程中,有时候会通过一些近似的方法对他进行适当的简化。

连接P点和光源,得到了矢量L。连接P点和视点,得到矢量V。当然,镜面反射方向R的计算,就更为复杂一些。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

在实际应用中,为了减少计算的工作量,我们进行了一些假设和近似。

比如说,我们假设光源合视点,都在无穷远处。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

那么视点在无穷远处就可以采用一个平行投影,这样的话,矢量L和V就变成了一个常量。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

另外再取一个矢量H,让H是L和V加和的二分向量。之后,我们就用HN来近似RV。这样一来,光强I的计算公式就变成这个样子了。

这里的H当然也规格化为单位矢量。由于假定L和H都是常量吗,所以H就只需要计算一次。很显然,这是简化了计算。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

贝塔就是H和N之间的夹角。阿尔法是R和V之间的夹角。

我们可以看出来,西塔加上这个贝塔等于两倍的西塔加阿尔法,然后再除以二。所以我们也可以得到,贝塔,实际上是阿尔法的1/2。

显然贝塔和阿尔法其实是成了一个线性的比例关系。

当阿尔法变化的时候,贝塔会随之变化,只不过,它的变化幅度只有阿尔法变化幅度的一半。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

显然对比这两个公式,在近似计算以后,这个高光区域就变大了。是,所以就会产生这样的误差。其实,即便近似之前我们的光照计算公式也只是一个经验公式。所以只要适当的调节N的大小,通常,大家知道表面越光滑N就越大,  高光区域也就越小。那么我们,也可以根据刚才的近似,适当的把它调整一下。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

刚才的光强计算,是一个点光源的。

如果说在场景中有M个点光源,就可以在任意点P上叠加各个光源产生的一个光照效果。

所以大家会看到。除了环境光以外,另外与点光源相关的漫反射和镜面反射都有一个西格玛求和。都需要从一到M对M的点光源的。累积效应进行一个求和计算。为了保证每个点的光强不超过某个上限,也可以对光强计算公式设置一个上限,如果超出,就取为上限就可以了。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

其实,在光照过程中,还有一个现象我们是需要考虑的,那就是光强的衰减。

在同一个光源的照射下,一句光源比较近的景物看起来就会亮一些,而聚光源较远的景物看起来会暗一些。这是因为光在传播的过程中能量会发生衰减。如果要得到真实感的光照效果?就必须要考虑光强的衰减了。否则就会影响真实的效果。比如,当有两个具有相同光学参数的平行表面互相遮挡,一个前一后。那么我们就没有办法把他们区分开来了,因为它显示出来的结果是颜色值是一样的,感觉就好像是一个表面了。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

辐射光线从一个点光源出发,在空间中传播的时候,它的强度按因子D的平方分之一进行衰减。这个D,就是光传播的距离。

那么这就表明了一个接近光源的表面将得到较高的入射光强度,而较远的表面,强度较小。但是,如果采用这样的衰减因子D很小的时候衰减因子会产生过大的强度变化。而D很大的时候,变化又太小。所以如果用这样的一个衰减因子,也就是D方分之一。那么简单的点光源照明产生的效果真实感并不强。于是就有一个改进的方法,就是使用了一个D的线性或二次函数的导数来实现光强的衰减,从而弥补点光源的不足。比如一个常用的二次衰减函数是这样的,这里的f(d)等于 在一和后面这个值中取最小值。那后面一个是C0加上C1乘以D加上C2乘以D的平方它的导数。其中,D,当然还是光的传播距离了,显然f(d)的取值范围,是不会超过一的。另外,用户还可以通过调整系数C0C1C2,来得到场景中不同的光照效果。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

那么通过衰减因子的加入,刚才的光照计算方式,就变成了这样,看到在漫反射和镜面反射中,分别的就加入了f(d)这样的衰减因子。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

实际上,在有了冯模型之后,未产生彩色的光照明场景,还要完成如下的两步

一个是选择合适的颜色模型。

二个,是为颜色的分量分别建立光照模型。

那么比如我们选择RGB颜色模型,那么环境光的强度就是这样子的。

那么其中的IaR和LaG以及LaB分别是红绿蓝的三个分量。

同样的,入射光的光强也可以表示为它的红绿蓝三个分量。

相应的,环境光的反射系数ka也可以表示为这个形式。

那么这里的KaR,KaG,KaB分别是,对RGB3个颜色通道的反射系数。

类似的还有漫反射系数KD和镜面反射系数KS

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

于是光强,就可以针对三个颜色分量分别的来算了,比如这里的是红色分量的一个颜色值。另外还有对应的绿色和蓝色。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

看看这样的一些效果的对比。比如对于左边的这个环如果值调高红色分量对某一种光的反射系数。我们就可以得到这中间的这三个结果。

如果把这三个反射系数都调到最高,就可以看到最后的这幅图

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

同样,我们也可以提高绿色分量的反射系数或者蓝色分量的反射系数。也可以得到对应的结果。看到这个结果也是完全不同。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

马赫带效应

在之前我们已经提到过两次了,并且说明了高洛德的着色和冯着色是可以改善马赫带效应的,今天我们重提他。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

其实,它的去除。有一个方法就是多边形细分,大家想一想,如果细分得到很多的多边形。马赫带效应肯定会削弱。

然后再就是之前讲的高洛德插值的方法。也是有一定效果的。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

而我们今天想说的还是Phong的明暗处理。

那么多边形内部。我们会得到每一个点不同的这样的一个法矢量。

再获得了这些法矢量之后,就可以对多边形内部各个点进行光照计算了。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

这样得到的效果明显好于高洛德着色。大家看看这两幅图的对比。但是同时,很显然它的计算量也就更大。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

以上,就是冯模型在实现的时候的一些具体的问题。

其实在opengl中,我们甚至基于冯模型来模拟平行光点光源和聚光灯的效果。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

对于平行光,就是在刚才冯模型的基础上,我们把衰减因子去掉,因为平行光,又叫定向光,感觉从无穷远处照射过来的,而且不管哪里感觉光强就差不多。没有什么衰减。所以,我们就去掉衰减因子。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

第二个,点光源就完全对照到刚才的Phong模型。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

第三个就是聚光灯。聚光灯,这个很特殊的现象,就是有一个光锥的感觉,而且有内圆锥和外圆锥,从内源锥到外圆锥,它是一个渐变的一个过程。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

这里就是平行光实现的典型代码,大家看到主要就是环境光、漫反射和镜面反射三个分量的叠加。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

变为点光源就有距离的衰减了,所以这里加上了距离。这里的d以及关于距离的衰减因子的一个计算。

时候返回的颜色值,大家看这里乘上这个衰减因子了。这样就可以实现距离越近的越亮,距离越远的越暗的效果。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

如果是聚光灯,也可以通过冯模型来模拟,这里为了使聚光灯的效果看起来边缘更加圆滑。我们就要模拟聚光,有一个内圆锥和外圆锥的感觉。

通过内外圆锥之间的余弦值差来计算聚光的强度。那么这里,就有一个clamp函数,把聚光强度约束在零到一之间了。最后形成的颜色值在漫反射和镜面反射分量上需要乘以聚光的强度。环境光是不用管他的。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网


9.3_光照明模型_下_全局光照

除了直接光照,还有一种加入了间接光照的全局光照。

从某种意义上来说,全局光照也是属于物理渲染的范畴因此

这两幅非常著名的图最初来自卡内基梅隆,后来被Physically_Based_Rendering选作封面。

通过这两幅图,我们可以很好的解释全局光照。

全局光照。简称GI或者又被称为间接光照。

它是只考虑场景中直接来自光源的光照,又考虑经过场景中其他物体反射后的光照这样的一种技术,使用全局光照,能够有效的增强场景的真实感。比如,这里右边的这幅图,大家可以看到,加入了间接光照之后,在原来直接光源照射不到的地方得到了更好的亮度和细节的表现,从而使整张图的渲染效果更加真实。因此,我们说全局光照就等于直接光照加上间接光照。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

间接光照来自哪里?

他们一个来自于其他物体反射后照射过来的光照。

如果这个物体有一定的透明度,是不是能透过这个物体看到折射光呢?

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

可是这样一来,之前的冯模型就不适用了。

我们需要引入一个新的光照模型,那就是Whitted光透射模型。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

首先,假定透过这个物体可以看见折射光,需要在原来的Phong模型基础上,加上一个透射光光强

那就是这里的It乘以Kt。

It是折射方向的光强

Kt是他的透射系数。

这时候光照着色计算公式就变成了这样,在原来的Phong的模型的基础上加上了一个It乘以Kt

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

我们继续在假定这个物体能镜面反射,也就是他能镜面反射别的物体反射过来的光,这个时候是否需要增加一个反射光强?

这个反射光强,就等于Ir乘以Kr

Ir是入射光的强度,也就是来自别的物体的反射光到这里就成为入射光了。

Kr是它的反射系数。 

这时候,光照着色,计算又发生了变化。在刚才的基础上又增加了一个反射光强分量Ir乘以Kr

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

因此,到这里我们就可以看到光照模型经历了从Phong模型到BlinnPhong冯模型再到Whitted的发展。

好的,我们就会以这个为基础。讨论全局光照的问题了。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

其实经过几十年的发展,全局光照也有各种实现的方法,常见的主要算法流派就有很多。比如光线追踪,路径追踪,光子映射,基于点的全局光照,基于体素的全局光照,环境光遮蔽。

而其中的每一种流派又可以划分为N种改进和衍生的算法。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

比如以光透射为基础的光线追踪,结合蒙特卡洛方法,也就衍生出光线追踪算法。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

而我们今天将重点给大家介绍经典的光线追踪算法。

光线追踪的基础,是光线投射。它作为光线追踪算法的第一步

其理念,起源于1968年,具体思路是从观察平面上的每一个像素射出一条射线,找到最接近的物体,挡住这个射线的路径。

比如这个像素,我们找到了最接近它的这个物体表面,这个表面在光照作用下产生的颜色值就是这个像素的颜色值。

但是这个时候并没有考虑其余物体对它的影响

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

到了1979年,Turner Whitted在光线投射的基础上,加入了光与物体表面的交互。

就让这个光线在物体表面,沿着反射、折射以及散射方式继续传播,直到与光源相交,也就是逆向追踪光的传播过程了。

这个方法后来就被称为经典的光线跟踪方法。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

下面我们就来看看光线追踪模型的定义和主要思想。

它的定义是什么?

追踪光线的路径,然后模拟光线与对象交互。

主要思想

从视点向成像平面的像素发射光线,找到与这个光线相交的最近物体的交点。

如果这个点对应的表面是一个漫反射的表面,我们就计算光源直接照射该点的颜色值。

如果这个表面是镜面或者折射面,我们是不是就可以向反射或折射方向跟踪另一条光线?

如此递归下去,直到达到结束条件

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

下面我们就来看看它具体的过程

首先是第一种情况,这个点的表面,就是漫反射的表面。所以我们直接进行颜色计算就可以了

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

可是如果这个点对应的表面是镜面或者是折射面。就要继续向反射或折射方向跟踪另一条光线了。

比如这里,通过视点,可能看见的反射光就追踪到其余物体的表面。甚至最终,追踪到了光源上了,同时也可以看到这条折射光

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

我们通过这个投影的平面图来仔细分析一下

比如在这个P点上可以看到的光,可能来自于对R1的反射和看到折射光P1。

T1又可能来自R2和T2。

通过R2可以追踪到R31和T31。

T2又可以追踪到R32和T32。

而这里的T32可以追踪到R4和T4。

R4就可以追踪到R5和T5

显然,这是一个十分复杂的递归过程。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

哪里是递归的出口?

这里递归的结束条件有三种情况,

一个是追踪到光源了

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

一个是这个光线,逃逸出这个场景了,你就没有办法再继续追踪了。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

最后一个就是达到了预先设定的深度了,也就是递归的层次,比如这里追踪到第四个物体。

因为场景中有很多的物体都可能互相影响,如果都进行考虑,这个递归的层次就过深了,算法的计算量也会很大。

特别是在需要实时渲染的场景里,根本就没法承担这样的计算开销。因此,就会限定递归的深度,从而减少计算量。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

大家知道递归的过程,是一个后进先出的过程。在达到结束条件以后,逐层返回对应的光强,以便最终对P点的光照进行着色计算。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

那么到了P点,肯定还是用Whitted模型进行光照计算了,也就是在原来冯模型的基础上增加两个其他分量的考虑。

一个是透射光,一个是对其余物体照射过来的光的反射。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

这样一来就可以算出P点最终的颜色值,也就是采用这样的计算公式进行计算。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

可是这个模型也存在着一个问题

第一个是他的表面属性还是比较单一的,比如对一个表面,我们要么就是觉得他完全看不见透射光,要么就是能看见。这显然太武断了。

第二个是当一个物体的表面是漫反射的时候,索性就作为递归的结束条件了。而实际上,真实物体的表面是复杂的

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

怎么解决这个问题?

我们可以通过模型的修正来缓解这两个问题。我们可以把一个表面的属性认为是混合的,也就是说,它有20%的成分是镜面反射,30%的成分,是折射,而50%的成分,是漫反射。改进以后,这个算法就变成了从视点发出一条光线。光线与物体表面相交的时候,根据表面的材质属性继续采样光照方向。这个时候,就不是采样一个方向了,而是因为表面的多样性,有可能有多个采样方向。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

很显然,这个时候计算量很大,那么蒙特卡罗方法就是通过概率理论对这里的计算通过近似进行了简化。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

而引入了这个方法的光线追踪算法,其实就是路径追踪算法了。因此,路径追踪实际上就等于光线追踪加上蒙特卡洛方法。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

我们可以看到,无论是光线追踪还是路径追踪, 都可以达到比以前单纯采用直接光照更真实的效果。

在游戏_天国拯救中,我们可以看到开启全局光照前后的对比。

华科_图形学笔记_09_奇妙的真实感_片元着色01_02-编程知识网

总之,全局光照给我们带来了更真实的光照效果。其实,对光照模型的研究还在推进,比如最近的一本书,全局光照技术,从离线到实时渲染,这其中,就对基于体素的全局光照,基于距离厂的光照技术进行了介绍。相信通过这些研究,会让我们在今后获得更加完美的图形渲染效果。