讲解Ambient Occlution的原理与高级应用

导言:

Ambient occlusion也就是大家熟知的环境遮挡,简单点说,就是一个取样点上被其他几何体覆盖的程度,它是被通常用来模拟全局光照效果的简单方法。

下面教程开始

环境遮挡的原理

基本的原理跟final gather类似,其取样点的生成是一样的。

首先从摄像机发出取样光线,取样光线和物体的交点,就是我们说的取样点,然后从取样点发出次光线(probe rays)。

接着Ambient occlusion和fg就不一样了。Ambient occlusion的次光线是每一条光线是否被周围的物体所遮挡,如果遮挡了直接返回值,不做任何的Shader计算,也就是取样点的周围被物体阻挡着不让看到背景的百分比;fg的次光线不太一样,他的次光线与周围的物体相交以后,它要求焦点处的颜色值,然后返回的是颜色值,而不是Ambient occlusion的真假值。

最后也是不一样的,作为Ambient occlusion,每一个取样点其实就是渲染时输出的色彩值,而fg只是为渲染时的fg point,它代表着要渲染点附近的光照,在渲染时用来产生照明。(图01)

图01

 

下面我就结合MentalRay for Maya,跟大家一起讨论一下Ambient occlusion的一些应用。MentalRay for Maya中有三个节点是我们在使用环境遮挡时需要用到的,mib_amb_occlusion,mib_fg_ occlusion,mib_bent_normal_env,如下图。(图02)

 

图02

 

 

环境遮挡的使用

在介绍实际的应用之前,我们用一个简单的场景作介绍,场景中只有一盏物理灯。默认渲染如图。(图03)

 

图03

Ambient occlusion(AO)经典的环境遮挡效果,也被称为漫反射遮挡(Diffuse occlusion),可以用来缩放对材质环境光的贡献,它一般赋给材质的环境光参数(Ambient),更进一步说他最好赋给Lambertian材质。如下图。(图04)

图04

 

渲染的效果如下图。(图05)

 

图05

 

 

现在暗部的细节出来了,可见AO很好的模拟了全局光。

 

Reflective occlusion发射沿着反射光线的方向发射次光线,而不像Ambient occlusion那样以物体表面的法线方向为中心发射次光线,下面的示意图说明了之间的不同。(图06)

 

图06

 

 

在MentalRay for Maya中实现起来很简单,只需要将mib_amb_occlusion节点参数中的Inflective打开就行了。(图07)

 

图07

 

 

同时我们可以调整小spread的值为0.1,使得反射遮挡的效果更加明显,渲染效果如图。(图08)

 

图08

 

 

大家可以很明显的看到物体的暗部是沿着反射方向产生的。

 

我们可以给mib_amb_occlusion的bright的参数连接一个环境节点,使得环境对我们的材质有了影响,但这不说明次光线对环境光进行了采样计算,它只是把遮挡的结果与环境光简单相乘罢了,连接和渲染结果如图。(图09、图10)

 

图09

图10

 

第二种连接方法就是将我们的摄像机连接到环境球查询节点上,然后设输出参数为1(取样环境),另外可以选择occlusion in alpha,如图。(图11、图12)

 

图11

图12

 

 

从渲染结果来看,效果是一样的,但是他对环境球取样的阶段是不一样的。我们可以减小它的spread参数,也就是改变次光线取样范围,使得反射更集中,渲染如图。(图13)

 

图13

 

mib_fg_ occlusion的使用mib_fg_ occlusion其实就是一个选择器,也就是说如果在渲染的时候渲染全局中打开了final Gather,我们就用final gather来计算遮挡,反而反之,节点连接如图。(图14、图15)

 

图14

图15

 

 

mib_bent_normal_env的使用在讲mib_bent_normal_env之前,我们有必要了解一下mib_amb_occlusion其他的输出模式(output_mode)。

 

0是标准的遮挡模式,1是环境进行取样模式,2、3就是bent normal模式。所谓bent normal就是计算未遮挡的次光线,求平均值,所得到的就是bent normal的法线矢量,名字很形象。

 

矢量的三个分量的值分别对应纹理的RGB三个值,output Mode的模式2输出的是世界坐标系,模式3输出的是摄像机坐标系。(图16)

 

图16

 

模式2,世界坐标系。(图17)

 

图17

 

模式3,摄像机坐标系。(图18)

 

图18

 

 

mib_bent_normal_env其实是为了加速环境遮挡所制作的一个节点,在动画中对于我们场景中的不移动不变形并且没有别的物体接近一直影响到他的受光物体,我们就可以采用这种方法,所以局限性很大,但是带来最大的好处就是渲染速度巨大提升,因为我们不用跟踪任何一条光线。

 

我们可以预先将环境遮挡和bent normal烘焙成纹理文件,我们也可以用lightmap节点帮我们将文件保存进纹理文件,连接的示意图如图。(图19)

 

图19

 

我们连接的纹理文件(图中虚线框),一定要把writable选项打开,才能使我们的纹理写道磁盘文件上,连接图如下。(图20)

 

图20

 

烘焙完纹理以后,前期工作就算完成了,就可以用我们的mib_bent_normal_env了。

 

我们可以这样理解这个节点,他的作用跟把烘焙的纹理不但能直接加到物体的材质上,而且它可以是相对环境的反应,只不过我们要用一张环境贴图,而不是真实物体的影响。

 

这种方法主要是用在实时渲染(realtime rendering),也就是我们说的游戏中,能模拟很好的全局光照。下面是我们烘焙好的两张图,一张是环境遮挡,另一张是bent normal。(图21、图22)

 

图21

图22

 

 

环境遮挡

连接方法示意图。(图23)

 

图23

 

节点的实际连接图。(图24)

 

图24

 

环境遮挡的高级应用实际应用中,将环境遮挡,单独渲染成一层,然后再后期是使我们最常用的方法,因为只要我们不追求物理的真实度的话,这种方法是很灵活方便的。

 

我们在PS中举个例子。下面是我们渲染的两个层,一层是color层,另一层就是occ层。(图25、图26)

 

图25

图26

 

 

在PS里面我们可以把occ层设为mutiply模式,合成后为下图。(图27)

 

图27

 

在MentalRay中,我们可以把Ambient occlusion作为一个Light shader,成为灯光的内建环境遮挡,节点连接如图。(图28)

 

图28

 

渲染如图。(图29)

 

图29

 

我们可以分析一下,每个渲染点需要查询灯光,我们的灯光是环境遮挡Shader,他会返回这个点的照明强度为这个点的遮挡程度,背离灯光的地方,途中黑色的地方,因为它在灯光的阴影区,也就是说它不会去查询灯光照明强度的,因此没办法调用环境遮挡,从而成了黑色。

 

到此为止,我们的环境遮挡就讲到这里了,感谢大家看我的教程。

全教程完,学完记得交作业。如果本教程对您有所帮助,请推荐给你的朋友。

【原创教程 投稿邮箱: ps@16xx8.com】

长按二维码关注我们

关注我们微博:@photoshop教程论坛

推荐教程