2017/05/31

決定正確的falloff衰減曲線

原文 / Determining correct falloff
提問 / grantwarwick
編譯 / Hammer Chen

grantwarwick問:Viscorbel發現客製化的BRDF有問題,引起了我的注意。我一直以來V-Ray在大師班授課。你可閱讀這篇(譯者註:連結已斷)圖片是從他的部落格取來的
我做了測試,老實說我原本預期反射會與光線的方向對齊,但結果並不是,或許我想太多了? 但是從正投影攝影機, 這些反射不就應該要對齊嗎,如果不是 Viscorbel又怎樣能說是物理精確的?


後來想想,我發現是因為圓的厚度偏移了射線打到表面的角度。
現在只需要確認3dsMax Falloff map並不是線性的,需要校正?
DanielBrew答:我剛剛試了。結果跟Viscorbel做的一樣。如果我講錯請糾正我。 你預期falloff map在45度角會回傳RGB 128 實際上是回傳RGB 76。以下我附上max 2014場景檔,如果有人想要看的話。

viscorbel答:falloff map並非線性的。正確的曲線, 線性後應該約略如下圖。似乎3ds max在背後有用了某種算式,因為某些原因而扭曲其結果。

joconnell答:請問曲線是不是有點像sRGB?
vlado答:Falloff map是用於角度的cosine; 而非真正的角度。 viscorbel在上面的曲線是顯示其翻轉(arccos函數)。
viscorbel 答:有點接近,但不一樣。
我試著用gamma或是反gamma來修正falloff map,但是無法修正 

viscorbel:我就知道一定有人夠聰明能知道背後的數學是什麼 (笑)
DanielBrew :我正是這樣想,可是我無法用數學得到正確的結果
255 * (0.5^2.2) = 55.5
我得到的結果在45度角約76
vlado:建議改用cos/arccos
Wobi:或許可以用OSL-Texture來導入。我們就可以像Viscorbel的作法以漸層做重新對應(remap)

vlado:隨時歡迎!OSL就是為此所設計的。
Wobi:嘿嘿 我正想這麼做 但是我的數學不夠好,我已經完成了facing ratio的部份,但是arccos我寫不出來,我試著要得到以下曲線:
http://rechneronline.de/function-graphs/

使用這個函數
with the function: acos(x)

但是得到的曲線似乎不是我想要的

vlado:建議試試acos(1-x)/(pi*0.5)
Wobi:哈哈,太棒了!現在我們可以把OSL用在falloff slots得到線性的結果。感恩!因此問題解決了!只需要用這個OSL修正所有的反射貼圖,感謝 Vlado!
viscorbel:所以 Grant,問題解決了!現在只需要這個OSL檔案接上你所有的反射貼圖就行了!

Wobi:事實上,你甚至不需要使用falloff map。只需要用output map來修改曲線,因為這樣會用到比較少的電腦運算資源,我猜啦!
vlado:沒錯!你可以用Output map重建出相同的曲線,可能還要比OSL shader更有效率。 OSL 會消耗很多運算,即便是只有一行的shader。
Vizioen:有沒有人可以試試看實際套用在材質上的效果,好奇值得不值做這些動作?
DanielBrew: 值得!
jackieteh:我還在用vray 2.40,那我要怎樣才能使用這個檔案?
theedge:如同前面所述。只需要使用Output map,因此你不需要擔心OSL shader。
Wobi :當然你可以用output map ,但是你可能不會得到跟OSL-Shader一樣精確的曲線。 因為只是用手調出來曲線, 並不是數學上正確的曲線。
viscorbel:把這個放到falloff的slot可以很輕易地轉換舊材質, 而其他人要花好幾個小時才能做出接近的數學曲線。當創建新材質時, 透過把OSL丟到Output map裡面比較有意義。
Dave_Wortley :我認為用手調的Output曲線跟OSL曲線的差異是足以忽略的, 因為不會有osl讓運算變慢的問題
Wobi:應該看起來會像這樣:
OSL-Texture -> Output-Map -> Reflection-Color of VRay-Material
因為這裡的OSL-Shader如同 Falloff-Map, 差別只在於OSL-Shader具有線性的Falloff, 因此不需要將這個在插入到Falloff-Map裡面。 當然囉! 如同Viscorbel 所提,如果是你舊的本來在Falloff-Map裡面就有一條自己拉的曲線 ,這樣做就有意義。

Dave_Wortley:贊成VRayOutputMap的作法,會有比較好的動畫控制 。技術上來說, VRayLut 或 VrayICC已經能做到這個功能。 如果你想要利用一個LUT將Falloff轉換成線性的Falloff。
dubcat:請問這個OSL是只拿來用在反射 是也應該用在光澤度(Gloss)的Falloff上面?
上圖使用『教學影片的第四集』中的『玩具車』材質, 套用falloff

viscorbel :沒有太大差別, 但是可以察覺不同。我認為對於光澤度不是必要的,因為差不多用手調出來就可以了, 並沒有可測量的曲線可以拿來重現。
Vizioen :所以, 簡單說來, 如果我理解是對的, 這幾年下來大家用的 falloff  map都是錯的?我做了個測試。 但我覺得一定是哪裡做錯了或是我沒有完全理解?
1. 255 reflection, FRESNEL, GGX (2m57s)

2. VrayOSLTex, FRESNEL, GGX (3m21s)

3. Falloffmap with Fresnel, GGX (3m06s)
我應該是做錯了什麼,因為OSl少了很多反射, 這樣對嗎?


還有為什麼當我要插入VrayOSLTex 顯示不相容?

viscorbel:我認為你把兩個不相關的概念混為一談了。如果你在VRay材質不使用其Fresnel選項,而想用3dsmax自身的falloff曲線來重現,那麼這個非線性的falloff便會產生問題。如果你把修好的OSL直接放到反射slot中,而中間不使用 output map 來產生類似fresnel的曲線, 這樣做沒有意義。另外,將falloff設定成Fresnel模式, 然後輸出某個IOR數值, 所得到的結果也會與使用相同的fresnel IOR數值的vraymaterial有所不同 。在某些進階的材質堆疊工作流程中 ,fresnel falloff 會被來拿用作混合的遮罩(blend mask) ,這樣做會產生不正確的結果, 也應該要取代為線性化的falloff ( linearized falloff) +在ouput中手調的 fresnel 曲線才對!

Rens:嗯, 有點偏向0度

左邊用的是VrayBlend以Falloff作為遮罩, 兩個都用VRayMtl 其中一個diffuse, 另外一個反射 ;右邊那個適用VRayMtl 的 Refl。 兩者的IOR都是1.6。 我懷疑是因為cos線性問題或許某些能量守恆的差異或是公式的些微不同。這樣的設定我已經幾乎用了10年之久,從來沒有比較過兩個方法的差異 Falloff map 產生的Fresnel曲線太黑了(3.2% vs 5.3%)

vlado:公式不同。 Falloff map 使用了某種逼近法。 不, 其實不是Schlick 逼近法。 我從【數位影像合成第二冊】(Principles of Digital Image Synthesis, Vol 2)讀到的Falloff map公式 。而V-Ray所用的公式是總光跡追蹤的綱要(total raytracing compendium),我也不確定為什麼兩個公式的結果不同,也不知道哪個才是對的。

Rens:幸運地, V-Ray的版本是對的!

((1.6-1)/(1.6+1))平方
dubcat:這裡提供材質庫下載, 給不想使用OSL的懶惰蟲:

Wobi:嘿Rens! 我不是要冒犯你,所以不用感到抱歉。不論如何 ,我認為如果能有以下功能會很棒:
這是具有易用介面的角度零顏色,專為建築設計的材質。這樣你可以立即看到曲線,而不需要使用3dsmax難用的output曲線。當然! 這是我快速用PhotoShop做出來的介面,沒有考慮到其他細節,例如 n+k數值。但是可能可以加快設定曲線與顏色的工作流程,可以需要導入某些腳本控制的 texturemap、OSL-Shader與Dotnet-UI...等等。
註:上面的數值沒什麼意義,只是用Photoshop很快做出的示意圖
Deflaminis:有沒有人可以大發慈悲一下,下個結論到底哪種方法比較好? 我看了這帖好幾次還是看不懂?!
joconnell:還不是很理想。 OSL可以讓你使用refractive index資料,可是並不是最直覺的調整資料的方式,只能對應某種特定的金屬 ,不一定是你要的那個金屬。 這樣沒有藝術性的控制力。 falloff / mapped gradient的調整方式比較有彈性, 雖然需要花更多的時間調整 。 我猜會有人弄出更好的OSL map 跟上面的 UI概念圖類似!
Midiaeffects:Bercon Gradientfresnel模式可以產生跟VRay材質一樣的曲線。

[延伸閱讀]
Complex Fresnel 更寫實的反射材質

解開V-Ray材質球RGB指數

No comments: