2012/10/13

ZAP談Ambient Occlusion (AO)



作者:Master Zap
翻譯:Hammer Chen

最近我常常遇到有人問在mental ray裡面要怎樣使用環境光(ambient light), 大部分的人對 mia_material (Arch & Design)缺乏ambient這個選項感到困混.

這裡我試著解釋一下

導讀: 環境光與Occlusion
很久很久以前…
傳統的電腦繪圖, 完全沒有任何的間接照明, 預設的效果像這樣: 打了一盞方向光


整個陰影是全黑的, 一點也不寫實, 你甚至看不到這張黃色桌子底下的四隻腳!

因此, 開始有人引進一些小技巧, 其中一個很醜, 不寫實的技巧是陰影密度(shadow density) 這個參數的意思是, 光線在陰影的地方, 只有x%的亮的光線會完全不見. 因此你也會找到像"Shadow Color" 與 "Shadow Density"的參數, 你也知道這個東西很荒謬, 一點也不合理!!

一個不透明的物件不是完全遮蔽住光線, 要不然就是讓光線透過去, 它不會隨機地讓光線穿透, 所以遮蔽47%的光線, 這種事情根本不可能, 除非是透明的物體要不然根本不會發生!

規則一: 不管怎樣都絕對不要用"shadow color" 或 "shadow density"這兩個參數

進入環境光(Ambient)的階段
但是, 這些早期CG界的人說, 在戶外, 因為太陽光的關係陰影會帶有一點點藍色, 難道我不應該把shadow density調小, 把color調藍, 得到偏藍的陰影嗎?

不行!

陰影之所以會是藍色, 是因為有天空這個藍色的補光的關係.
而早期的CG開發人員了解這點, 所以除了發明了"shadow color",這種東西以外 還引進了也一樣可怕的東西: Ambient Light

問題是, Ambient Light會產生平均的照明, 這完全不寫實效果也很難令人滿意. 就像這樣:


這跟之前的版本一樣可怕. 當然, 你在陰影裡面會看到一些效果, 但那樣的效果是很均勻地分布. 現在桌腳可以見到, 但整個顏色完全沒有細節!

你看得出桌腳是圓的, 平的或是橢圓的, 桌腳有無碰到地面, 或是懸空的? 紫色的茶壺看起來好像飛起來了, 因為後面的綠色茶壺的陰影沒有亮度變化.

這邊的問題是燈光打到每個點的時候是均勻的照明, 不管物體的位置或是角度. 但如果我們想要模擬帶點藍色的天空光, 在光源前面的物體會接受到較多的光線, 而在後面(被擋住)的物體光線就會被遮蔽掉.

進入遮蔽(Occlusion)的階段:
幸運的是, 2002年在ILM有群聰明人, 當他們在做電影<<珍珠港>>的案子的時候, 發明了(他們是用mental ray, 必須強調一下), 叫做Ambient Occlusion (AO)的東西. 基本上, 他們寫了個shader,  能找到特定的點被遮蔽的程度, 也就是在那個點上面, 有多少程度遮蔽住光線, 這個遮蔽效果, 看起來像這樣:


結合了環境(Ambient) 與 遮蔽(Occusion)

如果你把這個遮蔽(Occusion)效果跟環境(Ambient)結合在一起, 就會得到以下美麗的圖片:


你看細節如何美妙地表現出來, 桌腳現在能正確的顯示出與地板的接觸感, 桌腳的形狀也能看出來. 兩個茶壺之間也能正確的顯示陰暗面 ,茶壺也有很棒的接觸陰影. 這就是AO正確的使用效果!

錯誤地使用 AO!
然而, 很不幸地, 很多人讀了卻也誤解了ILM原始對AO的文件. 他們把AO直接套用到整個場景上面, 這是錯的!!!

例如, 有些人會算圖, 產生occlusion pass, 然後把兩張用疊加的方式合成在一起:


請注意看, 結果會有種髒髒的感覺, 因為occlusion pass是套用在整張圖上面, 影響了環境光(ambient)也同時影響了方向光.

這完全沒有道理! 方向光的遮蔽(occlusion)本來就已經有計算了, 這也是為什麼方向光會產生陰影. 環境光的遮蔽(Ambient occlusion)之所以會這麼稱呼不是沒有原因的! 這個功能本來就是要把環境光遮蔽掉, 而不是把方向光遮蔽掉.

但是你在上圖看到的是前景的物體把地板弄黑了, 讓它看起來髒髒的, 還有, 壺嘴的地方也有髒髒的陰影…等等問題.

所以, 整體的套用遮蔽(occlusion)在beauty pass (包含了 reflections, direct light, 等) 是大錯特錯的!不要這樣做.

好, 我們之前是用環境光與遮蔽的方法, 模擬出寫實環境光效果, 以及光線反彈的感覺. 現在我們真的去計算光線的反彈 (採用Final Gathering) 看看效果:

上圖是利用3ds Max "Skylight" 與FG算出來的效果. 跟我們前面用環境光+遮蔽產生的效果效果類似, 但是後者是真正的反彈光線.

這也引發了疑問, 既然這麼容易就產生真正的反彈光, 為什麼還要用造假的方式(AO) 合成呢?
以下做回答:
FG是一種內插的技術, 這表示間接照明是經過採樣計算出來的, 這些數值會被內差計算. 但是, 如果你算的是動畫, 每個frame之間的效果會有不同. 理論上不會只是一個像素的差異, 而是幾個區域的像素差異 (這些受到FG 採樣點內插所影響的像素)

結果是, 最終的動畫會產生閃爍的問題. 你會察覺到, 因為這個閃爍是超過一顆像素大小的, 閃爍會讓視覺畫面不討喜.

實際在操作的時候, 我們要結合使用真實的反彈(FG)與造假的(AO合成)的方式來作業


上圖說明了, 三個pass ( Ambient, Direct, Occlusion)用不同的順序來合成, 產生不同的效果.

第一種方式是錯誤的做法: 把Ambient + Direct 再疊上Occlusion, 看起會有髒髒的感覺

第二種方式是正確的: 把Ambient + Occlusion (這也就是AO名稱的由來) 最後才疊上Direct的pass, 就可以得到很漂亮的效果.

[相關資訊]

Post a Comment