萬物皆有菲涅耳fresnel
當今游戲里面高光照明已成標準,然而游戲中少見的是正確的菲涅耳(fresnel)效果。希望現(xiàn)在你知道什么是高光(specular)了。電腦游戲里面最常見的高光模型是Blinn-Phong也就是:

H = normalize(V+L);?
specVal = pow(saturate(dot(H,N)),power);
在本例中, V就是觀察者的向量, L是光線的向量, N是法線向量。power是高光的指數(shù), H是衍生半向量(derived half vector),也就是介于觀察者與光線中間的向量。怎樣運作的呢?以下是圖解。你可以看到觀察者、光線與法線向量?,F(xiàn)在,有了這個函數(shù)高光的峰值在哪里呢?直覺上,你可能希望高光函數(shù)達到最高當觀察者向量等于光線的反射向量,結果也是如此,這個函數(shù)達到峰值當半向量正好對齊法線,剛好等于反射的觀察者向量點正好在光線上,一切都合理。
另一種狀況:

再次,觀察者向量正反應了光線向量。本例中,高光的亮點會更亮?更暗?或是跟第一個例子一模一樣?嗯,應該是一樣,因為在兩個例子中,你都是直接觀察高光亮點的最大值,真實世界是這樣運作的嗎?簡單的說,不是。
這是一張磚頭的照片,從不同的攝影機角度。上面那張,燈光與攝影機都是直接朝下,類似于第一個狀況。第二張照片,光線是以掠射角的角度撞擊表面,類似于第二個例子。我把高光與漫射以偏光鏡分開,因此漫射在左邊,高光在右邊,讓我們來仔細瞧瞧。

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

把這個效應考慮進去,你可以使用Fresnel。即時的Fresnel可以用Schlick Fresnel概略地得出,以下從the GPU Gems 3 chapter on skin書中的章節(jié)得到:
float base = 1 - dot(V,H);?
float exponential = pow( base, 5.0);?
float fresnel = exponential + F0 * (1.0 - exponential);?
specVal *= fresnel;?
因為某些原因,大部分的人希望fresnel只發(fā)生在反光強的表面,例如水、玻璃與金屬。事實上fresnel的效應在幾乎所有的材質(zhì)都很強。事實上,我認為fresnel在哪些反光弱的材質(zhì),視覺上更加重要。以下是PVC水管:

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

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

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

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

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