2017/03/28

萬物皆有菲涅耳fresnel

原文 / everything has fresnel
作者 / JOHN HABLE
翻譯 / Hammer Chen

你可以把這篇當做“Everything is shiny rant”的續集。當今遊戲裡面高光照明已成標準,然而遊戲中少見的是正確的菲涅耳(fresnel)效果。希望現在你知道什麼是高光(specular)了。 電腦遊戲裡面最常見的高光模型是Blinn-Phong也就是:

H = normalize(V+L);
specVal = pow(saturate(dot(H,N)),power);


在本例中, V就是觀察者的向量, L是光線的向量, N是法線向量。 power是高光的指數, H是衍生半向量(derived half vector), 也就是介於觀察者與光線中間的向量。怎樣運作的呢? 以下是圖解。你可以看到觀察者、 光線與法線向量。 現在, 有了這個函數 高光的峰值在哪裡呢? 直覺上, 你可能希望高光函數達到最高當觀察者向量等於光線的反射向量, 結果也是如此, 這個函數達到峰值當半向量正好對齊法線, 剛好等於反射的觀察者向量點正好在光線上, 一切都合理。

另一種狀況:
再次,觀察者向量正反應了光線向量。 本例中, 高光的亮點會更亮? 更暗?或是跟第一個例子一模一樣? 嗯, 應該是一樣, 因為在兩個例子中, 你都是直接觀察高光亮點的最大值, 真實世界是這樣運作的嗎? 簡單的說, 不是。

這是一張磚頭的照片,從不同的攝影機角度。上面那張,燈光與攝影機都是直接朝下,類似於第一個狀況。第二張照片,光線是以掠射角的角度撞擊表面,類似於第二個例子。我把高光與漫射以偏光鏡分開, 因此漫射在左邊, 高光在右邊, 讓我們來仔細瞧瞧。


所以...我靠! 如同像磚頭這樣簡單的材質 Blinn-Phong的shading模型竟然高光完全錯誤, 結果是因為某個叫做fresnel的小玩意。我們再來看兩個高光的例子。根據Blinn-Phong 這兩個應該會有相同的強度,但是實際上,其中一個在掠射角的角度結果亮很多。


把這個效應考慮進去,你可以使用Fresnel。即時的Fresnel可以用Schlick Fresnel概略地得出, 以下從the GPU Gems 3 chapter on skin 書中的章節得到:

float base = 1 - dot(V,H);
float exponential = pow( base, 5.0);
float fresnel = exponential + F0 * (1.0 - exponential);
specVal *= fresnel;

因為某些原因,大部分的人希望fresnel只發生在反光強的表面,例如水、玻璃與金屬。事實上 fresnel的效應在幾乎所有的材質都很強。事實上, 我認為fresnel在哪些反光弱的材質,視覺上更加重要。以下是PVC水管:


很顯然PVC具有fresnel效應,但是依我之見,我會說磚頭上的fresnel效應會比PVC 視覺上更為重要!從完全沒有到非常強的高光會比,強的高光到更高的高光更為重要。難道這不是更為重要的視覺效果嗎? 我認為,以為fresnel只發生在水/玻璃/金屬 是種錯誤的想法,因為對於反光弱的表面 fresnel的視覺效果差異更加明顯。以下有更多例子:



可憐的紙板,被大家都誤解了!通常紙板大家都認為是完全的漫射材質 ,就算它值得跟其他的亮亮材質朋友一起出場。高光在直視的角度很重要,因為會添加細微的去飽和度效果。但是紙板在掠射角具有非常高的高光反射。


你曾想過為何在早上開車上班會感覺比較亮嗎? 大部分人以為這是太陽照射到眼睛的關係,事實上,路面強大的fresnel效應是主要亮度增加的來源 。下次陽光直射眼睛的時候, 請留意汽車後照鏡的路面比正面的路面要暗許多。


這裡有些衣服,是IKEA買的。粗糙、棉質的衣服具有很少的高光。這樣比較並不是很好的例子,因為第二張圖整體來說更亮,這樣你很難看出高光到漫射的改變。如果你想要有更好的例子,那就當作各位讀者的回家作業吧!


好玩一下,讓我們來看一下X-Rite色溫版。當你使用彩色的色溫版,建議你要垂直於攝影機 ,應該不需要跟你說為什麼吧?!

Fresnel萬歲!


[延伸閱讀 ]

No comments: