MAYA Ambint occlution(环境光)教程

修改
鏉ユ簮: xitele 浏览 10008 日期 2010-12-08 0

Ambient occlusion也就是大家熟知的环境遮挡,.简单点说,就是一个取样点上被其他几何体覆盖的程度,它是被通常用来模拟全局光照效果的简单方法。 环境遮挡的原理: 基本的原理跟final gather 类似,其取样点的生成是一样的。

首先从摄像机发出取样光线,取样光线和物体的交点,就是我们说的取样点,然后从取样点发出次光线(probe rays)。 接着ambient occlusion和fg就不一样了。ambient occlusion的次光线是求每一条光线是否被周围的物体所遮挡,如果遮挡了直接返回值,不做任何的shader计算,也就是取样点的周围被物体阻挡着不让看到背景的百分比;fg的次光线不太一样,他的次光线与周围的物体相交以后,它要求焦点处的颜色值,然后返回的是颜色值,而不是ambient occlusion的真假值。

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

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

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

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

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

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

在mental ray for maya中实现起来很简单,只需要将mib_amb_occlusion节点参数中的inflective打开就行了

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

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

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

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

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

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输出的是摄像机坐标系。

模式3,摄像机坐标系

mib_bent_normal_env其实是为了加速环境遮挡所制作的一个节点,在动画中对于我们场景中的不移动不变形并且没有别的物体接近一直影响到他的受光的物体,我们就可以采用这种方法来,所以局限性很大,但是带来的最大的好处就是渲染速度的巨大提升,因为我们不用跟踪任何一条光线。我们可以预先将环境遮挡和bent normal烘焙成纹理文件,我们也可以用lightmap节点帮我们将文件保存进纹理文件,连接的示意图如图:

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

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

我们在ps中举个例子。下面是我们渲染的两个层,一层是color层,另一层就是occ层。

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

到此为止,我们的环境遮挡就讲到这里了。

,

评论

{{ username ? username.charAt(0).toUpperCase() : '?' }}
Ctrl+Enter 发布
{{ (c.username || c.author_name || '?').charAt(0).toUpperCase() }}
{{ c.username || c.author_name }} {{ Utils.formatDate(c.created_at) }}