着色模型简介和实现(上)
摘要
著色模型(shading model)描述的是材質表面對光線的作用,它的輸入是光線、入射角、反射角、材質的屬性(例如粗糙度、金屬度等),輸出是材質的顏色。前面提到的BRDF模型就是shading model的一種,但是BRDF模型過于簡單,很多復雜的物理現象無法描述。本文將接著BRDF繼續介紹一些更復雜的shading model,以及UE4和Disney的實現。
本文主要介紹理論部分,下篇將介紹UE4、Filament以及Disney對shading model的詳細實現。
理論
主要介紹對各向異性、次表面、清漆和布料幾種物理現象的shading model。
Anisotropy
上圖左:各向同性金屬球;右:各向異性金屬球。圖片來源:Filament文檔。
將各向同性的shading model拓展到各向異性,需要解決兩個問題,
對于第一個問題,既然是“各向”異性,必然要分別定義各個方向上的差異的屬性,這里的屬性一般是粗糙度。方向一般在切平面上選取兩個軸,即tangent方向和bitagent方向,他們與normal方向共通構成一組正交基底(TBN坐標系)。對于需要精細控制切平面方向的模型,比如頭發,會單獨提供切向貼圖,指明切向方向,類似于法向貼圖。其他情況一般由系統(shader)確定切向方向。所以總結下來,需要額外增加一個參數,將原有的粗糙度替換為tangent和bitangent方向的粗糙度(記為αt,αb\alpha_t,\alpha_bαt?,αb?或αx,αy\alpha_x,\alpha_yαx?,αy?)。
實際操作中,一般是增加一個anisotropy各向異性參數,然后用粗糙度α\alphaα(α=roughness?roughness\alpha = roughness * roughnessα=roughness?roughness)和anisotropy計算tangent/bitangent兩個方向上的粗糙度,具體的映射方法有很多。
- Neubelt and Pettine
αx=ααy=lerp(0,α,1?anisotropy)\begin{aligned} \alpha_x & = \alpha \\ \alpha_y & = lerp(0, \alpha, 1-anisotropy) \end{aligned} αx?αy??=α=lerp(0,α,1?anisotropy)?
- Burley
αx=α1?0.9×anisotropyαy=α1?0.9×anisotropy\begin{aligned} \alpha_x & = \frac{\alpha}{\sqrt{1-0.9\times anisotropy}} \\ \alpha_y & = \alpha\sqrt{1-0.9\times anisotropy} \end{aligned} αx?αy??=1?0.9×anisotropy?α?=α1?0.9×anisotropy??
- Kulla
αx=α×(1+anisotropy)αy=α×(1?anisotropy)\begin{aligned} \alpha_x & = \alpha \times (1+anisotropy) \\ \alpha_y & = \alpha \times (1-anisotropy) \end{aligned} αx?αy??=α×(1+anisotropy)=α×(1?anisotropy)?
對于第二個問題,BRDF公式取決于三個部分,法向分布函數DDD,遮擋項GGG,和表示微觀BRDF的菲涅爾項FFF。其中FFF肯定是不會變的,因為各向異性是宏觀的現象,不會影響微觀表面的性質。至于DDD和GGG,由于GGG都是從DDD推導出來的,因此我們先看一下DDD需要作出怎樣的修改。
形狀不變性
法向分布函數DDD的形狀不變性指的是這樣一種特性,改變DDD的粗糙度系數相當于對微表面進行拉伸,而不改變微表面的形狀。
要說明白形狀不變性,我們引入一個新的函數P22(xm~,ym~)P^{22}(x_{\tilde{m}},y_{\tilde{m}})P22(xm~?,ym~?),描述微表面的法向量m{\bf{m}}m的2D斜率分布。其中,m=(xm,ym,zm){\bf{m}}=(x_m,y_m,z_m)m=(xm?,ym?,zm?)并且
(xm~,ym~)=(?xmzm,?ymzm)=?tan?θm(cos??m,sin??m)m=(?xm~,?ym~,1)xm~2+ym~2+1\begin{aligned} (x_{\tilde{m}},y_{\tilde{m}}) & =(-\frac{x_m}{z_m},-\frac{y_m}{z_m}) = -\tan\theta_m(\cos\phi_m, \sin\phi_m)\\ {\bf{m}} & =\frac{(-x_{\tilde{m}},-y_{\tilde{m}},1)}{\sqrt{x_{\tilde{m}}^2+y_{\tilde{m}}^2+1}} \end{aligned} (xm~?,ym~?)m?=(?zm?xm??,?zm?ym??)=?tanθm?(cos?m?,sin?m?)=xm~2?+ym~2?+1?(?xm~?,?ym~?,1)??
m{\bf{m}}m的球坐標系坐標為(1,θ,?)(1,\theta,\phi)(1,θ,?),如下圖所示。
既然是分布函數,P22(xm~,ym~)P^{22}(x_{\tilde{m}},y_{\tilde{m}})P22(xm~?,ym~?)滿足:
∫?∞∞∫?∞∞P22(xm~,ym~)dxm~dym~=1\int^\infty_{-\infty}\int^\infty_{-\infty}P^{22}(x_{\tilde{m}},y_{\tilde{m}})dx_{\tilde{m}}dy_{\tilde{m}}=1 ∫?∞∞?∫?∞∞?P22(xm~?,ym~?)dxm~?dym~?=1
并且P22(xm~,ym~)P^{22}(x_{\tilde{m}},y_{\tilde{m}})P22(xm~?,ym~?)與DDD的關系為:
D(m)=χ+(n,m)cos?4θmP22(xm~,ym~)=χ+(n,m)(n?m)4P22(xm~,ym~)D({\bf{m}})=\frac{\chi^+({\bf{n}},{\bf{m}})}{\cos^4\theta_m}P^{22}(x_{\tilde{m}},y_{\tilde{m}})=\frac{\chi^+({\bf{n}},{\bf{m}})}{({\bf{n}}\cdot{\bf{m}})^4}P^{22}(x_{\tilde{m}},y_{\tilde{m}}) D(m)=cos4θm?χ+(n,m)?P22(xm~?,ym~?)=(n?m)4χ+(n,m)?P22(xm~?,ym~?)
考慮到P22(xm~,ym~)P^{22}(x_{\tilde{m}},y_{\tilde{m}})P22(xm~?,ym~?)同時也是粗糙度α\alphaα的函數,因此可以寫為P22(xm~,ym~,α)P^{22}(x_{\tilde{m}},y_{\tilde{m}},\alpha)P22(xm~?,ym~?,α)。
滿足形狀不變性的法向分布函數,它的P22(xm~,ym~,α)P^{22}(x_{\tilde{m}},y_{\tilde{m}},\alpha)P22(xm~?,ym~?,α)符合這種形式:
P22(xm~,ym~,α)=1α2f(xm~2+ym~2α)=1α2f(tan?θmα)=1α2f(1?(n?m)2α(n?m))D(m)=χ+(n,m)(n?m)4P22(xm~,ym~)=χ+(n,m)α2(n?m)4f(tan?θmα)=χ+(n,m)α2(n?m)4f(1?(n?m)2α(n?m))\begin{aligned} P^{22}(x_{\tilde{m}},y_{\tilde{m}},\alpha) & =\frac{1}{\alpha^2}f\left(\frac{\sqrt{x_{\tilde{m}}^2+y_{\tilde{m}}^2}}{\alpha}\right)=\frac{1}{\alpha^2}f\left(\frac{\tan\theta_m}{\alpha}\right) \\ & = \frac{1}{\alpha^2}f\left(\frac{\sqrt{1-({\bf{n}}\cdot{\bf{m}})^2}}{\alpha({\bf{n}}\cdot{\bf{m}})}\right) \\ D({\bf{m}}) & =\frac{\chi^+({\bf{n}},{\bf{m}})}{({\bf{n}}\cdot{\bf{m}})^4}P^{22}(x_{\tilde{m}},y_{\tilde{m}})=\frac{\chi^+({\bf{n}},{\bf{m}})}{\alpha^2({\bf{n}}\cdot{\bf{m}})^4}f\left(\frac{\tan\theta_m}{\alpha}\right) \\ & = \frac{\chi^+({\bf{n}},{\bf{m}})}{\alpha^2({\bf{n}}\cdot{\bf{m}})^4}f\left(\frac{\sqrt{1-({\bf{n}}\cdot{\bf{m}})^2}}{\alpha({\bf{n}}\cdot{\bf{m}})}\right) \end{aligned} P22(xm~?,ym~?,α)D(m)?=α21?f(αxm~2?+ym~2???)=α21?f(αtanθm??)=α21?f(α(n?m)1?(n?m)2??)=(n?m)4χ+(n,m)?P22(xm~?,ym~?)=α2(n?m)4χ+(n,m)?f(αtanθm??)=α2(n?m)4χ+(n,m)?f(α(n?m)1?(n?m)2??)?
對于任意大于零的實數λ\lambdaλ,有:
P22(xm~,ym~,α)=1λ2P22(xm~λ,ym~λ,αλ)P^{22}(x_{\tilde{m}},y_{\tilde{m}},\alpha)=\frac{1}{\lambda^2}P^{22}(\frac{x_{\tilde{m}}}{\lambda},\frac{y_{\tilde{m}}}{\lambda},\frac{\alpha}{\lambda}) P22(xm~?,ym~?,α)=λ21?P22(λxm~??,λym~??,λα?)
也就是說,改變粗糙度僅相當于對P22(xm~,ym~,α)P^{22}(x_{\tilde{m}},y_{\tilde{m}},\alpha)P22(xm~?,ym~?,α)進行拉伸。
前面提到的三種法向分布函數:Beckmann、BlinnPhong和GGX,只有BlinnPhong不滿足形狀不變性。推廣的GTR公式也同樣不滿足形狀不變性。
各向異性D和G
對于具有形狀不變性性質的法向分布函數DDD,它的形式變為:
D(m)=χ+(n,m)αxαy(n?m)4f((t?m)2αx2+(b?m)2αy2(n?m))D({\bf{m}}) =\frac{\chi^+({\bf{n}},{\bf{m}})}{\alpha_x\alpha_y({\bf{n}}\cdot{\bf{m}})^4}f\left(\frac{\sqrt{\frac{({\bf{t}}\cdot{\bf{m}})^2}{\alpha_x^2}+\frac{({\bf}\cdot{\bf{m}})^2}{\alpha_y^2}}}{({\bf{n}}\cdot{\bf{m}})}\right) D(m)=αx?αy?(n?m)4χ+(n,m)?f???(n?m)αx2?(t?m)2?+αy2?(b?m)2??????
相應的遮擋項GGG,只需要改變Λ(s)\Lambda({\bf{s}})Λ(s)中的變量ccc:
c=n?sαx2(t?s)2+αy2(b?s)2c = \frac{{\bf{n}}\cdot{\bf{s}}}{\sqrt{\alpha_x^2({\bf{t}}\cdot{\bf{s}})^2+\alpha_y^2({\bf}\cdot{\bf{s}})^2}} c=αx2?(t?s)2+αy2?(b?s)2?n?s?
這里的s{\bf{s}}s可以是入射光線l{\bf{l}}l,也可以是出射光線v{\bf{v}}v。
有了一般的推廣形式,我們將其應用到具有形狀不變性的Beckmann和GGX模型上,有:
DBeckmann(h,αx,αy)=χ+(n,h)παxαy(n?h)4exp?(?(t?h)2αx2+(b?h)2αy2(n?h)2)DGGX(h,αx,αy)=χ+(n,h)παxαy((t?h)2αx2+(b?h)2αy2+(n?h)2)2\begin{aligned} D_{Beckmann}({\bf{h}}, \alpha_x, \alpha_y) & = \frac{\chi^+({\bf{n}},{\bf{h}})}{\pi\alpha_x\alpha_y({\bf{n}}\cdot{\bf{h}})^4}\exp\left(-{\frac{\frac{({\bf{t}}\cdot{\bf{h}})^2}{\alpha_x^2}+\frac{({\bf}\cdot{\bf{h}})^2}{\alpha_y^2}}{({\bf{n}}\cdot{\bf{h}})^2}}\right) \\ D_{GGX}({\bf{h}}, \alpha_x, \alpha_y) & = \frac{\chi^+({\bf{n}},{\bf{h}})}{\pi\alpha_x\alpha_y\left(\frac{({\bf{t}}\cdot{\bf{h}})^2}{\alpha_x^2}+\frac{({\bf}\cdot{\bf{h}})^2}{\alpha_y^2}+({\bf{n}}\cdot{\bf{h}})^2\right)^2} \end{aligned} DBeckmann?(h,αx?,αy?)DGGX?(h,αx?,αy?)?=παx?αy?(n?h)4χ+(n,h)?exp????(n?h)2αx2?(t?h)2?+αy2?(b?h)2?????=παx?αy?(αx2?(t?h)2?+αy2?(b?h)2?+(n?h)2)2χ+(n,h)??
Clear Coat
Clear Coat模型是多層材質的一種最簡單的形式。Clear Coat的中文一般翻譯為“清漆”,但是這個中文詞匯跟英文詞匯一樣讓人摸不著頭腦。簡單來說,Clear Coat指的是材質表面的一層薄薄的透明薄膜,比如木制家具表面刷的漆,汽車的噴漆等等。Clear Coat Layer一般是透明的,光線會透過Clear Coat Layer照射到Base Layer,為了模擬Clear Coat材質,一般將這兩層材質按照下圖的方式建模:
Clear Coat Layer會產生Specular反射,剩余的光線照射到Base Layer產生Specular和Diffuse反射。因此,相比于基礎BRDF模型,Clear Coat模型多一個由Clear Coat Layer產生的specular項。
f=Cdiffuse?fd+Cspecular?fs+Cclearcoat?fscf = C_{diffuse} \cdot f_d + C_{specular} \cdot f_s + C_{clearcoat} \cdot f_{sc} f=Cdiffuse??fd?+Cspecular??fs?+Cclearcoat??fsc?
三個系數CxC_xCx?是為了保證能量守恒,不同的引擎會選取不同的計算方法。clear coat layer的specular項fscf_{sc}fsc?的計算公式與fsf_sfs?類似,也是DGF三項乘積的形式。
如果要表示一個Clear Coat模型,需要兩個額外的參數,一個是ClearCoat系數,另一個是ClearCoatRoughness,指明Clear Coat Layer的粗糙度。
Subsurface
Subsurface模型也是一種多層材質,它可以很復雜(如用于繪制皮膚的SSSS模型),也可以很簡單(如Disney在Principled BRDF中的實現)。
Subsurface模型描述的是名為次表面散射(subsurface scattering)的物理現象。次表面散射現象指的是光線進入材質內部,經過多次反射、吸收,最終折射出材質表面的現象。這個物理現象在BRDF模型中我們是用Diffuse分量來描述的,但是無論是Lambert模型還是Burley模型,都無法表現材質對光線的吸收作用,或者說,無法表現出“通透”效果。例如玉或者皮膚在強光照射下呈現的半透現象,或者普通光照下的通透感。下圖[2]展示了采用Subsurface scattering模型的皮膚(右上)和未采用(右下)的對比。
但是完整實現subsurface scattering太復雜了,也沒有必要。因此一般的subsurface模型都是通過添加一層額外的diffuse layer來近似表現次表面散射現象。這一點剛好跟Clear Coat模型相反——Clear Coat模型添加了額外的specular層,而subsurface添加了額外的diffuse層。
f=fd+fs+Csubsurface?fscf = f_d + f_s + C_{subsurface} \cdot f_{sc} f=fd?+fs?+Csubsurface??fsc?
Cloth
布料模型和其他幾個shading model很不一樣,這是因為布料的組成形式是纖維相互堆疊,纖維之間還存在空隙,不符合微表面理論。相應的,Cloth model的公式也跟基于微表面理論shading model不太一樣。模擬Cloth的BRDF模型大致可以分為三類:
- 基于觀察的empirical models
- 基于微表面理論的模型
- 微圓柱體模型(micro-cylinder model)
第一種基于觀察的模型很大程度上靠藝術家調整參數來模擬布料效果,涉及到的參數比較多。第三種微圓柱體模型其實類似于頭發模型——都是用圓柱體對材質進行建模,效果相對精準,但是也更繁瑣。這里主要介紹第二種基于微表面理論的模型,它是通過選取合適的法向分布函數和遮擋函數來模擬布料效果。
常用的布料模型中的法向分布函數是Ashikhmin[3]提出的,用逆高斯分布來擬合法向分布,經過后續的補充,最終的形態為:
DAshikhmin(m)=χ+(n?m)π(1+kampα2)(1+kampexp?((n?m)2α2((n?m)2?1))(1?(n?m)2)2)GCloth(l,v)=14(n?v+n?l?(n?v)(n?l))f(l,v,h)=(1?F(h,l))ρssπ+F(h,l)D(h)G(l,v)\begin{aligned} D_{Ashikhmin}({\bf{m}}) & = \frac{\chi^+({\bf{n}}\cdot{\bf{m}})}{\pi(1+k_{amp}\alpha^2)}\left(1+\frac{k_{amp}\exp\left(\frac{({\bf{n}}\cdot{\bf{m}})^2}{\alpha^2\left(({\bf{n}}\cdot{\bf{m}})^2-1\right)}\right)}{\left(1-({\bf{n}}\cdot{\bf{m}})^2\right)^2}\right) \\ G_{Cloth}({\bf{l}},{\bf{v}}) & =\frac{1}{4({\bf{n}}\cdot{\bf{v}}+{\bf{n}}\cdot{\bf{l}}-({\bf{n}}\cdot{\bf{v}})({\bf{n}}\cdot{\bf{l}}))} \\ f({\bf{l}},{\bf{v}},{\bf{h}}) & = (1-F({\bf{h}},{\bf{l}}))\frac{\rho_{ss}}{\pi} + F({\bf{h}},{\bf{l}})D({\bf{h}})G({\bf{l}},{\bf{v}}) \end{aligned} DAshikhmin?(m)GCloth?(l,v)f(l,v,h)?=π(1+kamp?α2)χ+(n?m)????1+(1?(n?m)2)2kamp?exp(α2((n?m)2?1)(n?m)2?)????=4(n?v+n?l?(n?v)(n?l))1?=(1?F(h,l))πρss??+F(h,l)D(h)G(l,v)?
其中,α\alphaα控制逆高斯函數的寬度,kampk_{amp}kamp?控制幅度。f(l,v,h)f({\bf{l}},{\bf{v}},{\bf{h}})f(l,v,h)已經包含了diffuse和specular兩部分。
float D_Ashikhmin(float roughness, float NoH) {// Ashikhmin 2007, "Distribution-based BRDFs"float a2 = roughness * roughness;float cos2h = NoH * NoH;float sin2h = max(1.0 - cos2h, 0.0078125); // 2^(-14/2), so sin2h^2 > 0 in fp16float sin4h = sin2h * sin2h;float cot2 = -cos2h / (a2 * sin2h);return 1.0 / (PI * (4.0 * a2 + 1.0) * sin4h) * (4.0 * exp(cot2) + sin4h); }另一種布料模型是Estevez和Kulla提出的Charlie模型,Charlie模型采用的是正弦函數的冪來擬合,而不是逆高斯函數。它的實現更簡單、外觀更柔和。
DCharlie=(2+1α)sin?1αθ2πD_{Charlie} = \frac{(2+\frac{1}{\alpha})\sin^{\frac{1}{\alpha}}\theta}{2\pi} DCharlie?=2π(2+α1?)sinα1?θ?
實現:
float D_Charlie(float roughness, float NoH) {// Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF"float invAlpha = 1.0 / roughness;float cos2h = NoH * NoH;float sin2h = max(1.0 - cos2h, 0.0078125); // 2^(-14/2), so sin2h^2 > 0 in fp16return (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI); }總結
以上是生活随笔為你收集整理的着色模型简介和实现(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: suggest的用法
- 下一篇: Portraiture5人像磨皮润色修饰