PBR以及在Disney和UE渲染模型中的使用

PBR,基於物理的渲染模型,是當前主流遊戲引擎使用的真實感3D渲染模型,在遊戲場景渲染中,它用更接近光學物理的方式,建立一個對全場景材質的大一統shader。大一統shader的好處包括:統一美術製作管線加快製作效率,對動態光照環境的更耗的適應性,減少shader維護的負擔等。本文總結了PBR的理論知識以及具體在Disney和UE中的典型應用。

1 PBR的理論基礎

1.1光波

光波能量描述

渲染來自於光照,先要明確光照度的度量。光照源於單位時間內單位視網膜接受的光的能量

 

感受光波亮度

光存在波粒二象性,當光子能量較高的時候,表現粒子性,按照普朗克定律,e=hv,能量同頻率(或波長)有關,按照maxwell方程,e確同振幅的平方有關。對於可見光部分,振幅的影響要大於頻率的影響,光波的能量基本取決於光波的振幅(即對可見光來說,能量不主要來自顏色(頻率))。量化單位時間內通過單位空間界面的能量流(enrgy flow)來量化光波,這個值通常被叫做irradiance,或者大寫E,翻譯爲輻照度,單位應該是energy/s*t(s爲面積,t爲時間),即Watt/m*m。

 

感受光波色度

可見光區域的光能雖然同振幅相關最大,但是不同頻率的光對視網膜的刺激效應不同,一些低頻長波的光波的組合很容易激發人們對紅色的感覺,一些高頻短波的光又很容易激發人們對藍色的感覺。因此色度感知其實是在等於感知光波的頻率。可見光的振幅決定的光的能量,但是波頻確決定了色彩感知。

我們看到的光波基本都不會是一個單頻率的一個波,而是由各種頻率的幾個波組成的,這個組成比率可以用頻譜來表示。事實上考慮到光波是不同頻率波長的組合,那麼圖形學裏的渲染公式應該跟當前場景中所有光波的頻率種類相關,即對每個頻率的光波分別計算,最後疊加。但是這個太複雜了,所以現代圖形學只是按照簡單的長中短,即紅綠藍把一個光束聚類降維到三維,或者簡單認爲任何光波都是由三種頻率組成的,所以圖形學用rgb來量化光能,而不是(I1,I2,I3…),基於光譜(spectrum rendering)的物理渲染則是真正考慮每個頻率的維度,雖然基於低維的光譜渲染已經出現在實時渲染領域。

 

光波的複合

因爲波的複合是個複雜的問題,所以考慮到波的複合,那麼光的能量不是簡單的各個波的疊加。例如下面三種情況,相位不一致,結果強度完全不一致,圖形學裏該怎麼辦?我們認爲第三種情況即隨機的情況是最容易發生的,這種情況結果近似波能疊加,所以在圖形學公式裏,才能簡單的把多盞光源的結果線性相加,在這裏已經忽略了光波的干涉(interference)了。不過類似的工作在離線渲染領域有很多,例如薄膜干涉效果。此外這裏也沒考慮到衍射(diffraction)。

 

 

 

光源

所有的光波都是從光源發出來的。

 

度量光源

光源在單位時間發射出的總能量叫做radiant,或希臘字母φ,翻譯成輻射量。表示光源的輻射能力。因爲能量的單位是焦耳J,單位時間的能量單位一般用功率表示即瓦特Watt,所以Radiant的單位是Watt。

因爲光源輻射的能量在不同方向可能是不同,所以用於描述光源在特定方向的輻射能力,還有另外一個度量,即定義爲單位時間內光源在單位球面度上的輻射能,叫做intensity,或I,即我們熟悉的光源強度,它的單位是Watt/sr。一整個球面的球面度是4π。

 

光源類型

不同的光源類型的區別是對場景表面點的影響即radiance不一樣,不同的光源類型就是影響E的方程E=f()不一樣。

 

不帶位置的光,也叫方向光,不帶位置,只有方向,太陽光,用一個常量C就可以表示它對所影響物體的radiance,即E=c,這種光是物理不存在的,是模擬的遠距離太陽光,可以認爲沒有Radiant,Intensity的概念。

 

帶位置的光,對於表面任何一點,從一個光源只有一個方向的光線射過來,也就是說光源無形狀。用光源位置P1,表面位置P2,和強度I定義它對錶麪點的影響E,即E=f(P1,p2,I),

一般來說I又是光照方向的函數,記爲I(d)。即E=f(P1,p2,I(d))。或者可以表達成E=I*dist(p)*l(d)

 

泛光(點光): I(d)是常量的情況,叫做omni light,泛光,這是我們常說的點光,即光源強度不隨方向改變。泛光的E=I/r2.(怎麼推導的? E=總能量/4π*r*r, I=總能量/4π。)事實上,點光的E一般都不會用1/r2,因爲距離太近的時候要在數值上處理極大值(這不是bug,因爲極小值的積分會抵消,但是數值表示極大值有困難),且距離太遠了無限接近極小值也沒有意義,不如及早抵達0來消除一些不受光源影響的物體。一般表達成1/(s+sr+sr2) 

 

 

聚光燈:l(d)隨着方向改變,對於I(d)   的這種情況,就是聚光燈,它的光強隨着角度的擴散變弱。E=l(d)/r2。

 

其實我們可以用E=J*dist(p)*l(d) (光源能量*距離衰減函數*方向分佈函數)表達上面所有光源,方向光l(d)和dist(p)都是常量,泛光只有l(d)是常量,聚光燈都不是常量,一些光照計算中用所謂的uber light來表達任意光源。

介質對光波的反應

Scattering 散射

散射是一切光照視覺現象的基礎。光波在介質中直線傳遞遇到物質分子會四處反射,一束光線碰到一個表面,會跟表面物質反應激發出向其他很多方向的新的光線,這就叫做散射。散射其實就是光波遇到物質分子後發生的反應,通常在原光波方向上散射出的光線更多,散射後的頻率和原始光波可以認爲是一致的,不討論不一致的情況。

均勻介質

光波在光照方向上散射出來的能量要更高一些,或正向或反向。如果介質組成一致的,那麼散射產生到某個方向的光波,會被互相干涉,能量抵消,只剩下直線傳遞的那個部分光波,所以均勻介質中光波纔可以看做直線傳遞沒有散射的。

粒子介質

如果小粒子是最理想化的均勻分佈,多個粒子對同個光波的散射會成線性疊加。如果小分子是聚集成一個個比波長還小的cluster,那麼就會出現同phase的光波疊加,光的能量會變成n2增長,大氣裏的光線散射較強是這種原因,這也叫做rayleigh散射(注意這不違反能量守恆,因爲能量守恆是建立在線性疊加的基礎上的而沒考慮干涉);當cluster要大於波長後,變成mie散射,如雲霧。

 

表面對光波的反應

表面是兩種介質的分界面,上面研究光波在單一介質中的傳遞,這裏研究光波遇到介質分界面的行爲。

首先光波在遇到介質表面後不會向單一介質中那樣向各個方向散射,只會向兩個方向散射,反射方向和折射方向。

 

次表面散射

但是折射方向的光波會繼續在單一介質內散射,導致最終一些散射的光線重新反射出介質,這些從體內反射出來的光線叫做次表面散射,也有一些光波在介質內被物質電子吸收。

 

所以表面對光源的反應,總的上來看,一些被吸收,一些被表面直接反射出去,一些被折射出去,一些經過次表面散射反射出去。因爲有了次表面散射的複雜作用,一個光入射表面,不再是產生反射和折射兩個新的光波,而是折射,加上向各個方向的反射光波。

 

1.2BRDF

量化物質表面對光波的反應

 

渲染中我們大部分時間是處理光波對物質表面的反應,前面量化了光源,這裏就要量化物質表面對光波的反應。因爲上面提到的表面對入射光波是幾種反應,而我們通常關心一個光波經一個表面點後反射到另一處(如攝像機),所以定義了一種度量,它描述給定一個光波入射方向l,一個對錶麪點的觀察發現v,物質表面沿v反射(及次表面散射)出來的光波的irradiance和入射光波的irradiance的比值f(l.v)。這個叫做brdf(binary reflection distribution function)

 

嚴格來講次表面散射不能用brdf來定義,定義次表面散射要用BSSRDF,但是當物件離攝像機有一定距離的時候,次表面散射出來的位置會趨近於同直接反射的位置重疊,這時候就可以用BRDF描述次表面散射。BRDF可以描述那些離攝像機不是很近的物體表面的反射和次表面散射。

 

對於BSSRDF來說,如果物質次表面散射出逃點距離入射點很近,這種又叫做local subsurface scattering,,而出逃點較遠的話又叫做global subsurface scattering。Lss還是gss 取決於材質以及觀察點,觀察點遠趨向於lss,而皮膚這種材質更易趨向於gss,它的次表面反射距離很長(長於一個渲染pixel),當然當觀察距離足夠遠,皮膚也會變成lss了。更近的lss就可以用brdf來描述了。

 

 

BRDF有兩個重要的屬性:

f(l,v) = f(v,l),這是表面特性,此外反射能量要小於進入能量(能量守恆)

 

 

量化光波的傳遞

在前面度量接收器對光波的接受的時候用輻射度irradiance來量化單位時間單位表面接受光源的能量,它接受的可能是來自各個方向的多個光波輻射能,但是在計算光線傳遞的過程中,因爲考慮到單束光線是有方向性的,所以會把irradiance再計算一個在立體角上的微分,這個量叫做radiance, 英文記爲L,翻譯做光束光輝,它的單位是watt/m2*sr, radiance同irradiance的區別是它表示了單位面積表面通過的單位方向的光能,而不是各個方向,把irradiance可以想象成一個漏斗,而radiance則是一個細管,在一束光波的傳遞過程中基本都用的是radiance。

 

BRDF與Shading

 

渲染的一切是爲了計算在攝像機上的圖像,有了brdf我們就能進行基於物理的光照計算。

 

只有小孔才能成像 圖形學裏通常的渲染模擬的是針孔光圈,它一般沒有模擬大光圈(會有景深,遠景模糊)。如下圖上表示真實的小孔成像,中是圖形學中爲了方便計算把成像器至於針孔前的情況(這樣不是倒像),下圖是大光圈的情況

 

成像單位(單位感光器)的輻射能量是 L*darea*dsr的積分,即成像單位上每個微小面積收到的來自於各個方向的所有入射光波的輻照度的積分。

 

 

 

具體的例子,設光線經過表面點p射入觀察方向v的radiance是L(p,v), ps shading的目的就是爲了計算這個L(p,v)*darea*dsr的積分,設光源方向是l,則從l入射到p的光束的radiance可以表示成L(p,l)。那麼反射方程是

在這裏L(p,l)可以從光源的強度I計算得到,即dI/darea, f(l,v)是brdf,後面的n.l是因爲L(p,L)的度量是計算當它垂直照射平面時的能量流,在此時它不垂直入射,真正進入表面的如何能量要乘上一個cosθ,即nl。這裏積分上半球的l並不是說積分每個方向的入射光線,而是對特定的入射光l,認爲它在上半球上各個方向都可能存在能量的進入。

簡單來講,表面的顏色和所有能入射到該表面的光線的光束能量同表面brdf有關,所以物質表面的brdf對於光照計算來說是必備的屬性。

這裏shading的結果只是算了光線經p反射到v的部分,這個反射包括直接的表面反射和次表面反射,事實上完整的模型還應該加上p自發光的能量,所有光線經p折射入v方向的能量,即Lo(p,v) = emitted + reflected (fresnel+ss)+ refracted  ,

很多時候爲了簡化或討論不透明物體的就不算refracted部分了,而reflected通常又只討論local的ss,即次表面出射點很近的部分。

 

根據上面的公式也可以算出來全局光照的結果,對於屏幕上的每個像素小孔成像追蹤到的表面點p,計算它的L(p,v),這裏所有表面的f(l,v)可求得,剩下就需要追溯所有會影響到它的光線l,遍歷所有的l,如果l是指向光源就直接拿到L(p,l),如果l指向另一個表面點p2,就先遞歸計算L(p2, l)…如此追蹤下去,這就是光線追蹤的原理。整個過程只需要根據BRDF模型計算任何兩個方向的brdf,以及追蹤每個從光源發出的或經過反彈的光線。

 

1.3 BRDF的表示(次表面散射性質,能量守恆性質)

brdf的量化計算要考慮入射方向和反射方向分別有兩個旋轉自由度,所以BRDF有4個自由度。BRDF(lθ,lφ, vθ,vφ),對於一些情況,l和v,繞着法線旋轉的時候,BRDF不變,這種叫做各項同性brdf,就相當於這有3個自由度了。

 

不同物質表面對光線的反應

反射角一定和入射角相同的,折射角同入射角遵守snell law,次表面散射出來可以向任何方向,折射是次表面散射和吸收的來源。(入射光->反射光+折射光->繼續折射出去+次表面散射+吸收)

 

金屬內部的運動電子會將部分折射光重定向到反射方向去並吸收一部分,所以金屬的反射很強,吸收很強,次表面散射很弱且反射方向附近的反射強度大,blinn-phone用視角和反射方向的角度來量化金屬的反射比。

 

非金屬:反射弱,向各個方向的次表面反射均勻,吸收少。Lambert描述下反射光線同視角和入射方向無關,是均勻的反射體。(lambert公式裏面會對攝像方向l點乘法線,這並不是說lambert的brdf認爲反射比同l方向有關,l*d不是brdf的一部分,而是上面反射方程中的一部分)

 

Albedo與能量守恆

如何衡量一個brdf是否能量守恆?

 

這裏先引入概念叫做DHR(directional –hemispherer-reflectance),方向/半球反射比

R(l)代表入射光束l經表面碰撞後,向所有表面法線上半球方向反射的光線方向光束v的積分。

如果沒有任何吸收和折射,那麼這個值應該是1,注意這裏的n*v同反射方程裏是一樣的。

可以反過來得到HDR(Hemisphere-directional-reflectance)(即所有法線方向上半球過來的光束l對觀察方向v的brdf的積分)

並且二者相等。

這個R值就是所說的albedo,albedo的意思就是DHR。DHR或albedo〈1就能說明該brdf能量守恆,albedo是物質表面重要的屬性,描述整體對光線的反射能力。

 

下面討論不同表面的brdf

 

A 純Lambert表面:(次表面散射能量爲主)

Brdf是個常數c,R = c*π (半球上各個方向的積分爲π,整球的立體角是2π)  c= R/π

對於lamber表面 ,則光源l經表面p反射到v的光線L(v) = ∫c*L(l,p)*dot(l.n),最終考慮各種積分運算在ps上得到的公式就是c*I(L)*dot(L,n)*π, (這裏L(l,p)的Intensity對area的微分被最終L(v)的積分抵消,反射方程裏對球面各個方向的l積分得到π,lambert模型裏面經常用一個漫反射參數來表示c*π這個整體),這也正是我們傳統的lamber光照模型。

 

 

B 純Fresnel 表面(直接反射能量)

首先考慮完美的絕對平滑兩個物質表面分界,射入光線L,反射Rfl(表面的直接反射),折射Rfr, Rf = Rfl/L

,Rf被稱爲fresenl反射率,對於特定的物質界面,Rf只跟入射光線的角度有關。設入射光線和法線的夾角θ,則Rf隨着θ的增大而增大,垂直的時候最小,記爲Rf(0)或F(0). F(0)表徵了物體表面直接反射的能力(即我們看到的高光的主要部分),也可以看做材質的高光顏色(Unity的standard shader裏面是使用albedo乘金屬度做高光顏色),通過統計各種材質的Rf(θ)同RF(0)之間的關係,得到了各種估計公式,例如著名的schlick公式

 

不同材質的Rf0特性:絕緣體的rf0較小,多數0.05一下,且隨光譜變化不明顯,即rgb值差不多(即非金屬不用太考慮高光顏色),而金屬就很高,多數0.5以上,且隨光譜變化較大,rgb三個值差異較大。

半導體在這之間,但是很少存在於渲染場景中,0.2-0.45之間的物質幾乎不存在與現實生活中

 

Fresnel和次表面散射參數的量化

正常我們需要一個表面的albedao ρ來表示次表面散射和一個F0)來表示fresnel反射。這是兩個rgb值,爲了美術習慣以及節省帶寬,一般用一種metalic(單通道),一個specular(單通道,有些引擎也沒有)和一個CsurfRGB)的方法來表示。

因爲當物體是金屬的時候,次表面散射可以忽略,這時用Csurf表示F0),而當物體是絕緣體的時候,f0)通常集中在很有限的幾個值上,且和光譜關係不大,甚至都不需要區分rgb三個量,有的引擎可以用一個常量rgb表示,有的引擎會用specular乘上Csurf(給一個大小調節),而Csurf就是次表面散射的albedo ,而m介於0-1之間,作爲金屬部分和非金屬部分兩個公式的混合。

所以在ue裏看到的metalic只是一個調節金屬度程度的值,Albedo則是表示在絕緣體下的Albedo或者金屬下的Fresnel0),而specular則表示在絕緣體下通過縮放CSURF得到的F0)。

 

C微表面理論下的純fresnel表面(金屬)

 

NDF 法線分佈方程

 

大多數表面的微表面法線特性是:

連續分佈,並且在主發現處分佈最高。

表面越光滑,就有越多的子表面法線朝着主法線

視角越低 就顯得越光滑 因爲一些低處的面被遮擋了

微表面反射次數越多的光線顏色越深(越接近物件本身的顏色)

回射現象 當微表面的不規則性要大於微表面的散射距離,即粗糙的尺度比較大,則可能散射的光線沒被微表面遮擋而回到反射方向,表面看上去要更光滑

 

微表面的每個表面都可以認爲是一個絕對的fresnel反射表面

 

NDF  d(M),M是微表面法線 ,分佈方程 d(m)代表在微表面上m方向法線的面的比例,滿足下列兩種表達

 

 

所有微表面法線在方向v上的投影等同於主法線在方向上的投影 ,所以在更高的維度上,主法線確實表示了微表面法線的綜合的可見行爲,這也是主法線的計算依據

但上面公式沒有考慮到微表面的遮擋 即通常的vn是沒有考慮微表面在其他微表面陰影中的情況 遮擋項目 G(m,v)代表所有m朝向的微表面在v方向的可視比例.可以說d描述的是微表面法線的分佈,而g描述的是這些面的擺放方式,d和g共同決定了微表面在方向v上的可視程度,事實上如果不考慮g的因素,單純考慮d也沒有意義了,如果g永遠是1,那麼就可以用主法線來表示了。

所以上面的公式考慮到遮擋後就成了

 

其中G(m,v)是方向m在v上投射時可視的係數 這個m在v方向觀察時完全無遮擋就是1。

一個著名的遮擋項公式是smith的G1 masking公式

 

其中下面的λ項和具體的ndf方程選擇有關。

 

如果不只考慮微表面對微表面的遮擋 ,還要考慮微表面對光源的遮擋,就成了G2公式

G2(l; v; m) = G1(v; m)G1(l; m) 這只是最簡單的一種g2g2不只考慮mv上的可見程度(masking,遮擋) 還考慮m在光源l上的可見程度(shadowing

 

已知微表面的brdfg2d,得到的宏觀表面的brdf

而微表面的brdf通常認爲是純fresnel表面的

而在fresnel裏面只有m等於h(l+v/2)的微表面才反射能量。所以上面等式就變成了

 

 

幾種ndf模型下的 λ:

 Beckmann ,在cook Torrance brdf裏使用

or

其中a是光滑程度(m指向n的程度)

 

Blinn-phone

使用上面相同的lamda

 

GGX 它其實最早被blinn phone 從 trowbrigdge reitz的模型派生出來,但是30年後被walter獨立的發現,walter把它命名爲ggx,後來在遊戲中廣泛應用。

 

Ggx的brdf下一種簡化的g1

 

D 微表面理論下的次表面散射(非金屬)

首先金屬的次表面散射程度很低,所以對於金屬來說,上面的無次表面散射的微表面模型就可以了。只有非金屬纔會討論這個模型。

 

將次表面的散射距離和微表面不規則的尺度對比

如果次表面散射距離更小,那麼微表面作用強烈,表面看上去更粗糙,可以繼續用微表面理論來建模。

如果次表面散射距離更大,那麼微表面作用小,表面看上去更光滑,不能再用微表面理論建模。

如果出於中間狀態,可以用微表面理論建模,但是需要一個額外的量effective surface表示那些散射距離小於微表面距離的散射。

此外觀察距離越遠,微表面距離越大,更傾向於粗糙模型。

 

D1光滑表面的次表面散射 認爲沒有微表面

這種首先可以先想到就用A的lamber模型來表達,因爲微表面作用很差,但是lambert模型裏面所有光線都假設進入體內然後向各個方向均等反射出去,忽略了直接反射的光線無法被做用作次表面散射。

D1對於A模型的提升就在於加了個trade off在specular部分和scattering部分之間,它同入射角有關。入射角變大,fresnel變強,一種計算scattering的bgrf就是用如下公式

即非fresnel的部分縮放原本的c

 

 

D2 粗糙表面 微表面適用的次表面散射模型 認爲是上面C類型的微表面帶次表面的版本

這個模型最爲複雜 ,如shirly的模型

此外Disney也有個經典的微表面理論的次表面散射模型,被稱作disney diffuse,後面會詳細講到,廣泛用於電影中。

 

在實時渲染領域,微表面的次表面散射太過複雜,通常使用lambert的簡單次表面散射模型來代替,而微表面的fresnel因爲簡單所以被採用。所以微表面的fresnel反射+lambert的次表面散射是大多數遊戲引擎的brdf方案(他們之間通常會加一個metallic的值做lerp)。

 

2 商業引擎中的應用

 

2.1 Disney 模型

Disney的pbr模型的創立過程遵循了一個很科學的方法論,即拿真實材質的brdf同數學模型反覆對比調優,即能體現真實材質的模型纔是最準確的。

Merl 100

 

下圖是merl100圖,它是個數據庫,存儲了常見材質測試出來的真實brdf,因爲各向同性的brdf是三個自由度,所有需要用個cube表示,下面的每個圖是這個cube的一個截面。x軸表示h同n的夾角,靠近0時就是高光峯值  (specular peak,大部分圖靠左邊是亮線),y軸是光線同h夾角,靠近90度時是fresnel反射的峯值(fresnel peak,大部分圖靠近頂端是亮線,左上角因爲是peak疊加,最亮),而z軸則是光線和視線在φ上的夾角,區中截面取的是180度時。而右下角則是回射區,也叫grazing(m同n夾角接近90,即我們視線同光線同方向觀察物體,且光線同物體法線幾乎垂直,想想拿手電筒照亮物體的邊緣,且用眼睛盯着邊緣處。部分物體有回射亮斑。)

一些表面存在回射現象,尤其是粗糙表面,因爲它存在一部分和主發現n反向差很大的例如垂直的h,恰好反射了這個grazing角度的光.這也被稱爲fresnel現象,而光滑表面則不會,光滑表面的grazing 角度反而更暗,因爲這個角度上大部分光線被表面反射了,散射的更少。比如用光線垂直照射一些物體的邊緣,我們盯着邊緣看會看到邊緣比旁邊更亮一些,這是微表面模型的顯著特點。

 

 

下面是φ的切片

 

此外這裏還有一條虛的曲線,它就做等值線,等值線上的入射光線角度等於視線的夾角,這代表這條線以下的地方受diffuse影響較大(稱爲散射區域),上面受specular影響較大。

 

 

Disney通過觀察merl100 brdf的特點 來找到合適的模型

 

觀察diffuse區域

 

Lambert假設brdf是個常量,假設光線被充分的散射到各個方向以致於失去了方向性,在各個方向散射均衡,但是從merl100我們看到對於大部分物質在散射區域能量也是分佈不均的。

一個比較大的出入在於一些粗糙表面的grazing 回射現象,lambert沒能表達

觀察D

D項是法線分佈,即哪些方向的H分佈的多,可以通過觀察θd爲0時各個θh的反射來直觀的觀察(即merl100圖的x軸,此時lv重合,爲微表面爲h的面的反射最強能量)。因爲回射現象,光滑和粗糙的反射-θh曲線是這樣的(大體隨h的變大而明顯衰減,但是粗糙表面因爲回射現象在h解決90時反而上升)。

這時對比一些現有的法線分佈模型給出的反射-θh的函數曲線,看哪個和真實相符。

黑色是真實的鉻材質,紅色是ggx,藍色是blinnphone,右面是對應的高光斑。

觀察出來真實表面的高光斑有個特點,峯值區間短,但是長尾,即小光斑加較遠的光暈範圍。

這個傳統的blinnphone那種峯值和尾端均勻分佈的特點不一樣。

 

Disney模型認爲ggx比較接近,但是還差一些,它因此增加了一個控制高光尾部延盞範圍的參數

 

 

觀察Fresnel

 

 一些merl100上的fresnel項基本是這個樣子的

觀察G

首先G必須和D F聯合使用,不能直接觀察G,但是G的作用可以通過直接觀察Albedo,因爲如果不考慮物質的吸收,那麼G項就是直接影響了總反射率,使用很少的簡化假設,可以從D項衍生出G項,算法如《Geometrical shadowing of a random rough surface

,Albedo是半球面每個方向的反射能量和入射光線比(所以不用考慮視線方向高光項),下面分別是光滑和粗糙表面的albedo曲線。跟lambert模型不同的是albedo並不是不隨角度變化的(lmabert裏面的cos和這個無關)。

光滑模型的albedo在75度有個明顯的提升,然後到90迅速回落。(從f項看到90度時fresnel最強,感覺總反射率應該很強,其實不是,90度的光滑表面除了grazing之外的大多數視線方向的D項即specular都很差,收不到太多光線,而90度時的體反射又很差,總反射率是不高的)

粗糙模型的albedo會一直增長到90度,因爲粗糙的原因,很多遮擋被繞過了,90度時很高是有一些回射現象的產生。

下面對比一些G模型和這個merl的曲線。

 

此外還有觀察到一些特殊材質的曲線特點

 

Fabric 紡織物:

  1. grazing angle有tint color的高光
  2. Fresnel peak會比較強

因爲織物會經常看到附近部分

 

Iridescence 虹彩

可以通過爲specular項建模,依據θh和θd,一般要使用個彩虹圖採樣。

基於上面的觀察,Disney確定了它的PBR模型

 

首先是材質模型

 

材質參數設計原則:

  1. 使用直覺而非物理參數
  2. 使用盡量少得參數
  3. 參數都應該是normalize 0-1的 線性變化的 便於線性插值
  4. 參數可以被美術設置的大於1 只要它有意義
  5. 參數的任意組合都應該有意義 魯棒性高

 

選用的參數:

 

basesecolor:半球反射比中反射到次表面散射的那一部分比例(去掉表面反射)

Subsurface: 控制次表面散射的形狀

Metallic  0純次表面散射(絕緣體) 1純fresnel反射(金屬) 在兩種模型之間的線性過渡

Specular 高光反射的強度 其實是被用來計算F(0)

Specular tint 對specular的顏色偏移

Roughness:粗糙度,對diiff和specular都有影響

Anisotropic 各項異性程度 控制高光的方向比(從0各項同性到1最大的各項異性)

Sheen:for cloth,即對回射的增強,前面說織物的grazing 回射要強一些

Clearcoat:第二層高光分佈

clearcoatGloss 控制clearcoat的gloss

 

 

下面是shading model

 

Diffuse Model(次表面散射部分)

這裏沒有簡單的使用lambert,而是使用了基於微表面的次表面散射,但是比前面提到的sherluy的模型要簡單。

 

首先整體上認爲diffuse是跟fresel項相關的,因爲fresnel越強,diffuse的反射就越弱,即公式

(1 - F (θl))(1 - F (θd))

 

然後這個裏面爲什麼是兩個fresnel因子相乘,是因爲即要考慮入射的也要考慮射出的,因爲一個夾角取入射光線夾角θl 個取入射和半角向量的夾角θd最後要除以積分項π。

下一步是展開兩個fresnel項,採用scklic公式,但是這裏認爲對於diffuse不用考慮roi(折射係數,diffuse的折射光線損失),所以刪除了scklic公式裏面的F(0),如果不考慮roi,那麼這個入射的diffuse的能量就是個定值,這個定值是baseColor係數,(他不等同於albedo,albedo是半球反射比,而這個baseColor則是對於diffuse用於固定的入射能量)。

最後它引入了量FD90 , 這個要回到前面提到的對D的觀察,注意到粗糙表面的邊緣回射現象很強,所以FD90 正是爲了調節這個 影響,他是個經驗公式,可以看到roughness越大,它越強,光線和視線夾角越小則越強。它帶來了一個0.5-2.5範圍的調節。

使用這個diffusemodel得到的brdf圖和merl100則相似度很大

 

此外這裏還要考慮一個subsurface的係數,subsurface表示使用次表面散射的sbrdf,即散射範圍要大於粗糙程度,這個參數會在這個模型和sbrdf模型之間過度,使用的sbrdf來自HanrahanKrueger subsurface BRDF

 

 

Specular Model(表面高光反射部分)

 

NDF

 

總體上使用的GGX, GGX的公式其實是Trowbridge-Reitz

即考慮半角向量同法向量的夾角,以及α代表的粗糙度。粗糙度爲1,則絕對粗糙,各方向相同,粗糙度0,絕對平滑(此時半角向量夾角越小,值越大)。但是ggx只是更通用的Generalized-Trowbridge-Reitz公式的一個γ取2的版本。

 

根據前面對merl100的觀察,本模型選取了GTR中參數爲2的版本。

但是對於clearcoat那一層則選取γ爲1.(即光斑更小,拖尾更長)

此外這裏暴露的粗糙度參數alpha直接就是rouphness平方,一個是爲了方便美術調整,而是保證線性插值正確。

 

Fresnel

 

基本採用schlick公式

它被限制在0-0.8,匹配一般ior的範圍1-1.8.而對於cleacoat,則使用固定的roi1.5(代表聚酯酰胺的材質),然後使用clearcoatgloss(0-0.25))這個參數去整體調節clearcoat這一層的顏色強度,而不是單獨調specular。這些參數調整主要是出於要讓artist能夠調出合理的真實材質。

注意θd是光線同half向量的夾角。

 

 

G

基本上使用GGX walter的做法,但是這個G從前面的觀察中在smoothness的邊緣會過亮,所以這裏在算g的時候會remap這個roughness,把它改到0.5-1之間,

對於clearcoat則使用一個固定的roughness 0.25計算。

 

2.2 UE4中的應用

UE的材質設計者先參考了Disney的模型

 

UE中材質參數的設計原則

 

  1. 高效 支持多光源
  2. 參數越少越好
  3. 可同時支持不同的光源,包括ibl
  4. 使用美術可理解的參數,而不是pbr裏原本的物理參數
  5. 單pass
  6. 參數線性, 因爲需要支持多層材質,而最終只希望ps執行一次光照模型 就涉及到所有參數支持線性插值, 希望使用混合了的參數去做shading和shading後混合的結果儘量貼近
  7. 無需使用者理解絕緣體,金屬體這些物理性質,同時也難以創建物理不存在的材質
  8. 因爲deffered shading對lightingmodel的數量有限制, base shading model應該覆蓋99%以上的世界上的材質
  9. 材質參數統一以便混合他們
  10. 可以一定程度支持非真實感渲染的需要

 

shading model

 

Diffuse(次表面反射)

因爲disney模型裏面複雜的微表面diffuse看上去效果和lamber差的不多,且難以用在ibl和sh上,因此就採用最簡單的lamber模型, CDiff就是DHR,或者albedo(0-1)。

 

 

Specular(fresnel反射)

採用的微表面模型

對於D,使用同disney一樣

對於G,使用的不是標準GGX裏面的smith shadow function G2,而是使用的更簡單的schlick模型的G2,但是k=α/2,這樣是爲了能夠同GGX匹配(在alpha=1的時候schlick模型同smith模型是相同的, 在0-1內也是很接近的)。但是他們借鑑了disney模型將粗糙度在平方前映射到(rough +1)/2的做法,來修正ggx同真實材質在曲線尾部的差異(在ibl則不用)。

 

 

Schlick模型的G2公式是:

 

對於F項,則稍微修改了schlick的frensel公式,使用soherical Gaussian 估計 ,據稱差異是不顯著的。

 

IBL

預先生成每個粗糙度下球面的ibl貼圖。因爲IBL的計算是個半球面積分,需要用到重要度採樣去計算這個積分問題。

 

 

Material Model

採用了disney材質參數的簡化版;

Basecolor:albedo,半球反射比

Metallic:diffuse 和specular的過渡

RoughNess:粗糙度

Cavity:這個很特殊,它用於計算細節陰影(法線貼圖產生的)。Disney有個specular,代表F0(其實disney是表示整體specular的縮放),在這裏設計者怕美術對這個名詞產生迷惑,另外測試了對於metal大部分的F0產生的效果沒有太大差異,因此它的F0從這個cavity算出,另外對於nonmetal這個F0被設置成0.04

至於subsurface clearcoat sheen則採用單獨的模型

 

Material Layering

這是ue的meterial editor的主要設計驅動

 

Lighting Model

 

點光源的距離衰減公式是

Arelight

 

沒有arealight 美術會傾向將粗糙度調高,因爲低粗糙度導致反射能量弱,高光刺,這都是缺少光源導致。採用的TubeLight來模擬

 

以上就是對PBR的精度模型和在ue4,disney中應用的總結,沒有一種模型是可以用在所有項目中的,也沒有哪個是絕對物理的,還是要根據自己項目的實際情況,權衡效率和性能,權衡藝術化和真實物理merl100後確定自己的PBR使用,關鍵在於理出自己的material model(暴露什麼樣的參數給美術條件,參數之間怎麼混合), shading model(brdf的每一部分選用什麼公式,分解到具體的次表面反射,fresnel,ndf和G),light model(支持哪些光源類型,方向分佈和距離衰減公式分別是什麼)這三大model。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章