【基於物理的渲染(PBR)白皮書】(三)迪士尼原則的BRDF與BSDF相關總結
基於物理的渲染(Physically Based Rendering , PBR)技術,自迪士尼在SIGGRAPH 2012上提出了著名的“迪士尼原則的BRDF(Disney Principled BRDF)”之後,由於其高度的易用性以及方便的工作流,已經被電影和遊戲業界廣泛使用,併成為了次時代高品質渲染技術的代名詞。
本文的主要內容,便是對推動了這次基於物理的渲染革命的“迪士尼原則的BRDF(Disney Principled BRDF)”,以及隨後2015年提出的“迪士尼BSDF(Disney BSDF)”進行深入的探討、總結與提煉。
全文主要內容脈絡如下:
- 迪士尼與基於物理的渲染的發展
- 迪士尼采用的BRDF視覺化方案與工具
- 迪士尼對測量材質資料庫的觀察結論
- Diffuse項的觀察結論
- Specular D 項的觀察結論
- Specular F 項的觀察結論
- Specular G 項的觀察結論
- 布料(Fabric)材質的觀察結論
- 彩虹色(Iridescence)的觀察結論
- 迪士尼原則的BRDF(Disney Principled BRDF)
- Disney Principled BRDF的理念
- Disney Principled BRDF的引數
- Disney Principled BRDF的著色模型
- 核心BRDF模型
- 漫反射項(Diffuse):Disney Diffuse
- 法線分佈項(Specular D):GTR
- 菲涅爾項(Specular F):Schlick Fresnel
- 幾何項(Specular G):Smith-GGX
- 迪士尼原則的分層材質(Disney Principled Layers Material)
- Disney Principled BRDF的實現程式碼
- 迪士尼BSDF(Disney BSDF)
在文章開頭,依然是首先放出總結了本文核心內容脈絡的兩張思維導圖:


圖片較大,建議下載到本地後放大檢視。原圖下載地址:
OK,讓我們直接開始正文。
一、迪士尼與基於物理的渲染的發展
正如這個系列前文已經提到的,基於物理的渲染其實早在20世紀就已經在圖形學業界有了一些萌芽,2010年在SIGGRAPH上就已經有公開討論的Course《SIGGRAPH 2010 Course: Physically-Based Shading Models in Film and Game Production》,而直到2012~2013年,才正式進入大眾的視野,漸漸被電影和遊戲業界廣泛使用。
究其原因,一方面是因為硬體效能的限制,另一方面,則是因為早期的基於物理的渲染模型包含大量複雜而晦澀的物理引數,不利於美術人員的理解、使用和快速產出。
迪士尼則是這次PBR革命的重要推動者。在創作電影《無敵破壞王(Wreck-It Ralph)》期間,迪士尼動畫工作室對基於物理的渲染進行了系統的研究,最終開發出了一種幾乎可以用於電影的每個表面新的BRDF模型(頭髮除外),即迪士尼原則的BRDF(Disney Principled BRDF)。

圖 迪士尼動畫電影《無敵破壞王》(2012)
隨後,迪士尼動畫工作室的Brent Burley於SIGGRAPH 2012上進行了著名的talk《Physically-based shading at Disney》,正式提出了迪士尼原則的BRDF(Disney Principled BRDF),由於其高度的通用性,將材質複雜的物理屬性,用非常直觀的少量變量表達了出來(如金屬度metallic和粗糙度roughness),在電影業界和遊戲業界引起了不小的轟動。從此,基於物理的渲染正式進入大眾的視野。

圖 SIGGRAPH 2012《Physically-based shading at Disney》
在2012年受到Disney Principled BRDF的啟發後,主流遊戲引擎都開始從傳統的渲染工作流轉移到基於物理的渲染工作流。
以下是主流遊戲引擎轉移到基於物理的渲染的時間節點:
- 【SIGGRAPH 2013】 UE4 :《Real Shading in Unreal Engine 4》
- 【SIGGRAPH 2014】 Frostbite(寒霜): 《Moving Frostbite to PBR》
- 【GDC 2014】 Unity:《Physically Based Shading in Unity》
下面,讓我們正式開始分析、提煉和總結SIGGRAPH 2012上迪士尼進行的talk《Physically-based shading at Disney》,深入瞭解其能讓基於物理的渲染技術普及於遊戲和電影工業的背後原因。
二、迪士尼采用的BRDF視覺化方案與工具
在BRDF視覺化方面,迪士尼在分享中提出了三個方面的工具與資源,可以總結如下:
- MERL 100 BRDF材質庫 。Matusik等人[Matusik et al.2003]捕獲的一組100個各向同性BRDF材質樣本庫。涵蓋了各種材質,包括油漆,木材,金屬,織物,石材,橡膠,塑料和其他合成材質。對學術與研究免費授權。
- MERL BRDF主站 : http:// merl.com/brdf
- Database地址: https:// people.csail.mit.edu/wo jciech/BRDFDatabase/
- BRDF Explorer 。迪士尼為分析、比較和新開發BRDF模型而開發的視覺化工具。該工具在分析測量材質,比較現有模型,以及開發新模型方面具有無可估量的價值。
- 官方主頁: https://www. disneyanimation.com/tec hnology/brdf.html
- GitHub地址: https:// github.com/wdas/brdf
- BRDF Image Slice切片 。將θh與θd作為橫軸和縱軸,對觀察到的材質的BRDF進行建模的2D影象切片。

圖 “MERL 100”BRDF資料庫

圖 BRDF Explorer

圖:紅色塑料(red-plastic)和鏡面紅色塑料(specular-red-plastic)的BRDF影象切片以及“切片空間(Slice Space)”示意圖。

圖 MERL 100 BRDF資料庫的影象切片(Image Slice)
三、迪士尼對MERL材質資料庫的觀察結論
在提出Disney Principled BRDF之前,Disney已經做了大量的前置工作,其中,最主要的工作便是對材質資料庫的觀察與進行理論分析。按照不同項的分類,可以總結為如下6個部分:
- Diffuse項的觀察結論
- Specular D 項的觀察結論
- Specular F 項的觀察結論
- Specular G 項的觀察結論
- 布料(Fabric)材質的觀察結論
- 彩虹色(Iridescence)的觀察結論
下文將對其分別進行相關總結。
3.1 Diffuse項的觀察結論
- 漫反射(Diffuse)表示折射(refracted)到表面,經過散射(scattered)和部分吸收(partially absorbed),最終重新出表面出射的光。
- 被著色的非金屬材質的任意出射部分都可以視為漫反射。
- 通過觀察得出,很少有材質的漫反射表現和Lambert反射模型相吻合。即需要更準確的漫反射模型。
- 通過觀察得出掠射逆反射(grazing retroreflection)有明顯的著色現象,即可以將掠射逆反射(grazing retroreflection)也看做一種漫反射現象。
- 粗糙度會對菲涅爾折射造成影響,而一般的漫反射模型如Lmabert忽略了這種影響。

圖 表現出漫反射顏色變化的材質。 上:渲染球體上的點光源響應; 下:BRDF影象切片。

圖 紅色塑料,鏡面紅色塑料和Lambert漫反射的點光源響應
- Oren-Nayar模型(1995)預測粗糙漫反射表面逆向反射的增加會使漫反射形狀變平。然而,其逆向反射波峰不像測量資料那樣強,並且粗糙測量的材質通常不顯示漫反射的平坦化。
- Hanrahan-Krueger模型(1993),源自次表面散射理論,也預測了漫反射形狀的平坦化,但在邊緣處沒有足夠強的峰值。與Oren-Nayar相比,該模型呈現出完美光滑的表面。下圖中比較了Oren-Nayar、Hanrahan-Krueger和Lambert模型。

圖 Lambert,Oren-Nayar和Hanrahan-Krueger漫反射模型的BRDF切片和點光源響應。
3.2 Specular D 項的觀察結論
- 微觀分佈函式D(θh)可以從測量材質的逆反射(retroreflective)響應觀察得到。
- 絕大多數MERL材質都有鏡面波瓣(specular lobes),且尾部比傳統的鏡面模型長得多。 即反射分佈項需要更寬的尾部。
- GGX比其他分佈具有更長的尾部,但仍然無法捕捉到鉻金屬(chrome)樣本的閃亮亮點。

圖 MERL 鉻金屬(chrome)與幾個鏡面分佈的比較。 左:鏡面波峰的對數比例圖); 黑色曲線表示MERL 鉻金屬(chrome),紅色曲線表示 GGX分佈( α = 0.006),綠色曲線表示Beckmann分佈( m = 0.013),藍色曲線表示 Blinn Phong( n = 12000),其中,綠色曲線和藍色曲線基本重合。 右: chrome 、GGX和Beckmann分佈的點光源響應。
3.3 Specular F 項的觀察結論
- 菲涅爾反射係數F(θd)表示了當光和檢視向量分開時鏡面反射的增加。
- 光滑表面在切線入射時有將接近100%的鏡面反射。
- 對於粗糙表面,無法實現100%的鏡面反射,但反射率仍會將變得越來越高。
- 每種材質在掠射角附近都顯示出一些反射率的增加。
- 掠射角入射附近的許多曲線的陡度已經大於菲涅爾效應的預測值。
3.4 Specular G 項的觀察結論
- 幾何項的影響可以間接地看作其對方向反射率(directional albedo)的影響
- 大多數材質的方向反射率(directional albedo)對於前70度是相對平坦的,並且切線入射處的反射率與表面粗糙度密切相關。
- 幾何項的選擇會對反射率產生影響,反過來又會對錶面外觀產生影響。
- 完全省略G項和1/cosθl cosθv項的模型,被稱為“No G”模型,會導致在掠射角處過暗的響應。

圖 幾種鏡面反射幾何模型的反射率圖示。 所有圖中都使用相同的D(GGX / TR)項和F項。 左圖:光滑表面(α= 0.02); 右圖:粗糙表面(α= 0.5)。 其中,“No G”模型已去除G和1/cosθl cosθv項的計算。
3.5 布料(Fabric)材質的觀察結論
- 許多布料樣本在掠射角處呈現出鏡面反射的色調,並且還具有比具有十分粗糙的材質更強的菲涅爾波峰。
- 布料具有有色的掠射反射,可以理解為是其輪廓附近獲取到材質顏色的透射纖維(transmissive fibers)造成的。
- 布料在掠射角處的額外光澤增加,超出了普通微平面模型的預測範圍。

圖 各種布料樣本的BRDF影象切片
3.6 彩虹色(Iridescence)的觀察結論
- 變色塗料(color-changing-paint)在(θh,θd)空間上顯示出連續的色塊,切對φd的依賴性最小。
- 彩虹色遠離鏡面峰值的反射率非常小,所以可以將彩虹色理解為一種鏡面反射現象。
- 可以將鏡面色調調製為θh和θd的函式,配合小尺寸紋理貼圖對彩虹色進行建模。

圖 3種變色塗料(color-changing-paint)的BRDF影象切片。上圖:原始資料; 下圖:通過每畫素縮放1/ max(r, g, b)生成的相應色度影象。
四、迪士尼原則的BRDF(Disney Principled BRDF)
4.1 Disney Principled BRDF的理念
在2012年迪士尼原則的BRDF被提出之前,基於物理的渲染都需要大量複雜而不直觀的引數,此時PBR的優勢,並沒有那麼明顯。
在2012年迪士尼提出,他們的著色模型是藝術導向(Art Directable)的,而不一定要是完全物理正確(physically correct) 的,並且對微平面BRDF的各項都進行了嚴謹的調查,並提出了清晰明確而簡單的解決方案。
迪士尼的理念是開發一種“原則性”的易用模型,而不是嚴格的物理模型。正因為這種藝術導向的易用性,能讓美術同學用非常直觀的少量引數,以及非常標準化的工作流,就能快速實現涉及大量不同材質的真實感的渲染工作。而這對於傳統的著色模型來說,是不可能完成的任務。
迪士尼原則的BRDF(Disney Principled BRDF)核心理念如下:
- 應使用直觀的引數,而不是物理類的晦澀引數。
- 引數應儘可能少。
- 引數在其合理範圍內應該為0到1。
- 允許引數在有意義時超出正常的合理範圍。
- 所有引數組合應儘可能健壯和合理。
而從本質上而言,Disney Principled BRDF模型是金屬和非金屬的混合型模型,最終結果是基於金屬度(metallice)在金屬BRDF和非金屬BRDF之間進行線性插值。

圖 Disney BRDF模型是金屬和非金屬基於金屬度(metallic)的線性混合模型
正因為這套新的渲染理念統一了金屬和非金屬的材質表述,可以僅通過少量的引數來涵蓋自然界中絕大多數的材質,並可以得到非常逼真的渲染品質。
也正因如此,在PBR的金屬/粗糙度工作流中,固有色(baseColor)貼圖才會同時包含金屬和非金屬的材質資料:
- 金屬的反射率值
- 非金屬的漫反射顏色
4.2 Disney Principled BRDF的引數
以上述理念為基礎,迪士尼動畫工作室對每個引數的新增進行了把關,最終得到了一個顏色引數(baseColor)和下面描述的十個標量引數:
- baseColor(固有色):表面顏色,通常由紋理貼圖提供。
- subsurface(次表面):使用次表面近似控制漫反射形狀。
- metallic(金屬度):金屬(0 = 電介質,1 =金屬)。這是兩種不同模型之間的線性混合。金屬模型沒有漫反射成分,並且還具有等於基礎色的著色入射鏡面反射。
- specular(鏡面反射強度):入射鏡面反射量。用於取代折射率。
- specularTint(鏡面反射顏色):對美術控制的讓步,用於對基礎色(basecolor)的入射鏡面反射進行顏色控制。掠射鏡面反射仍然是非彩色的。
- roughness(粗糙度):表面粗糙度,控制漫反射和鏡面反射。
- anisotropic(各向異性強度):各向異性程度。用於控制鏡面反射高光的縱橫比。(0 =各向同性,1 =最大各向異性。)
- sheen(光澤度):一種額外的掠射分量(grazing component),主要用於布料。
- sheenTint(光澤顏色):對sheen(光澤度)的顏色控制。
- clearcoat(清漆強度):有特殊用途的第二個鏡面波瓣(specular lobe)。
- clearcoatGloss(清漆光澤度):控制透明塗層光澤度,0 = “緞面(satin)”外觀,1 = “光澤(gloss)”外觀。

圖 Disney Principled BRDF的引數
4.3 Disney Principled BRDF的著色模型
4.3.1 核心BRDF 模型
核心BRDF模型方面,Disney採用了通用的microfacet Cook-Torrance BRDF著色模型:
其中:
- Diffuse為漫反射項
-
為鏡面反射項,其中:
- D為微平面分佈函式,主要負責鏡面反射波峰(specular peak)的形狀。
- F為菲涅爾反射係數(Fresnel reflection coefficient)
- G為幾何衰減(geometric attenuation)/ 陰影項(shadowing factor)。
下文將對這些項分別進行說明。
4.3.2 漫反射項(Diffuse):Disney Diffuse
Disney表示,Lambert漫反射模型在邊緣上通常太暗,而通過嘗試新增菲涅爾因子以使其在物理上更合理,但會導致其更暗。
所以,根據對Merl 100材質庫的觀察,Disney開發了一種用於漫反射的新的經驗模型,以在光滑表面的漫反射菲涅爾陰影和粗糙表面之間進行平滑過渡。
思路方面,Disney使用了Schlick Fresnel近似,並修改掠射逆反射(grazing retroreflection response)以達到其特定值由粗糙度值確定,而不是簡單為0。
Disney Diffuse漫反射模型的公式為:
其中,
以下為上述Disney Diffuse的Shader實現程式碼:
// [Burley 2012, "Physically-Based Shading at Disney"] float3 Diffuse_Burley_Disney( float3 DiffuseColor, float Roughness, float NoV, float NoL, float VoH ) { float FD90 = 0.5 + 2 * VoH * VoH * Roughness; float FdV = 1 + (FD90 - 1) * Pow5( 1 - NoV ); float FdL = 1 + (FD90 - 1) * Pow5( 1 - NoL ); return DiffuseColor * ( (1 / PI) * FdV * FdL ); }
4.3.3 法線分佈項(Specular D):GTR
在流行的模型中,GGX擁有最長的尾部。而GGX其實與Blinn (1977)推崇的Trowbridge-Reitz(TR)(1975)分佈等同。然而,對於許多材質而言,即便是GGX分佈,仍然沒有足夠長的尾部。
Trowbridge-Reitz(TR)的公式為:
其中:
- c為縮放常數(scaling constant)
- α為粗糙度引數(roughness parameter),其值在0和1之間;α=0產生完全平滑的分佈(即 θh = 0時的delta函式),α=1產生完全粗糙或均勻的分佈。
來自Berry(1923)的分佈函式和Trowbridge-Reitz分佈具有非常相似的形式,但指數為1而不是2,從而導致了更長的尾部:
通過,Trowbridge-Reitz和Berry的形式的對比,Disney發現其具有相似的形式,只是冪次不同,於是,Disney將Trowbridge-Reitz進行了N次冪的推廣,並將其取名為Generalized-Trowbridge-Reitz,GTR:
可以發現,上式中:
- γ=1時,GTR即Berry分佈
- γ=2時,GTR即Trowbridge-Reitz分佈
以下為各種γ值的GTR分佈曲線與θh的關係圖示:

圖 各種γ值的GTR分佈曲線與 θh 的關係
另外,Disney Principled BRDF中使用了兩個固定的鏡面反射波瓣(specular lobe),且都使用GTR模型,可以總結如下:
- 主波瓣(primary lobe)
- 使用γ= 2的GTR(即GGX分佈)
- 代表基礎底層材質(Base Material)的反射
- 可為各項異性(anisotropic) 或各項同性(isotropic)的金屬或非金屬
- 次級波瓣(secondary lobe)
- 使用γ= 1的GTR(即Berry分佈)
- 代表基礎材質上的清漆層(ClearCoat Layer)的反射
- 一般為各項同性(isotropic)的非金屬材質,即清漆層(ClearCoat Layer)
以下是γ= 1和γ= 2時GTR分佈的Shader實現程式碼:
// Generalized-Trowbridge-Reitz distribution float D_GTR1(float alpha, float dotNH) { float a2 = alpha * alpha; float cos2th = dotNH * dotNH; float den = (1.0 + (a2 - 1.0) * cos2th); return (a2 - 1.0) / (PI * log(a2) * den); } float D_GTR2(float alpha, float dotNH) { float a2 = alpha * alpha; float cos2th = dotNH * dotNH; float den = (1.0 + (a2 - 1.0) * cos2th); return a2 / (PI * den * den); }
以及各項異性的版本:
float D_GTR2_aniso(float dotHX, float dotHY, float dotNH, float ax, float ay) { float deno = dotHX * dotHX / (ax * ax) + dotHY * dotHY / (ay * ay) + dotNH * dotNH; return 1.0 / (PI * ax * ay * deno * deno); }
4.3.4 菲涅爾項(Specular F):Schlick Fresnel
菲涅爾項(Specular F)方面,Disney表示Schlick Fresnel近似已經足夠精確,且比完整的菲涅爾方程簡單得多; 而由於其他因素,Schlick Fresne近似引入的誤差明顯小於其他因素產生的誤差。Schlick Fresnel 近似公式如下:
其中:
- 常數F0表示垂直入射時的鏡面反射率。
- θd為半向量h和視線向量v之間的夾角
以下為Schlick Fresnel的Shader實現程式碼:
// [Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering"] float3 F_Schlick(float HdotV, float3 F0) { return F0 + (1 - F0) * pow(1 - HdotV , 5.0)); }
一般建議實現一個自定義的Pow5工具函式替換pow(xx, 5.0)的呼叫,以省去pow函式帶來的稍昂貴的效能開銷。
Pow5函式實現很簡單,如下所示:
half Pow5(half v) { return v * v * v * v * v; }
另外,Disney在SIGGRAPH 2015上對此項進行了修訂,提出在介質間相對IOR接近1時,Schlick近似誤差較大,這時可以直接用精確的菲涅爾方程:

4.3.5 幾何項(Specular G):Smith-GGX
幾何項(Specular G)方面,對於主鏡面波瓣(primary specular lobe),Disney參考了 Walter的近似方法,使用Smith GGX匯出的G項,並將粗糙度引數進行重對映以減少光澤表面的極端增益,即將α 從[0, 1]重對映到[0.5, 1],α的值為(0.5 + roughness/2)^2。從而使幾何項的粗糙度變化更加平滑,更便於美術人員的使用。
以下為Smith GGX的幾何項的表示式:
另外,對於對清漆層進行處理的次級波瓣(secondary lobe),Disney沒有使用Smith G推導,而是直接使用固定粗糙度為0.25的GGX的 G項,便可以得到合理且很好的視覺效果。
幾何項的Shader實現程式碼如下:
// Smith GGX G項,各項同性版本 float smithG_GGX(float NdotV, float alphaG) { float a = alphaG * alphaG; float b = NdotV * NdotV; return 1 / (NdotV + sqrt(a + b - a * b)); } // Smith GGX G項,各項異性版本 // Derived G function for GGX float smithG_GGX_aniso(float dotVN, float dotVX, float dotVY, float ax, float ay) { return 1.0 / (dotVN + sqrt(pow(dotVX * ax, 2.0) + pow(dotVY * ay, 2.0) + pow(dotVN, 2.0))); } // GGX清漆幾何項 // G GGX function for clearcoat float G_GGX(float dotVN, float alphag) { float a = alphag * alphag; float b = dotVN * dotVN; return 1.0 / (dotVN + sqrt(a + b - a * b)); }
同樣,Disney在SIGGRAPH 2015上也對G項進行了修訂,他們基於Heitz的分析[Heitz 2014],淘汰了對於主鏡面波瓣的Smith G粗糙度的特殊重對映,採用了Heitz各向異性的G,後文會對這次修訂做更深入的探討。
五、迪士尼原則的分層材質(Disney Principled Layers Material)
迪士尼原則的分層材質(Disney Principled Layers Material)的核心設計原則是,所有引數需允許健壯地插值,以基於紋理Mask在不同材質之間進行線性混合,實現複雜的材質外觀。
這樣的好處是使所有引數是歸一化的並且至少是感知線性的,材質通常以非常直觀的方式插值。如下圖,所有10個引數都是線性插值的。

圖 使用Disney Principled Shading Model在閃亮的金屬金色和藍色橡膠之間線性插值
在創作過程中,美術人員通常會從一個材質預設列表中進行選擇,然後使用紋理遮罩簡單地在其之間進行混合。實時證明,這套方案非常成功的,大大簡化了工作流程,提高了材質的一致性,並使著色器計算非常高效。迪士尼使用的對應的分層著色器的UI如下圖所示。

圖 顯示材質圖層的著色器編輯器的螢幕截圖。mask表示式中的變數指的是空間變化的著色器模組,通常是mask紋理貼圖。
六、Disney Principled BRDF的實現程式碼
Disney在2012年Disney Principled BRDF提出時,已經在GitHub上開源了BRDF Explorer,以及Disney Principled BRDF的實現原始碼,其GitHub連結為:
wdas/brdf github.com
需要注意的是,這段原始碼使用的是特有的著色語言,但其實和一般的CG著色語言非常相似。
為了配合與本文內容結合閱讀與理解,這裡也將這段經典的Shader程式碼引用到本文中來:
::begin parameters color baseColor .82 .67 .16 float metallic 0 1 0 float subsurface 0 1 0 float specular 0 1 .5 float roughness 0 1 .5 float specularTint 0 1 0 float anisotropic 0 1 0 float sheen 0 1 0 float sheenTint 0 1 .5 float clearcoat 0 1 0 float clearcoatGloss 0 1 1 ::end parameters ::begin shader const float PI = 3.14159265358979323846; float sqr(float x) { return x*x; } float SchlickFresnel(float u) { float m = clamp(1-u, 0, 1); float m2 = m*m; return m2*m2*m; // pow(m,5) } float GTR1(float NdotH, float a) { if (a >= 1) return 1/PI; float a2 = a*a; float t = 1 + (a2-1)*NdotH*NdotH; return (a2-1) / (PI*log(a2)*t); } float GTR2(float NdotH, float a) { float a2 = a*a; float t = 1 + (a2-1)*NdotH*NdotH; return a2 / (PI * t*t); } float GTR2_aniso(float NdotH, float HdotX, float HdotY, float ax, float ay) { return 1 / (PI * ax*ay * sqr( sqr(HdotX/ax) + sqr(HdotY/ay) + NdotH*NdotH )); } float smithG_GGX(float NdotV, float alphaG) { float a = alphaG*alphaG; float b = NdotV*NdotV; return 1 / (NdotV + sqrt(a + b - a*b)); } float smithG_GGX_aniso(float NdotV, float VdotX, float VdotY, float ax, float ay) { return 1 / (NdotV + sqrt( sqr(VdotX*ax) + sqr(VdotY*ay) + sqr(NdotV) )); } vec3 mon2lin(vec3 x) { return vec3(pow(x[0], 2.2), pow(x[1], 2.2), pow(x[2], 2.2)); } vec3 BRDF( vec3 L, vec3 V, vec3 N, vec3 X, vec3 Y ) { float NdotL = dot(N,L); float NdotV = dot(N,V); if (NdotL < 0 || NdotV < 0) return vec3(0); vec3 H = normalize(L+V); float NdotH = dot(N,H); float LdotH = dot(L,H); vec3 Cdlin = mon2lin(baseColor); float Cdlum = .3*Cdlin[0] + .6*Cdlin[1]+ .1*Cdlin[2]; // luminance approx. vec3 Ctint = Cdlum > 0 ? Cdlin/Cdlum : vec3(1); // normalize lum. to isolate hue+sat vec3 Cspec0 = mix(specular*.08*mix(vec3(1), Ctint, specularTint), Cdlin, metallic); vec3 Csheen = mix(vec3(1), Ctint, sheenTint); // Diffuse fresnel - go from 1 at normal incidence to .5 at grazing // and mix in diffuse retro-reflection based on roughness float FL = SchlickFresnel(NdotL), FV = SchlickFresnel(NdotV); float Fd90 = 0.5 + 2 * LdotH*LdotH * roughness; float Fd = mix(1.0, Fd90, FL) * mix(1.0, Fd90, FV); // Based on Hanrahan-Krueger brdf approximation of isotropic bssrdf // 1.25 scale is used to (roughly) preserve albedo // Fss90 used to "flatten" retroreflection based on roughness float Fss90 = LdotH*LdotH*roughness; float Fss = mix(1.0, Fss90, FL) * mix(1.0, Fss90, FV); float ss = 1.25 * (Fss * (1 / (NdotL + NdotV) - .5) + .5); // specular float aspect = sqrt(1-anisotropic*.9); float ax = max(.001, sqr(roughness)/aspect); float ay = max(.001, sqr(roughness)*aspect); float Ds = GTR2_aniso(NdotH, dot(H, X), dot(H, Y), ax, ay); float FH = SchlickFresnel(LdotH); vec3 Fs = mix(Cspec0, vec3(1), FH); float Gs; Gs= smithG_GGX_aniso(NdotL, dot(L, X), dot(L, Y), ax, ay); Gs *= smithG_GGX_aniso(NdotV, dot(V, X), dot(V, Y), ax, ay); // sheen vec3 Fsheen = FH * sheen * Csheen; // clearcoat (ior = 1.5 -> F0 = 0.04) float Dr = GTR1(NdotH, mix(.1,.001,clearcoatGloss)); float Fr = mix(.04, 1.0, FH); float Gr = smithG_GGX(NdotL, .25) * smithG_GGX(NdotV, .25); return ((1/PI) * mix(Fd, ss, subsurface)*Cdlin + Fsheen) * (1-metallic) + Gs*Fs*Ds + .25*clearcoat*Gr*Fr*Dr; } ::end shader
七、迪士尼BSDF(Disney BSDF)
PS: 由於Disney BSDF天生適合離線渲染器使用,對遊戲引擎和實時渲染的參考意義比較有限,加上篇幅原因,所以這裡僅對Disney BSDF做一個大致的總結,後續有機會再展開進行進一步分析。
在2013年上映的動畫電影《冰雪奇緣》中,迪士尼繼續沿用了之前開發的Disney Principled BRDF基於物理的著色系統,但對於折射和次表面散射等效果而言,需要與BRDF分開計算,且間接光照使用點雲(point clouds)進行了近似。
而從2014年的《超能陸戰隊(Big Hero 6)》開始,迪士尼開始採用路徑追蹤全域性光照(path-traced global illumination)進行新電影的製作。所以,原本的BRDF模型已經無法滿足需求,於是迪士尼在之前的Disney Principled BRDF的基礎上進行了改進,新開發出了Disney BSDF,並於SIGGPRAPH 2015上,通過talk《Extending the Disney BRDF to a BSDF with Integrated Subsurface Scattering》正式提出。

圖 SIGGPRAPH 2015《Extending the Disney BRDF to a BSDF with Integrated Subsurface Scattering》

圖 迪士尼動畫電影《超能陸戰隊(Big Hero 6)》

圖 基於Disney BSDF的渲染的示例
前文提到,Disney BRDF模型本質上是金屬和非金屬的混合型模型,對於Disney BSDF,Disney仍然延續了之前的設計理念,採用了混合的方式並結合已有的Disney BRDF模型進行實現。如下圖,Disney新增了⼀個引數specTrans(鏡面反射透明度)來控制BRDF 和BSDF的混合。基於specTrans完成混合後,再使用和Disney BRDF類似的方式,基於metallic再進行一次混合。
即Disney BRDF模型的本質是金屬BRDF、非金屬BRDF、與Specular BSDF三者的混合型模型。

圖 Disney BSDF設計思路
引數方面,Disney BSDF按普通表面和薄表面各有不同:
- 對於普通表面,Disney BSDF在Disney BRDF的基礎上新增specTrans(鏡面反射透明度)和scatterDistance(散射距離)兩個引數,共12個。
- 對於薄表面(Thin-surface),Disney BSDF在Disney BRDF的基礎上新增specTrans(鏡面反射透明度)、scatterDistance(散射距離)和flatness(平坦度)三個引數,共13個。
以下是開源三維動畫軟體Blender實現的Disney BSDF的圖示(根據實際使用情況,Blender對Disney BSDF的實現有相應的修改):

圖 Disney Principled BSDF @Blender
除了新增的Specular BSDF模型,Disney還提出了新的次表面散射模型,以及針對薄表面的折射處理,可以總結如下:
- 在Disney BRDF中加入次表面散射模型 。具體思路是首先將漫射波瓣重構為兩部分:方向性的微表面效應(microsurface effect),主要為逆反射(retroreflection);非方向性的次表面效應(subsurface effect),即Lambertian。然後,用散射模型(diffusion model)或體積散射模型(volumetric scattering model)替換漫反射波瓣中的Lambert部分。這樣,便能保留微表面效應(microsurface effect),讓散射模型在散射距離較小時收斂到與漫反射BRDF相同的結果。
- 提出基於兩個指數項總和的次表面漫射(Subsurface diffusion)模擬模型。 次表⾯漫射(Subsurface diffusion)。Disney通過蒙特卡洛模擬(Monte Carlo simulation),觀察到對於典型的散射引數,包括單次散射的擴散剖面(diffusion profile),使用兩個指數項的總和(a sum of two exponentials)便可以很好地進行模擬,且得到了比偶極子剖面(dipole diffusion)更好的渲染結果。如下圖所示。
- 薄表面BSDF(Thin-surface BSDF) 。對於薄的半透明表⾯,Disney選擇在單個著色點處模擬入射和出射散射事件,作為鏡面反射和漫反射傳輸的組合,由specTrans和diffTrans引數控制,並用各向同性的波瓣近似薄表面漫反射傳輸。如下圖所示。

圖 蒙特卡洛散射(Monte Carlo diffusion)模擬,指數擬合與偶極子資料的對比。

圖 以陰影邊界處的蒙特卡洛散射(Monte Carlo diffusion)渲染作為參考,與指數擬合(exponential fit),以及偶極子剖面(dipole diffusion)的對比。指數擬合與蒙特卡羅散射的參考看不出區別,而偶極子模型有明顯的模糊,還有青色條帶,這兩種現象都是美術人員經常會抱怨的。

圖 使用歸一化擴散次表面(normalized diffusion subsurface)模型渲染出的《超能陸戰隊》人物。

圖 《超能陸戰隊》中基於薄表面(Thin-surface)渲染技術渲染出的Baybax
八、本文內容要點總結
正文到這裡已經結束。不妨使用本文主要內容提煉出的思維導圖作為全文的內容總結:

原圖下載地址: QianMo/PBR-White-Paper
系列文章的GitHub Repo
另外,和這個系列文章一起釋出的還有一個GitHub倉庫【 PBR-White-Paper 】,作為這個系列文章的合集,後續整理好的PDF也會發布至此Repo中
這裡是本文的GitHub版:
QianMo/PBR-White-Paper github.com
Reference
[1] Burley B, Studios W D A. Physically-based shading at disney[C]//ACM SIGGRAPH. 2012, 2012: 1-7.
[2] Burley B. Extending the Disney BRDF to a BSDF with integrated subsurface scattering[J]. the Physically Based Shading in Theory and Practice SIGGRAPH Course, 2015.
[3] Matusik W, Pfister H, Brand M, et al. Efficient isotropic BRDF measurement[J]. 2003.
[4] Heitz E. Understanding the masking-shadowing function in microfacet-based BRDFs[J]. Journal of Computer Graphics Techniques, 2014, 3(2): 32-91.
[5] 題圖來自迪士尼電影《無敵破壞王2:大鬧網際網路》