在实拍素材与三维素材进行合成时,对三维素材进行与实拍素材相匹配的景深的处理,如加入大气效果,影深等,能极强地增加三维素材的真感。但Maya渲染用于确定深度信息的Depth Channel却不能消除锯齿。与经过消锯齿处理的RGB通道图像在边缘上无法完全匹配,在合成时边缘的处理上会带来很多问题。
既然MAYA自身无法完美地渲染出Depth Channel,我们就必须要使用其它的办法来解决。Depth Channel实际上是以灰度信息来表现每个像素点离摄像机的远近,而且其远近距离也只是一参考量,以镜头中离摄像机最远的像素点为黑,最近的像素点为白。基于这种原理,我们可以用maya强大的材质系统来模拟出这种黑白关系,再用Software以抗锯齿的方式渲染出来,就可以得到与RGB通道图像完全匹配的Depth Channel。
最简单的方式是在从摄像机的水平面向所有物体投射一个黑白渐变的Planne Map。首先建立一个Surface Shader,并在Out Color通道上贴上一张Ramp贴图,注意2D Texture选择As Projection。
把SurfaceShader1材质赋给场景中的所有物体,在HyperShader中选择Projection1,在Persp视图中调整Projection1的大小和位置,使之Projection1与为摄像机的水平面平行,并且是远黑近白。
渲染时时把反锯齿与渲染RGB通道图像的设置设为一致,不渲染Alpha通道,把它作为普通的RGB图像进行渲染。最后再把渲染好的灰度图像在后期软件中进行合成,把它作为RGB通道图像的的Depth Channel即可。
这种方式只是简单地计算平面之间的距离,但却简单易行,可以用于绝大部分的环境中。如果在对景深要求非常精确的微距镜头中,就需要用第二种方式来精确地计算每个像素点到摄像机之间的距离。
使用Connecttion Editor把SamplerInfo的Point Camera属性值输出给DisanceBetween的Point1属性。
把DistanceBetween的Distance属性输出到SetRange的ValueX属性。把SetRange的Min和Max分别设为0和1,Old Min和Old Max分别对应场景中物体离摄像机最近和最远的距离,这个距离值可用DistanceTool来测量。
把SetRange的OutValueX输出到Ramp的vCoord。再把Ramp设为黑白渐变,并把Ramp输出的颜色连接到SurfaceShader的Outcolor上。这样精确计算Depth Channel的Shader就制作出来了。
现在再来回头看看它的原理,首先,我们从SamplerInfo的Point Camera属性中得到每个像素点在摄像机坐标系下的空间坐标。然后输出到DistanceBetween节点的Point1中,DistanceBetween节点用于计算两个矢量之间的距离,现在我们需要求得摄像机坐标和每个像点坐标之间的距离,由于得到的像素点坐标值是以摄像机坐标为原点的,所以distanceBetweem的Point2值为0即可。再用SetRange把所有的距离值归范为0~1之间。再输出到Ramp贴图上。即最近的值为0,为白色,最远的为1,为黑色。