MAYA裡有關透明貼圖分層的問題與解決方法

這次的案子裡由於場景裡面預定出現的物件很多, 原本為了節省場景複雜度跟時間決定

大部分物件都採用把照片貼在板子上的風格.  沒想到在做完動態跟打光,

在出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

比較不會有那麼多問題.

    • RICE
    • 六月 26th, 2011

    謝謝你重要的分享,想請問在Ambient Occlusion的解決方法問題,請問做出這兩顆材質後,那是要再分層裡面分別把材質給葉子的平面嗎?
    有點看不太懂做出材質球後接下來的步驟

      • Gil
      • 六月 26th, 2011

      RICE你好

      抱歉沒有寫的很詳細, 做這兩個材質球的理由就是要分別上給有透明貼圖的物件跟沒有透明貼圖的, 所以做好之後在你要算圖的render layer裡把兩種材質分別上給"有透明貼圖"跟"沒有透明貼圖"的物件直接算出來就好了.

        • RICE
        • 七月 12th, 2011

        謝謝你的熱心回覆!!

  1. 最近有个project,關於AO的話 我是用 p_megaTK,效果很好!至於vector的話 参考了PixelCG的mip_motionvector的教程,,但是得出的pass在RSMB里用不了哦!而且就算用mip的话,只有在背景没有物体的地方才能算出透明,在物体重叠的地方(如自身多个片面重叠的情况),还是算不出透明的哦!不知道Gil对这些有什么看法呢?

  2. good work thx

  1. No trackbacks yet.

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: