這次的案子裡由於場景裡面預定出現的物件很多, 原本為了節省場景複雜度跟時間決定
大部分物件都採用把照片貼在板子上的風格. 沒想到在做完動態跟打光,
在出pass合成的階段卻遇到了麻煩.
原因在於MAYA裡透明貼圖其實沒有做的非常完美, 當使用透明貼圖時影子跟各種預設拆層
常會忽略掉alpha或是當重疊的時候計算錯誤. 經過一些研究後針對各種貼圖影子問題找出了
解決方法, 在這篇文章中分享. 下圖是一個簡單的例子, 將一張貼圖貼在lamber的diffuse上,
然後alpha貼在transparency上, 打一盞燈光, 影子採用raytrace shadow算出來應該會是長這樣
(葉子的白邊是因為只是先大概做個alpha, 請見諒. )
可以很明顯的看到地上的影子並沒完全透空掉. 而採用global render裡的預設pass
算出來各個分層會變成這樣:
現在問題就比較大條了, 不是沒有透乾淨, 是直接讀取不到貼圖的alpha訊息.
這邊就可以先用第一個解決方式:
請愛用mia_material_X_passes 材質
mia_material是mental ray裡面的萬用材質, 一個打死全部可以設定各種材質質感
對於這次的問題此材質也提供了良好得解決方案. 將貼圖貼到mia_material_x_passes
的diffuse, 而將alpha貼到Advanced/cutout_opacity上. (有alpha貼圖就直接拖上去,
帶在貼圖裡的話請用右鍵拖到mia上面, 將output_alpha接到cutout_opacity上)
算出來的結果會如下
這邊就可以看到影子已經正確的被透空, 至於其他算出來的pass則會如下圖
很遺憾的預設pass仍然沒辦法完全讀取到alpha資訊. 但是可以看到normal已經可以正確切割出來.
DEPTH雖然有讀取到但是卻出現了計算錯誤. 至於AO跟normalized normal vector則是不動如山
以下就針對這三個pass的解決方式分別介紹
Ambient Occlusion:
這個最簡單, 解決方式就是不要在pass setting中選取, 改由使用mental ray中的 mib_fg_occlusion
來直接算出AO效果. 連接方法如下, 這邊要準備兩組mib_fg_occlusion一組是給沒有透明貼圖的,
一組是給有帶alpha透明貼圖的
算出來結果會是像這樣
可以看到已經可以正確切出alpha的形狀了. 這個解決法速度快, 品質也不差, 但是因為預設必須使用FG,
所以會有以下幾個問題:
1 不能調整陰影的範圍濃淡, 這很致命傷, 但是因為目前還沒找到其他方法可以算出正確的AO, 用這方法雖然不能微調但是至少可以加減增加立體感.
2 因為是用FG運算, 所以品質不開高會有閃爍的問題. 由於此材質算圖很快, 所以accuracy我都直接拉到1024以上, 其它還有 point density 0.1以下, point interpolation 20~30
interpolation會決定FG ray擴散的範圍程度, 某種程度上算是可以調整濃淡, 但是開太高會散太開也會增加算圖時間, 需要自行取捨.
DEPTH:
這個pass需要用到第三方shader才能完美解決, 請到 http://www.puppet.tfdv.com/download/shaders_p_e.shtml
下載這個 P Shader包. 裡面有很多作者撰寫的shader, 其中我們會用到的是p_z_shader.
使用方法如下:
只要把p_z shader上到場景裡所有的物件算圖就好了. (記得一樣要分成沒有貼圖跟有貼圖的)
接著打開attribute editor, 有幾個地方需要調整:
Near/Far clip plane: 這兩個數值決定了算出來的DEPTH的前後距離.
建議用headup display的object detail找出場景中離鏡頭最近跟最遠的距離
分別填入near跟far裡面. 記得所有的shader的兩個數值都必須統一.
Opacity: 將貼圖的alpha貼到這裡就可以正確的透空
Float point output: 是否採取浮點小數運算, 預設是關掉的. 但是一般depth都會算成32bit float image
以求得足夠的深度資訊, 所以建議這邊將它勾起來. 算出來會是一片爆白而不是漸層灰.
但是那是正常的, 只要到合成軟體中調整到原本該有的灰階就可以了.
最後, 在算這個pass時建議把raytrace的refraction/reflection次數開高, 低於 4 的話
如果有多片疊在一起的地方會出現運算錯誤.
最後是MotionVector pass:
這個pass的解決方式更詭異, 它必須動用到一個隱藏版的shader. 什麼? 隱藏版?
對, 其實我到研究這問題之前也不知道mental ray其實有隱藏起一些shader,
需要做點事情把它們叫出來.
方法如下, 請到 Maya安裝路徑中找到
C:\Program Files\Autodesk\Maya2012\scripts\others\mentalrayCustomNodeClass.mel
用記事本打開之後往下找到這行
$enableMIPShaders == 0; 將 0 改成 1 後存檔後重新開啟maya.
開啟之後就會在 Hypershade中看到多出一堆mip開頭的shader, 而我們要用到的是其中的
mip_motion_vector
但是比較特別的是這個shader不是拿來上在物件上, 而是要跟算圖的攝影機做連結.
將mip_motion_vector用中鍵拖到攝影機上,
在connection editor中把mip的message連到camera的miOutputShader
連好之後打開camera的attribute editor, 在mental ray中會多一個Legacy Output shaders.
將裡面的depth跟Motion vector勾起來. 好了直後直接算圖就可以了.
(shader可以上個lanber就好)
由於動態沒有設的很好所以這張圖看不太出來, 但是已經可以看到可以正確的讀取到alpha資訊了~
關於這方面的問題我曾經到cg talk上請教, 也得到一位好心人士許多的建議. 原文討論串在這邊,
可以提供給大家做個參考
http://forums.cgsociety.org/showthread.php?f=87&t=966990
後記:
這次的案子是第一次採用大量透明貼圖的物件, 本來是打算節省時間的沒想到卻在出pass
遇到這麼多問題. 原本以為透明貼圖該是很基本的問題maya卻還沒有
一個完美的解決方式. 所以以結論而言能用model還是盡量用m0del
比較不會有那麼多問題.