着色模型简介和实现(上)

本文探讨了着色模型的理论,包括BRDF的扩展,如各向异性模型,其中介绍了如何通过调整粗糙度来模拟不同方向的差异。此外,还讨论了次表面散射(Subsurface Scattering)和清漆(Clear Coat)模型,以及布料(Cloth)模型的实现,这些模型用于模拟不同类型的物理现象,如透明度、内部反射和纤维结构。文章还提供了具体的数学公式和实现方法,适用于UE4和Disney的着色模型。
摘要由CSDN通过智能技术生成

摘要

着色模型(shading model)描述的是材质表面对光线的作用,它的输入是光线、入射角、反射角、材质的属性(例如粗糙度、金属度等),输出是材质的颜色。前面提到的BRDF模型就是shading model的一种,但是BRDF模型过于简单,很多复杂的物理现象无法描述。本文将接着BRDF继续介绍一些更复杂的shading model,以及UE4和Disney的实现。

本文主要介绍理论部分,下篇将介绍UE4、Filament以及Disney对shading model的详细实现。

理论

主要介绍对各向异性、次表面、清漆和布料几种物理现象的shading model。

Anisotropy

material_anisotropic

上图左:各向同性金属球;右:各向异性金属球。图片来源:Filament文档。

将各向同性的shading model拓展到各向异性,需要解决两个问题,

  1. 需要引入哪些新的参数来描述各向异性?
  2. 需要在原有BRDF模型的基础上修改公式的哪些部分来描述各向异性?

对于第一个问题,既然是“各向”异性,必然要分别定义各个方向上的差异的属性,这里的属性一般是粗糙度。方向一般在切平面上选取两个轴,即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 α α = r o u g h n e s s ∗ r o u g h n e s s \alpha = roughness * roughness α=roughnessroughness)和anisotropy计算tangent/bitangent两个方向上的粗糙度,具体的映射方法有很多。

  • Neubelt and Pettine

α x = α α y = l e r p ( 0 , α , 1 − a n i s o t r o p y ) \begin{aligned} \alpha_x & = \alpha \\ \alpha_y & = lerp(0, \alpha, 1-anisotropy) \end{aligned} αxαy=α=lerp(0,α,1anisotropy)

  • Burley

α x = α 1 − 0.9 × a n i s o t r o p y α y = α 1 − 0.9 × a n i s o t r o p y \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=10.9×anisotropy α=α10.9×anisotropy

  • Kulla

α x = α × ( 1 + a n i s o t r o p y ) α y = α × ( 1 − a n i s o t r o p y ) \begin{aligned} \alpha_x & = \alpha \times (1+anisotropy) \\ \alpha_y & = \alpha \times (1-anisotropy) \end{aligned} αxαy=α×(1+anisotropy)=α×(1anisotropy)

对于第二个问题,BRDF公式取决于三个部分,法向分布函数 D D D,遮挡项 G G G,和表示微观BRDF的菲涅尔项 F F F。其中 F F F肯定是不会变的,因为各向异性是宏观的现象,不会影响微观表面的性质。至于 D D D G G G,由于 G G G都是从 D D D推导出来的,因此我们先看一下 D D D需要作出怎样的修改。

形状不变性

法向分布函数 D D D的形状不变性指的是这样一种特性,改变 D D D的粗糙度系数相当于对微表面进行拉伸,而不改变微表面的形状。

要说明白形状不变性,我们引入一个新的函数 P 22 ( x m ~ , y m ~ ) P^{22}(x_{\tilde{m}},y_{\tilde{m}}) P22(xm~,ym~),描述微表面的法向量 m {\bf{m}} m的2D斜率分布。其中, m = ( x m , y m , z m ) {\bf{m}}=(x_m,y_m,z_m) m=(xm,ym,zm)并且

( x m ~ , y m ~ ) = ( − x m z m , − y m z m ) = − tan ⁡ θ m ( cos ⁡ ϕ m , sin ⁡ ϕ m ) m = ( − x m ~ , − y m ~ , 1 ) x m ~ 2 + y m ~ 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=(zmxm,zmym)=tanθm(cosϕm,sinϕm)=xm~2+ym~2+1 (xm~,ym~,1)

m {\bf{m}} m的球坐标系坐标为 ( 1 , θ , ϕ ) (1,\theta,\phi) (1,θ,ϕ),如下图所示。

3D_Spherical

既然是分布函数, P 22 ( x m ~ , y m ~ ) P^{22}(x_{\tilde{m}},y_{\tilde{m}}) P22(xm~,ym~)满足:

∫ − ∞ ∞ ∫ − ∞ ∞ P 22 ( x m ~ , y m ~ ) d x m ~ d y m ~ = 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

并且 P 22 ( x m ~ , y m ~ ) P^{22}(x_{\tilde{m}},y_{\tilde{m}}) P22(xm~,ym~) D D D的关系为:

D ( m ) = χ + ( n , m ) cos ⁡ 4 θ m P 22 ( x m ~ , y m ~ ) = χ + ( n , m ) ( n ⋅ m ) 4 P 22 ( x m ~ , y m ~ ) 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~)=(nm)4χ+(n,m)P22(xm~,ym~)

考虑到 P 22 ( x m ~ , y m ~ ) P^{22}(x_{\tilde{m}},y_{\tilde{m}}) P22(xm~,ym~)同时也是粗糙度 α \alpha α的函数,因此可以写为 P 22 ( x m ~ , y m ~ , α ) P^{22}(x_{\tilde{m}},y_{\tilde{m}},\alpha) P22(xm~,ym~,α)

满足形状不变性的法向分布函数,它的 P 22 ( x m ~ , y m ~ , α ) P^{22}(x_{\tilde{m}},y_{\tilde{m}},\alpha) P22(xm~,ym~,α)符合这种形式:

P 22 ( x m ~ , y m ~ , α ) = 1 α 2 f ( x m ~ 2 + y m ~ 2 α ) = 1 α 2 f ( tan ⁡ θ m α ) = 1 α 2 f ( 1 − ( n ⋅ m ) 2 α ( n ⋅ m ) ) D ( m ) = χ + ( n , m ) ( n ⋅ m ) 4 P 22 ( x m ~ , y m ~ ) = χ + ( n , m ) α 2 ( n ⋅ m ) 4 f ( tan ⁡ θ m α ) = χ + ( n , m ) α 2 ( n ⋅ m ) 4 f ( 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)=α21f(αxm~2+ym~2 )=α21f(αtanθm)=α21f(α(nm)1(nm)2 )=(nm)4χ+(n,m)P22(xm~,ym~)=α2(nm)4χ+(n,m)f(αtanθm)=α2(nm)4χ+(n,m)f(α(nm)1(nm)2 )

对于任意大于零的实数 λ \lambda λ,有:

P 22 ( x m ~ , y m ~ , α ) = 1 λ 2 P 22 ( x m ~ λ , y m ~ λ , α λ ) 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~,α)=λ21P22(λxm~,λym~,λα)

也就是说,改变粗糙度仅相当于对 P 22 ( x m ~ , y m ~ , α ) P^{22}(x_{\tilde{m}},y_{\tilde{m}},\alpha) P22(xm~,ym~,α)进行拉伸。

前面提到的三种法向分布函数:Beckmann、BlinnPhong和GGX,只有BlinnPhong不满足形状不变性。推广的GTR公式也同样不满足形状不变性。

各向异性D和G

对于具有形状不变性性质的法向分布函数 D D D,它的形式变为:

D ( m ) = χ + ( n , m ) α x α y ( n ⋅ m ) 4 f ( ( t ⋅ m ) 2 α x 2 + ( b ⋅ m ) 2 α y 2 ( 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{b}}\cdot{\bf{m}})^2}{\alpha_y^2}}}{({\bf{n}}\cdot{\bf{m}})}\right) D(m)=αxαy(nm)4χ+(n,m)f(nm)αx2(tm)2+αy2(bm)2

相应的遮挡项 G G G,只需要改变 Λ ( s ) \Lambda({\bf{s}}) Λ(s)中的变量 c c c

c = n ⋅ s α x 2 ( t ⋅ s ) 2 + α y 2 ( b ⋅ s ) 2 c = \frac{{\bf{n}}\cdot{\bf{s}}}{\sqrt{\alpha_x^2({\bf{t}}\cdot{\bf{s}})^2+\alpha_y^2({\bf{b}}\cdot{\bf{s}})^2}} c=αx2(ts)2+αy2(bs)2 ns

这里的 s {\bf{s}} s可以是入射光线 l {\bf{l}} l,也可以是出射光线 v {\bf{v}} v

有了一般的推广形式,我们将其应用到具有形状不变性的Beckmann和GGX模型上,有:

D B e c k m a n n ( h , α x , α y ) = χ + ( n , h ) π α x α y ( n ⋅ h ) 4 exp ⁡ ( − ( t ⋅ h ) 2 α x 2 + ( b ⋅ h ) 2 α y 2 ( n ⋅ h ) 2 ) D G G X ( h , α x , α y ) = χ + ( n , h ) π α x α y ( ( t ⋅ h ) 2 α x 2 + ( b ⋅ h ) 2 α y 2 + ( 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{b}}\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{b}}\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(nh)4χ+(n,h)exp(nh)2αx2(th)2+αy2(bh)2=παxαy(αx2(th)2+αy2(bh)2+(nh)2)2χ+(n,h)

Clear Coat

Clear Coat模型是多层材质的一种最简单的形式。Clear Coat的中文一般翻译为“清漆”,但是这个中文词汇跟英文词汇一样让人摸不着头脑。简单来说,Clear Coat指的是材质表面的一层薄薄的透明薄膜,比如木制家具表面刷的漆,汽车的喷漆等等。Clear Coat Layer一般是透明的,光线会透过Clear Coat Layer照射到Base Layer,为了模拟Clear Coat材质,一般将这两层材质按照下图的方式建模:

diagram_clear_coat

Clear Coat Layer会产生Specular反射,剩余的光线照射到Base Layer产生Specular和Diffuse反射。因此,相比于基础BRDF模型,Clear Coat模型多一个由Clear Coat Layer产生的specular项。

f = C d i f f u s e ⋅ f d + C s p e c u l a r ⋅ f s + C c l e a r c o a t ⋅ f s c f = C_{diffuse} \cdot f_d + C_{specular} \cdot f_s + C_{clearcoat} \cdot f_{sc} f=Cdiffusefd+Cspecularfs+Cclearcoatfsc

三个系数 C x C_x Cx是为了保证能量守恒,不同的引擎会选取不同的计算方法。clear coat layer的specular项 f s c f_{sc} fsc的计算公式与 f s f_s fs类似,也是DGF三项乘积的形式。

如果要表示一个Clear Coat模型,需要两个额外的参数,一个是ClearCoat系数,另一个是ClearCoatRoughness,指明Clear Coat Layer的粗糙度。

Subsurface

Subsurface模型也是一种多层材质,它可以很复杂(如用于绘制皮肤的SSSS模型),也可以很简单(如Disney在Principled BRDF中的实现)。

Subsurface模型描述的是名为次表面散射(subsurface scattering)的物理现象。次表面散射现象指的是光线进入材质内部,经过多次反射、吸收,最终折射出材质表面的现象。这个物理现象在BRDF模型中我们是用Diffuse分量来描述的,但是无论是Lambert模型还是Burley模型,都无法表现材质对光线的吸收作用,或者说,无法表现出“通透”效果。例如玉或者皮肤在强光照射下呈现的半透现象,或者普通光照下的通透感。下图[2]展示了采用Subsurface scattering模型的皮肤(右上)和未采用(右下)的对比。

SSS

但是完整实现subsurface scattering太复杂了,也没有必要。因此一般的subsurface模型都是通过添加一层额外的diffuse layer来近似表现次表面散射现象。这一点刚好跟Clear Coat模型相反——Clear Coat模型添加了额外的specular层,而subsurface添加了额外的diffuse层。

f = f d + f s + C s u b s u r f a c e ⋅ f s c f = f_d + f_s + C_{subsurface} \cdot f_{sc} f=fd+fs+Csubsurfacefsc

Cloth

布料模型和其他几个shading model很不一样,这是因为布料的组成形式是纤维相互堆叠,纤维之间还存在空隙,不符合微表面理论。相应的,Cloth model的公式也跟基于微表面理论shading model不太一样。模拟Cloth的BRDF模型大致可以分为三类:

  • 基于观察的empirical models
  • 基于微表面理论的模型
  • 微圆柱体模型(micro-cylinder model)

第一种基于观察的模型很大程度上靠艺术家调整参数来模拟布料效果,涉及到的参数比较多。第三种微圆柱体模型其实类似于头发模型——都是用圆柱体对材质进行建模,效果相对精准,但是也更繁琐。这里主要介绍第二种基于微表面理论的模型,它是通过选取合适的法向分布函数和遮挡函数来模拟布料效果。

常用的布料模型中的法向分布函数是Ashikhmin[3]提出的,用逆高斯分布来拟合法向分布,经过后续的补充,最终的形态为:

D A s h i k h m i n ( m ) = χ + ( n ⋅ m ) π ( 1 + k a m p α 2 ) ( 1 + k a m p exp ⁡ ( ( n ⋅ m ) 2 α 2 ( ( n ⋅ m ) 2 − 1 ) ) ( 1 − ( n ⋅ m ) 2 ) 2 ) G C l o t h ( l , v ) = 1 4 ( n ⋅ v + n ⋅ l − ( n ⋅ v ) ( n ⋅ l ) ) f ( l , v , h ) = ( 1 − F ( h , l ) ) ρ s s π + 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)χ+(nm)1+(1(nm)2)2kampexp(α2((nm)21)(nm)2)=4(nv+nl(nv)(nl))1=(1F(h,l))πρss+F(h,l)D(h)G(l,v)

其中, α \alpha α控制逆高斯函数的宽度, k a m p k_{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 fp16
	float 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模型采用的是正弦函数的幂来拟合,而不是逆高斯函数。它的实现更简单、外观更柔和。

D C h a r l i e = ( 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 fp16
    return (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值