在實拍素材與三維素材進行合成時,對三維素材進行與實拍素材相匹配的景深的處理,如加入大氣效果,影深等,能極強地增加三維素材的真感。但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,為黑色。