問題與目的:
這是一篇高級的材質技巧教程。講的是使用菲涅爾公式中的n值和k值來定義材質的方法。
一般情況下,我們會使用IOR或者F0來定義材質的正面反射率,再配合Reflection color來定義反射顏色,藉此可定義絕大多數常規的非金屬或者金屬材質。
一般來說,標準非金屬材質很容易處理,IOR = 1.5,或者F0 = 0.04 的時候,材質的反射表現為標準非金屬材質,可以理解為物理正確。以上也是PBR流程對於非金屬材質的標準化處理方式,藝術家遵循該標準很難出錯,效果也容易統一。
但是金屬材質則很多時候會使用 IOR 大於20 以上的數值 ,或者 F0 大於0.4 以上的數值來製作。這種做法過多依賴個人經驗和臨場發揮,材質可能會在製作過程中由於個人理解的差異而差異較大。
也就是說製作金屬材質的時候,缺乏一套行之有效的統一標準。容易導致流程的混亂,最終效果出問題的時候,你不知道問題是出在材質還是燈光還是貼圖。
本文希望通過複雜菲涅爾(complex fresnel)方法,解決材質所導致的混亂問題。
介紹:
complex fresnel,這個名字來自vray 官方幫助文檔:
https://docs.chaosgroup.com/display/OSLShaders/Complex+Fresnel+shader
這篇文章中提供了一個osl材質,叫做complex fresnel shader,作用是可以使用n值 和 k值(,這兩個存在於菲涅爾公式中的參數來定義材質的具體反射表現。
幫助文檔是提供了這個osl材質的源碼:
float fresnel(float n, float k, float c) {
float k2=k*k;
float rs_num = n*n + k2 - 2*n*c + c*c;
float rs_den = n*n + k2 + 2*n*c + c*c;
float rs = rs_num/ rs_den ;
float rp_num = (n*n + k2)*c*c - 2*n*c + 1;
float rp_den = (n*n + k2)*c*c + 2*n*c + 1;
float rp = rp_num/ rp_den ;
return clamp(0.5*( rs+rp ), 0.0, 1.0);
}
shader complex_ior (
vector n=vector(0.27105, 0.67693, 1.3164) [[ string description = "Refractive index for red, green, blue wavelengths (f.e. for 0.65, 0.55, 0.45 micrometers)" ]],
vector k=vector(3.6092, 2.6247, 2.2921) [[ string description = "Extinction coefficient for red, green, blue wavelengths (f.e. for 0.65, 0.55, 0.45 micrometers)" ]],
output color Col_Out = color(0.5)
)
{
float thetaCos = abs(dot(-I,N));
float red=fresnel(n[0], k[0], thetaCos);
float green=fresnel(n[1], k[1], thetaCos);
float blue=fresnel(n[2], k[2], thetaCos);
Col_Out=color(red, green, blue);
}
我知道你在想什麼,我也看不懂。沒關係,對於藝術家來說,我們只要知道如何使用就好。
關於查詢網站以及GW教程中的錯誤:
首先我們需要用到一個網站:http://refractiveindex.info/
大概長這樣:
這是一個科學測算材質相關方方面面參數的網站,可以查到非常多有用的信息。本文介紹的做法非常依賴這個網站查詢所獲得的參數。我們後面要在材質球上使用的n值和k值就是在這裡查詢出來的。
如果是看過 grant warwick 的mastering V-Ray教程的朋友,應該對這個網站不會陌生。
在這套經典材質教程中,作者並沒有使用常規方式去製作材質的反射,而是自定義了三個反射曲線對應紅綠藍三個通道,藉此製作出非常複雜而豐富的反射效果。他制定RGB反射曲線的信息來源就是上面提到的這個網站。他會先查自己想要製作的材質,然後獲得一個圖,大概這樣:
grant warwick 在教程中說,這三根紅綠藍曲線代表的是紅綠藍三個通道的反射率。橫軸是相機視線與模型表面法線的夾角度數,縱軸是反射率。並且使用一些類似曲線的工具去手動還原查詢到的這張圖。
然而這張圖上寫得很清楚,紅色曲線代表的是S-polarized,藍色曲線代表P-polarized,綠色曲線代表的是non-polarized。這裡說的其實是偏振光的的反射,而不是紅綠藍的反射。因為跟主題關係不大就不深究了。
總之,grant warwick在曾經的mastering V-Ray教程中教授的方法並不正確,但是他以自己藝術家敏銳的眼光調來調去,彌補了技術上的失誤,最後的效果總的來說還是不錯的。
正確使用方法:
首先在shelf 一欄中選擇給三維藝術家使用的數據,後面的類型可以根據自己的需要進行選擇。比如我可以選擇大類型金屬(metals),細分類型鐵(Fe)。
之後,根據vray官方幫助文檔上的信息,使用參數:紅光波長0.65微米,綠光波長0.55微米,藍光波長0.45微米。
將這些參數代入網站的計算器中計算出對應的n值和k值:
紅光的n值和k值:
綠光的n值和k值:
藍光的n值和k值:
這個時候,再將對應的n值和k值使用到渲染器中的材質球上去即可以獲得精確的材質效果。應為Redshift渲染器的材質球已經內置了n值和k值,所以,後面的渲染測試我都在Redshift渲染器當中進行。如果是別的渲染器,只要支持osl材質的,都可以在上文提供的vray官方幫助文檔中下載 complex_ior.zip 文件,獲得complex fresnel shader,之後再將這個osl材質計算出來的結果插入標準材質的reflection color裡面去,關閉材質本身的fresnel功能,即可獲得和本文後面一樣的效果。
在Redshift的RsMaterial材質上,fresnel type 使用IOR(Advanced)即可開啟材質的n值和k值,下圖中的IOR一欄即為n值,Absorption(k)一欄即為k值。 第一列為紅光的n值和k值,第二列為綠光的n值和k值,第三列為藍光的n值和k值。
鐵(Fe):
銅(Copper):
鋁(Aluminum)
金(Gold)
總結:
應該有很多人比較關心用complex fresnel方法做出來的效果和傳統方法比有多少差距。我對比的結果是比較小,不用AB對比幾乎看不太出來,所以我就不把圖發出來了,因為你們看不到AB對比會覺得效果完全一樣沒區別。(可能我做的案例還不夠體現出問題來,還需要更多的測試)
雖然說complex fresnel最終效果和傳統做法效果差不多,但是我覺得很大的意義是它所提供的參考價值。你想想你用傳統的做法,讓你調一個金子的材質,你知道金的顏色到底要給多少?IOR 或者F0要給多少? 還不是靠感覺。但你的感覺可能會受到你的燈光所影響,或者別的物體顏色影響等等,你每次調的結果可能都不同。就是開篇提的問題,傳統的做法沒有標準,很難統一,尤其在大項目裡容易造成後環節的混亂(到底是照著你的材質改燈光,還是打回去重新改材質)。如果說用complex fresnel的標準做法,那麼材質可以確定是準確的,最終效果有問題可以排除是材質的問題,那麼修改的就是燈光或者別的東西。
我在這個問題上的研究還不夠深入,希望這篇教程可以起到拋磚引玉的作用,引發大家對現有流程的思考,我們是否還可以做到更好呢?
應該是可以的。國內的材質水平相當落後,很明顯是所有流程中很明顯的一塊短板,最近看到獅子王的宣傳片,差距過於巨大,我都想蒙上自己的雙眼。
我們還有很長的一段路要走。材質,材質!
(渲染圖加了LUT 開了post FX,也就是octane那一套,你可以理解為賣家秀。不過手機上小圖估計只能看個大感覺)