着色模型简介和实现(上)
摘要
著色模型(shading model)描述的是材質(zhì)表面對(duì)光線的作用,它的輸入是光線、入射角、反射角、材質(zhì)的屬性(例如粗糙度、金屬度等),輸出是材質(zhì)的顏色。前面提到的BRDF模型就是shading model的一種,但是BRDF模型過于簡(jiǎn)單,很多復(fù)雜的物理現(xiàn)象無法描述。本文將接著BRDF繼續(xù)介紹一些更復(fù)雜的shading model,以及UE4和Disney的實(shí)現(xiàn)。
本文主要介紹理論部分,下篇將介紹UE4、Filament以及Disney對(duì)shading model的詳細(xì)實(shí)現(xiàn)。
理論
主要介紹對(duì)各向異性、次表面、清漆和布料幾種物理現(xiàn)象的shading model。
Anisotropy
上圖左:各向同性金屬球;右:各向異性金屬球。圖片來源:Filament文檔。
將各向同性的shading model拓展到各向異性,需要解決兩個(gè)問題,
對(duì)于第一個(gè)問題,既然是“各向”異性,必然要分別定義各個(gè)方向上的差異的屬性,這里的屬性一般是粗糙度。方向一般在切平面上選取兩個(gè)軸,即tangent方向和bitagent方向,他們與normal方向共通構(gòu)成一組正交基底(TBN坐標(biāo)系)。對(duì)于需要精細(xì)控制切平面方向的模型,比如頭發(fā),會(huì)單獨(dú)提供切向貼圖,指明切向方向,類似于法向貼圖。其他情況一般由系統(tǒng)(shader)確定切向方向。所以總結(jié)下來,需要額外增加一個(gè)參數(shù),將原有的粗糙度替換為tangent和bitangent方向的粗糙度(記為αt,αb\alpha_t,\alpha_bαt?,αb?或αx,αy\alpha_x,\alpha_yαx?,αy?)。
實(shí)際操作中,一般是增加一個(gè)anisotropy各向異性參數(shù),然后用粗糙度α\alphaα(α=roughness?roughness\alpha = roughness * roughnessα=roughness?roughness)和anisotropy計(jì)算tangent/bitangent兩個(gè)方向上的粗糙度,具體的映射方法有很多。
- 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)?
對(duì)于第二個(gè)問題,BRDF公式取決于三個(gè)部分,法向分布函數(shù)DDD,遮擋項(xiàng)GGG,和表示微觀BRDF的菲涅爾項(xiàng)FFF。其中FFF肯定是不會(huì)變的,因?yàn)楦飨虍愋允呛暧^的現(xiàn)象,不會(huì)影響微觀表面的性質(zhì)。至于DDD和GGG,由于GGG都是從DDD推導(dǎo)出來的,因此我們先看一下DDD需要作出怎樣的修改。
形狀不變性
法向分布函數(shù)DDD的形狀不變性指的是這樣一種特性,改變DDD的粗糙度系數(shù)相當(dāng)于對(duì)微表面進(jìn)行拉伸,而不改變微表面的形狀。
要說明白形狀不變性,我們引入一個(gè)新的函數(shù)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的球坐標(biāo)系坐標(biāo)為(1,θ,?)(1,\theta,\phi)(1,θ,?),如下圖所示。
既然是分布函數(shù),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的關(guān)系為:
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~?)同時(shí)也是粗糙度α\alphaα的函數(shù),因此可以寫為P22(xm~,ym~,α)P^{22}(x_{\tilde{m}},y_{\tilde{m}},\alpha)P22(xm~?,ym~?,α)。
滿足形狀不變性的法向分布函數(shù),它的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??)?
對(duì)于任意大于零的實(shí)數(shù)λ\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~??,λα?)
也就是說,改變粗糙度僅相當(dāng)于對(duì)P22(xm~,ym~,α)P^{22}(x_{\tilde{m}},y_{\tilde{m}},\alpha)P22(xm~?,ym~?,α)進(jìn)行拉伸。
前面提到的三種法向分布函數(shù):Beckmann、BlinnPhong和GGX,只有BlinnPhong不滿足形狀不變性。推廣的GTR公式也同樣不滿足形狀不變性。
各向異性D和G
對(duì)于具有形狀不變性性質(zhì)的法向分布函數(shù)DDD,它的形式變?yōu)?#xff1a;
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??????
相應(yīng)的遮擋項(xiàng)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。
有了一般的推廣形式,我們將其應(yīng)用到具有形狀不變性的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模型是多層材質(zhì)的一種最簡(jiǎn)單的形式。Clear Coat的中文一般翻譯為“清漆”,但是這個(gè)中文詞匯跟英文詞匯一樣讓人摸不著頭腦。簡(jiǎn)單來說,Clear Coat指的是材質(zhì)表面的一層薄薄的透明薄膜,比如木制家具表面刷的漆,汽車的噴漆等等。Clear Coat Layer一般是透明的,光線會(huì)透過Clear Coat Layer照射到Base Layer,為了模擬Clear Coat材質(zhì),一般將這兩層材質(zhì)按照下圖的方式建模:
Clear Coat Layer會(huì)產(chǎn)生Specular反射,剩余的光線照射到Base Layer產(chǎn)生Specular和Diffuse反射。因此,相比于基礎(chǔ)BRDF模型,Clear Coat模型多一個(gè)由Clear Coat Layer產(chǎn)生的specular項(xiàng)。
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?
三個(gè)系數(shù)CxC_xCx?是為了保證能量守恒,不同的引擎會(huì)選取不同的計(jì)算方法。clear coat layer的specular項(xiàng)fscf_{sc}fsc?的計(jì)算公式與fsf_sfs?類似,也是DGF三項(xiàng)乘積的形式。
如果要表示一個(gè)Clear Coat模型,需要兩個(gè)額外的參數(shù),一個(gè)是ClearCoat系數(shù),另一個(gè)是ClearCoatRoughness,指明Clear Coat Layer的粗糙度。
Subsurface
Subsurface模型也是一種多層材質(zhì),它可以很復(fù)雜(如用于繪制皮膚的SSSS模型),也可以很簡(jiǎn)單(如Disney在Principled BRDF中的實(shí)現(xiàn))。
Subsurface模型描述的是名為次表面散射(subsurface scattering)的物理現(xiàn)象。次表面散射現(xiàn)象指的是光線進(jìn)入材質(zhì)內(nèi)部,經(jīng)過多次反射、吸收,最終折射出材質(zhì)表面的現(xiàn)象。這個(gè)物理現(xiàn)象在BRDF模型中我們是用Diffuse分量來描述的,但是無論是Lambert模型還是Burley模型,都無法表現(xiàn)材質(zhì)對(duì)光線的吸收作用,或者說,無法表現(xiàn)出“通透”效果。例如玉或者皮膚在強(qiáng)光照射下呈現(xiàn)的半透現(xiàn)象,或者普通光照下的通透感。下圖[2]展示了采用Subsurface scattering模型的皮膚(右上)和未采用(右下)的對(duì)比。
但是完整實(shí)現(xiàn)subsurface scattering太復(fù)雜了,也沒有必要。因此一般的subsurface模型都是通過添加一層額外的diffuse layer來近似表現(xiàn)次表面散射現(xiàn)象。這一點(diǎn)剛好跟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
布料模型和其他幾個(gè)shading model很不一樣,這是因?yàn)椴剂系慕M成形式是纖維相互堆疊,纖維之間還存在空隙,不符合微表面理論。相應(yīng)的,Cloth model的公式也跟基于微表面理論shading model不太一樣。模擬Cloth的BRDF模型大致可以分為三類:
- 基于觀察的empirical models
- 基于微表面理論的模型
- 微圓柱體模型(micro-cylinder model)
第一種基于觀察的模型很大程度上靠藝術(shù)家調(diào)整參數(shù)來模擬布料效果,涉及到的參數(shù)比較多。第三種微圓柱體模型其實(shí)類似于頭發(fā)模型——都是用圓柱體對(duì)材質(zhì)進(jìn)行建模,效果相對(duì)精準(zhǔn),但是也更繁瑣。這里主要介紹第二種基于微表面理論的模型,它是通過選取合適的法向分布函數(shù)和遮擋函數(shù)來模擬布料效果。
常用的布料模型中的法向分布函數(shù)是Ashikhmin[3]提出的,用逆高斯分布來擬合法向分布,經(jīng)過后續(xù)的補(bǔ)充,最終的形態(tài)為:
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α控制逆高斯函數(shù)的寬度,kampk_{amp}kamp?控制幅度。f(l,v,h)f({\bf{l}},{\bf{v}},{\bf{h}})f(l,v,h)已經(jīng)包含了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模型采用的是正弦函數(shù)的冪來擬合,而不是逆高斯函數(shù)。它的實(shí)現(xiàn)更簡(jiǎn)單、外觀更柔和。
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?θ?
實(shí)現(xiàn):
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); }總結(jié)
以上是生活随笔為你收集整理的着色模型简介和实现(上)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: suggest的用法
- 下一篇: Portraiture5人像磨皮润色修饰