实时渲染基础(6)基于物理的渲染(Physically Based Rendering)

辐射度量学(Radiometry)

为了渲染出物理上正确的图像,那么我们就需要从能量的角度上去理解光的传播、光在空间中的分布,为此需要一些物理计量单位,而这些也就刚好是辐射度量学的范畴。

立体角(Solid Angle)

角度(Angle):从二维上看,用圆上所对应的弧长与半径之比来定义一个角度,而且这个角度是与圆半径大小无关的(因为使用了弧长和半径之比)。

  • \(\theta = \frac{l}{r}\)
  • 任何圆都有 \(2\pi\) 弧度

立体角(Solid Angle): 推广至三维,类似地,用球面上的面积A与所对应的半径平方之比来定义一个立体角,而且这个立体角同样是与球体半径大小无关的(因为使用了球面上的面积A与所对应的半径平方之比)。

  • \(\omega = \frac{A}{r^2}\)
  • 任何球体都有 \(4\pi\) steradians

考虑下图所示空间中的点光源,以球心为顶点的无限长锥体内,任何截面(与任意半径的球体相截)接收到的光子能量应该是一样的。换句话说,近处较小面积的表面和远处较大面积的表面所接收到的 Power 应该相同。立体角(Solid Angle)正可以表示这样一个比例关系(球面面积A与半径平方之比)。

另外,角度 \(\theta\) 可以代表一个 2D 有向单位向量(2D 方向),而立体角 \(\omega\) 也可以被用来代表一个 3D 有向单位向量(3D 方向)。

Radiant Energy & Radiant Flux(Power)

Radiant Energy:能量

\[Q \]

单位 \([J=Joule]\)

Radiant Flux / Power:单位时间的能量(功率)

\[\Phi=\frac{dQ}{dt} \]

单位 \(\\ [W=Watt], [lm=lumen]^*\)

物体表面总是时时刻刻接受光子能量,又时时刻刻散发光子能量,因此图形学中常将 Radiant Flux / Power用来衡量光照强度,而几乎不用 Radiant Energy。

Radiant Intensity

Radiant Intensity:每单位立体角的 Power,常用于衡量光源朝某个立体角方向辐射出去的 Power。

\[I(\omega) \equiv \frac{\mathrm{d} \Phi}{\mathrm{d} \omega} \]

单位 \(\left[\frac{\mathrm{W}}{\mathrm{sr}}\right], \left[\frac{\mathrm{lm}}{\mathrm{sr}}=\mathrm{cd}=\mathrm{candela}\right]\)

Irradiance

Irradiance:每单位面积的 Power,常用于衡量表面上每单位面积接受各个立体角方向入射的 Power 总和

\[E(\mathbf{x}) \equiv \frac{\mathrm{d} \Phi(\mathbf{x})}{\mathrm{d} A} \]

单位 \(\left[\frac{\mathrm{W}}{\mathrm{m}^{2}}\right],\left[\frac{\mathrm{lm}}{\mathrm{m}^{2}}=\operatorname{lux}\right]\)

Radiance

Radiance:每单位立体角,每单位投影面积的 Power,常用于衡量表面上每单位面积朝某个立体角方向反射的 Power。

\[L(\mathrm{x}, \omega) \equiv \frac{\mathrm{d}^{2} \Phi(\mathrm{x}, \omega)}{\mathrm{d} \omega \mathrm{d} A \cos \theta} \]

单位 \(\left[\frac{\mathrm{W}}{\mathrm{sr} \mathrm{m}^{2}}\right],\left[\frac{\mathrm{cd}}{\mathrm{m}^{2}}=\frac{\operatorname{lm}}{\mathrm{sr} \mathrm{m}^{2}}=\mathrm{nit}\right]\)

渲染方程(The Rendering Equation)

有了上述的概念,那么我们就可以用公式这样描述对某个完全不透明 shading point 的渲染:一个点 \(x\)​ 接受各个方向(\(\omega_i\in \Omega^+\)​)的入射光 \(L_i\)​ 后,则往某个指定方向 \(\omega_r\)​ 反射的光为 \(L_r\)​,并有:

\[L_{r}\left(x, \omega_{r}\right)=\int_{\Omega^{+}} L_{i}\left(x, \omega_{i}\right) f_{r}\left(x, \omega_{i}, \omega_{r}\right)\left(n \cdot \omega_{i}\right) \mathrm{d} \omega_{i} \]

倘若点 \(x\) 还包含有自发光(Emissive) \(L_e\),那么完整的渲染方程应该如下:

\[L_{r}\left(x, \omega_{r}\right)=L_{e}\left(x, \omega_{r}\right)+\int_{\Omega^{+}} L_{i}\left(x, \omega_{i}\right) f_{r}\left(x, \omega_{i}, \omega_{r} \right)\left(n \cdot \omega_{i}\right) \mathrm{d} \omega_{i} \]

  • \(f_{r}\left(x, \omega_{i}, \omega_{r}\right)\)​​ 表示为某个光入射点表面后孤立的反射情况,也就是马上要讲的 BRDF,因为光传播到不同物体表面上的反射情况是各不相同的,例如对于glossy的物体(光滑的镜子)和diffuse的物体(粗糙的木头),前者往往更容易形成镜面反射的光,而后者则是更容易形成漫反射的光。

这里的渲染方程主要是面向不透明物体,一般用 BRDF 足以表示该反射情况;对于别的特殊材质,例如半透明/透明物体,一般会使用 BSDF;对于次表面散射物体,就会用 BSSRDF ... 这些双向分布函数可以统一称为 BxDF。

  • 积分域 \(\Omega^+\) 的意思是上半球的范围,这是因为 shading point 不可能被从背面的下半球面传来的光线打到。

实际上,如果物体是半透明的,还是可能被背面下半球面传来的光线打到,在包含 BSDF 的渲染方程中会包含整个球 \(\Omega\) 范围。

  • \((n\cdot\omega_i)\) 这个点积则意味着入射方向与表面法线夹角越小,那么这个表面能够接受的 Power 就越多:

双向反射分布函数(BRDF)

Bidirectional Reflectance Distribution Function (BRDF) 表示的便在某个点 \(x\)​ 上,对于来自某个方向 \(w_i\)​ 的光照,可以朝某个方向 \(w_r\)​ 反射光的多少:

\[f_{r}\left(\omega_{i} \rightarrow \omega_{r}\right)=\frac{\mathrm{d} L_{r}\left(\omega_{r}\right)}{\mathrm{d} E_{i}\left(\omega_{i}\right)}=\frac{\mathrm{d} L_{r}\left(\omega_{r}\right)}{L_{i}\left(\omega_{i}\right) \cos \theta_{i} \mathrm{~d} \omega_{i}} \]

单位:\(\quad\left[\frac{1}{\mathrm{sr}}\right]\)

Lambert Diffuse BRDF

假如一个平面非常粗糙,乃至于光打到该平面后会往完全随机的方向反射,也就是说其往各个方向反射的能量都是一样的、均匀的,这就是漫反射(diffuse)现象。

Lambert BRDF 公式为:

\[f_{lambert} = \frac{\mathrm{basecolor}}{\pi} \]

其中,\(\mathrm{basecolor}\) 为基础颜色(Base Color),也叫反照率(Albedo);相同的光打到不同物体上,正是因为不同物体具有不同的反照率,所以反射回来的能量才不同,呈现在人眼中就是看到不同的物体颜色。

分母为什么是 \(\pi\) :渲染方程的后半部单独积分就是 \(\int_{\Omega^{+}}(n \cdot \omega_{i})\mathrm{d}\omega_i = \int_{\Omega^{+}} \cos \theta_{i} d \omega_{i}= \int^{2\pi}_0 \int^{\frac{\pi}{2}}_0 \cos \theta_{i} \sin \theta_{i} d \theta_{i} d\phi =\int_{0}^{2 \pi} \int_{0}^{1} \mu_{i} d \mu_{i} d \phi=\pi\) ,而漫反射是往着色点的正面半球各个立体角方向均匀反射,对某个出射方向理应反射出 \(k_d\cdot c\) 的光,因此需要除多一个 \(\pi\) 来让方程配平,从而满足能量守恒。

总体来说,diffuse BRDF 虽然计算简单,但只能适用于完全粗糙的材质,因为没有高光。

Microfacet Cook-Torrance BRDF

而通过前人对现实中物体表面材质的研究,总结了以下一个基于微平面原理的 Cook-Torrance BRDF 公式:

\[f_{r}\left(x, \omega_{i}, \omega_{r}\right)= k_{d} f_{lambert} + k_s\frac{F(h,\omega_{r})\cdot G(n,\omega_{i},\omega_{r})\cdot D(n,h)}{4\left(w_{r} \cdot n\right)\left(w_{i} \cdot n\right)} \]

其中,\(h\) 是指半程向量 \(h= \frac{\omega_{i}+\omega_{r}}{||\omega_{i}+\omega_{r}||}\)\(k_d\) 为漫反射系数,\(k_s\) 为镜面反射系数(\(k_d+k_s=1\)),由此控制物体有多少 diffuse 和 specular 的成分。

这套公式为绝大多数物体表面的渲染提供了统一的计算方法,换句话说,一个BRDF 代表着一种物体表面的材质。需要渲染不同物体表面的材质时,只需要简单的修改函数里面的系数就可以得到对应的BRDF。

不过仍然还存在一些物体的渲染(例如毛发、皮肤等)仍需要更加复杂的 BxDF。

下面讲解释这个公式的每个成分及对应的物理现象。

值得说明的是,里面的 \(F\)\(G\)\(D\) 都可以选择不同的近似公式,一些是当年论文所使用的公式,一些是工业界常用的公式。

漫反射项(Diffuse Term)

直接用了 Lambert 漫反射模型。

菲涅尔项(Fresnel Term)

菲涅尔现象,简单的讲就是视线夹角与能量反射的关系:当视线垂直于反射表面时,能量反射较弱;而当视线与反射表面夹角越小,反射越明显。水体是菲涅尔效应最明显的现实物体之一(当站在湖边看到脚下的湖水是透明的,而远处湖面的水则是不透明的,并且反射非常强烈)。

此外,菲涅尔项,即视线夹角与能量反射的关系还受不同介质的折射率所影响(前者图为各类极化的绝缘体的菲涅尔函数,后者图为各类极化的导体的菲涅尔函数):

  • 标准的菲涅尔项

\[F_{\mathrm{s}}=\left|\frac{n_{1} \cos \theta_{i}-n_{2} \cos \theta_{\mathrm{t}}}{n_{1} \cos \theta_{\mathrm{i}}+n_{2} \cos \theta_{\mathrm{t}}}\right|^{2}=\left|\frac{n_{1} \cos \theta_{\mathrm{i}}-n_{2} \sqrt{1-\left(\frac{n_{1}}{n_{2}} \sin \theta_{\mathrm{i}}\right)^{2}}}{n_{1} \cos \theta_{\mathrm{i}}+n_{2} \sqrt{1-\left(\frac{n_{1}}{n_{2}} \sin \theta_{\mathrm{i}}\right)^{2}}}\right|^{2} \]

\[F_{\mathrm{p}}=\left|\frac{n_{1} \cos \theta_{\mathrm{t}}-n_{2} \cos \theta_{\mathrm{i}}}{n_{1} \cos \theta_{\mathrm{t}}+n_{2} \cos \theta_{\mathrm{i}}}\right|^{2}=\left|\frac{n_{1} \sqrt{1-\left(\frac{n_{1}}{n_{2}} \sin \theta_{\mathrm{i}}\right)^{2}}-n_{2} \cos \theta_{\mathrm{i}}}{n_{1} \sqrt{1-\left(\frac{n_{1}}{n_{2}} \sin \theta_{\mathrm{i}}\right)^{2}}+n_{2} \cos \theta_{\mathrm{i}}}\right|^{2} \]

\[F=\frac{1}{2}\left(F_{\mathrm{s}}+F_{\mathrm{p}}\right) \]

精准的菲尼尔项计算量比较大(考虑了S极化、P极化的综合效果),而且还要考虑介质的折射角,因此不常用。

  • Schlick's approximation

\[F_{0}=\left(\frac{n_{1}-n_{2}}{n_{1}+n_{2}}\right)^{2} \]

\[F=F_0 +(1-F_0)(1-(h \cdot \omega_{r}))^{5} \]

其中,\(n1\)​​、\(n2\)​​ 分别为两种介质的折射率。一般假设 \(n1=1\) 近似于空气折射率,而 \(n2\)​​ 取决于被渲染的物体介质。

业界一般都采用 Schlick 的 Fresnel 近似,因为计算成本低廉,而且精度也足够了。

法线分布项(Normal Distribution Term)

微平面模型中一个重要特性就是微平面法线的统计分布。法线分布项 D(h) 描述了平面法线分布的概率,即具有正确朝向(能够将来自 \(\omega_{i}\) 方向的光反射往视点方向 \(\omega_{o}\) )的微表面法线浓度。

简单来说,当微平面的法线分布比较集中(各法线朝向大致相同)时,那么物体表面材质会更容易表现出高光;当微平面的法线分布比较散开(各法线朝向差异比较大)时,那么物体表面材质将表现的非常 diffuse。

法线分布函数相当于从微平面的角度去解释高光(Specular)部分。

  • Normalized Blinn-Phong

传统的 Blinn-Phong 模型通过 \(Specular = k_smax(0,n\cdot h)^p\) 确定Specular部分的运算,但是在辐射度量学的角度中渲染方程是一个余弦加权的半球积分,因此需要将其归一化:

\[D(n,h)=\frac{p+2}{2 \pi}(n \cdot h)^{p} \]

其中,\(p \in [0,\infin)\)​​​ 表示为表面的光滑程度,低值表示粗糙表面,高值表示光滑表面。

  • Beckmann NDF

Beckmann NDF 是第一批微平面模型中使用的法线分布,也是 Cook-Torrance BRDF 在最初提出时选择的NDF。

\[D(n,h)=\frac{1}{\pi \alpha^{2}({n} \cdot {h})^{4}} \cdot \exp {\left(\frac{({n} \cdot {h})^{2}-1}{a^{2}({n} \cdot {h})^{2}}\right)} \]

其中,\(\alpha \in[0,1]\)​ 表示为表面的粗糙程度。

Beckmann分布于Phong分布实际是同族分布,两种法线分布可以通过参数的关系式子\(p=2\alpha^{-2}-2\)​​进行等效。只是Blinn-Phong的参数范围不便表示(主要指较大的值时),Beckamann 通过参数映射将其范围固定在更标准的范围[0,1]。

  • GGX/Trowbridge-Reitz NDF

\[D(n,h) =\frac{\alpha^{2}}{\pi\left((n \cdot h)^{2}\left(\alpha^{2}-1\right)+1\right)^{2}} \]

其中,\(\alpha \in [0,1]\)​ 表示为表面的粗糙程度。

GGX / Trowbridge-Reitz NDF 与 Beckmann NDF 的主要区别在于前者函数具有更长的尾巴,这样就可以让高光部分过渡部分更加缓和,从而更加自然。

  • Generalized-Trowbridge-Reitz(GTR)

\[D(h)=\frac{c}{\left((n\cdot h)^{2}\left(\alpha^{2}-1\right)+1\right)^{\gamma}} \]

其中, \({\gamma}\)​​ 参数用于控制尾部形状。 当 \({\gamma}= 2\)​​ 时,GTR等同于GGX。 随着 \({\gamma}\)​​ 的值减小,分布的尾部变得更长。而随着 \({\gamma}\)​​ 值的增加,分布的尾部变得更短。

不同的 \(\gamma\) 会导致 \(\int_{\Omega^{+}}D(h)(n \cdot \omega_{i})\mathrm{d}\omega_i \ne 1\) ,因此 \(c\) 是随着 \(\gamma\) 变化的,是专门用于归一化的常数。

几何函数 (Geometry Function)

几何函数体现了光在物体微平面上反射时的损耗,一般指两种损耗:阴影(Shadowing)和遮蔽(Obstruction)。

阴影(Shadowing)表示微平面对入射光的遮挡,即光源无法完全覆盖微平面;而遮蔽(Obstruction)表示微平面对出射光的遮挡,即微平面反射出的光不能完全到达摄像机观察点。

因此对这两种现象,定义这样的几何函数 \(G_1\)​​ 为单个方向上的可见比例(值域为[0,1]),可以称为遮蔽函数(masking function)或阴影函数(shadowing function)。

由于光路的可逆性,我们可以认为对于几何遮蔽效果的入射光方向和出射光方向是近似等效的,因此 Shadowing 和 Obstruction 都使用了相同的几何函数 \(G_1\)​​。

那么几何函数的综合效果应当是类似这样的形式:

\[G(n, \omega_{i}, \omega_{r}) \approx G_{1}(n, \omega_{i}) G_{1}(n, \omega_{r}) \]

引入几何函数一个很重要的原因:由于菲涅尔项(Fresnel Term)的加入,会导致表面法线垂直于视线(即 Grazing angle)的物体边缘反射近乎100%的能量,而表面法线与视线平行的物体正面则会反射较少的能量,这样就会导致物体容易出现一圈白线描边。而微平面模型的几何函数在 Grazing angle 下可以极大限制反射的能量。

  • Schlick-GGX

\[G_{1}(n, v)=\frac{n \cdot v}{(n \cdot v)(1-k)+k} \]

\[k= \begin{cases} \frac{(\alpha+1)^2}{8} & , when\ DirectLighting \\ \frac{\alpha ^2}{2} & ,when\ IBL\end{cases} \]

\[G(n, \omega_{i}, \omega_{r}) = G_1(n, \omega_{i})G_1(n,\omega_{r}) \]

能量补偿项(Energy Compensation Term)

几何函数表示了光在物体微平面上反射时的损耗,但实际上这些光线并不是损耗了,而是变成了微平面之间的互反射或多次表面反射的光线,但是Microfacet理论忽略了这些反射,这样做的缺点是会造成越 diffuse 的物体能量损失越多,从而使粗糙物体渲染偏暗。

GGX + height-correlated masking & shadowing 的组合下,粗糙度参数(rough)为 1 时的能量损耗接近 60%;实现多重散射微平面BRDF(Multiple-scattering microfacet BRDF)可以保证能量守恒(能量几乎没有损失),但是开销较大,不适用于实时渲染。

能量损失:

能量守恒(GGX 单散射 + The Kulla-Conty Approxiamation):

  • The Kulla-Conty Approximation

是一种开销较小、适用于实时渲染的近似公式,它的主要思想是在 Microfacet Cool-Torrance BRDF 的基础上再创建一个额外的 BRDF Lobe,作为能量补偿项(Energy Compensation Term)。

首先,我们需要算出菲涅尔项系数 \(F_0\)​​​ 设置为 1 的原始BRDF项 \(f_r\)​​​ 的余弦加权半球积分,即为 \(\omega_{r}\)​​​ 方向反射的能量百分比,也叫方向反照率(Directional Albedo)

\[E(\omega_{r})=E(\mu_o)= \int_{\Omega^{+}}f_r\left(\mu_o, \omega_{i} \right)\left(n \cdot \omega_{i} \right) \mathrm{d} \omega_{i} =\int_{0}^{2 \pi} \int_{0}^{1} f_r\left(\mu_{o}, \mu_{i}, \phi\right) \mu_{i} d \mu_{i} d \phi \]

此处实际上就是将渲染方程中的 \(L\) 移除(不考虑能量的输入大小,仅考虑能量的反射率)。此外, \(w\) 方向与平面的夹角为仰角 \(\mu\) ,BRDF 对不同方向但仰角相同的处理是一致的,因此可用且常用仰角 \(\mu\) 代替 \(\omega\)​ 方向。

那么缺失的能量百分比将是:

\[1-E(\mu_o) \]

\(E \in [0,1]\)​​,取值依赖于参数粗糙度(rough)\(\alpha\)​​ 和仰角 \(\mu\)​ ,不过由于这个函数相对平滑,因此可以在数值上预计算,并存储在一个小的2D Texture中(一般32×32分辨率就足够了)。

然后,我们期望这个额外的 BRDF 项 \(f_{ms}\)​​ 应当遵循以下条件:

  1. 满足它的余弦加权半球积分等于缺失能量百分比
  2. 满足光照方向的对称性(交换 \(\mu_o\)\(\mu_i\)​​​​ 不改变BRDF的值)

Sony Image Work 的 Kulla 和 Conty 按照这样的规则设计出的附加BRDF是:

\[f_{\mathrm{ms}}\left(\omega_{r}, \omega_{i}\right)=\frac{\left(1-E\left(\mu_o\right)\right)\left(1-E\left(\mu_i\right)\right)}{\pi\left(1-E_{\mathrm{avg}}\right)} \]

其中,\(E_{avg}\) 是半球上 \(E\) 的余弦加权平均值 \(E_{\mathrm{avg}}= \frac{\int_{\Omega^{+}}E\left(\omega_{i} \right)\left(n \cdot \omega_{i} \right) \mathrm{d} \omega_{i}}{\int_{\Omega^{+}}\left(n \cdot \omega_{i} \right) \mathrm{d} \omega_{i}}=2 \int_{0}^{1} E(\mu) \mu \mathrm{d} \mu\) ,取值仅依赖于参数粗糙度 \(α\),因此可以存储在一维纹理中,或者可以将廉价的曲线拟合到数据中。

推导过程:

假设额外BRDF的形式为 \(f_{ms}=c(1-E(\mu_o))(1-E(\mu_i))\)​​​​ ,这种形式可以满足光照方向对称性。

\[\begin{aligned} E_{\mathrm{ms}}\left(\mu_{o}\right) &=\int_{0}^{2 \pi} \int_{0}^{1} f_{\mathrm{ms}}\left(\mu_{o}, \mu_i, \phi\right) \mu_i d \mu_i d \phi \\ &=2 \pi \int_{0}^{1} c\left(1-E\left(\mu_{o}\right)\right)\left(1-E\left(\mu_i\right)\right) \mu_i d \mu_i \\ &=2 \pi c (1-E\left(\mu_{o}\right)) \int_{0}^{1}\left(1-E\left(\mu_i\right)\right) \mu_i d \omega_{i} \\ &= \pi c (1-E\left(\mu_{o}\right))\left(1-E_{\mathrm{avg}}\right) \\ \end{aligned} \]

令 $E_{ms}(\mu_o) =1-E\left(\mu_{o}\right) $​​,即令满足 \(f_{ms}\)​​ 的余弦加权半球积分等于缺失能量率,则解得:

\[c=\frac{1}{\pi(1-E_{avg})} \]

如果表面材质具有吸收或者发出能量(BRDF 输出带有颜色)的特性时的附加 BRDF 将是:

所谓吸收或发出能量,实际上是光进入了表面下的介质(折射)并在其中随机散射游走后才再次从表面出来。

\[f_{m s}(\omega_r, \omega_i)=\frac{F_{avg} E_{avg}}{1-F_{avg}\left(1-E_{avg}\right)}\cdot \frac{\left(1-E(\mu_o)\right)\left(1-E(\mu_i)\right)}{\pi\left(1-E_{avg}\right)} \]

其中, \(F_{avg}\) 为平均菲尼尔项(半球上的余弦加权平均值):

\[F_{avg} = 2\int^{1}_{0}F(\mu)d\mu \]

若使用原始 Schilick 近似,则

\[F_{avg} =\frac{20}{21} \cdot F_{0}+\frac{1}{21} \]

推导过程: 假设能量在表面下的散射都是 diffuse 的,那么可认为在内部介质中每散射一次都会乘于 \(F_{avg}\)

因此经过微平面直接反射出来的能量为:

\[F_{avg}E_{avg} \]

一次散射后再反射出来的能量(”损耗“的能量再经过微平面反射出来)则应为:

\[F_{avg}(1-E_{avg}) \cdot F_{avg} E_{avg} \]

...

k次散射后再反射出来的能量应为:

\[F_{avg}^k(1-E_{avg})^k \cdot F_{avg} E_{avg} \]

将所有这些能量加起来得到这样一个颜色项:

\[\frac{F_{\mathrm{avg}} E_{\mathrm{avg}}}{1-F_{\mathrm{avg}}\left(1-E_{\mathrm{avg}}\right)} \]

这个颜色项直接与无颜色的附加 BRDF 相乘即可得到带颜色的附加 BRDF。

最终,使用了能量补偿项的渲染方程将会是这个样子:

\[L_{r}\left(x, \omega_{r}\right)=L_{e}\left(x, \omega_{r}\right)+\int_{\Omega^{+}} L_{i}\left(x, \omega_{i}\right) (f_{r}\left(x, \omega_{i}, \omega_{r} \right)+f_{ms}\left(\omega_{i}, \omega_{r} \right))\left(n \cdot \omega_{i}\right) \mathrm{d} \omega_{i} \]

迪士尼原则 BRDF(Disney’s Principled BRDF)

迪士尼原则的 BRDF(Disney Principled BRDF)是一种面向艺术家的易用模型,而不是严格的物理模型。它能让美术同学用非常直观的少量参数,以及非常标准化的工作流,就能快速实现涉及大量不同材质的真实感的渲染工作。

以前,基于物理的材质(PBR Material)的参数还比较复杂难调,因此没有多少人使用。当迪士尼原则的BRDF(Disney Principled BRDF)在SIGGRAPH 2012 被提出后,由于其高度的易用性以及方便的工作流,已经被电影和游戏业界广泛使用,并成为了次时代高品质渲染技术的代名词。

核心理念如下:

  1. 应使用直观的参数,而不是物理类的晦涩参数。
  2. 参数应尽可能少。
  3. 参数在其合理范围内应该为0到1。
  4. 允许参数在有意义时超出正常的合理范围。
  5. 所有参数组合应尽可能健壮和合理。

以上述理念为基础,最终得到了 baseColor 以及另外十个标量参数:

  • baseColor(基础色):表面基础颜色,通常由纹理贴图提供。
  • subsurface(次表面):使用次表面近似控制漫反射形状。
  • metallic(金属度):金属(0 =电介质,1 =金属)。这是两种不同模型之间的线性混合。金属模型没有漫反射成分,并且还具有等于基础色的着色入射镜面反射。
  • specular(镜面反射强度):入射镜面反射量。用于取代折射率。
  • specularTint(镜面反射颜色):对美术控制的让步,用于对基础色(base color)的入射镜面反射进行颜色控制。掠射镜面反射仍然是非彩色的。
  • roughness(粗糙度):表面粗糙度,控制漫反射和镜面反射。
  • anisotropic(各向异性强度):各向异性程度。用于控制镜面反射高光的纵横比。 (0 =各向同性,1 =最大各向异性。)
  • sheen(光泽度):一种额外的掠射分量(grazing component),主要用于布料。
  • sheenTint(光泽颜色):对sheen(光泽度)的颜色控制。
  • clearcoat(清漆强度):有特殊用途的第二个镜面波瓣(specular lobe)。
  • clearcoatGloss(清漆光泽度):控制透明涂层光泽度,0 =“缎面(satin)”外观,1 =“光泽(gloss)”外观

Disney 总体上采用 microfacet Cook-Torrance BRDF 着色模型,并对其中一些项进行了改造,总体公式如下:

\[f_{r}\left(x, \omega_{i}, \omega_{r}\right)= (1-\mathrm{metallic})(lerp(f_d,f_{ss},\mathrm{subsurface})+f_{sheen}) + f_{spec}+\frac{1}{4}f_{clearcoat} \]

其中,\(f_{spec}\) 用于表现高光,其形式类似于 Cook-Torrance BRDF:

\[f_{spec} = \frac{D F G}{4\left(w_{r} \cdot n\right)\left(w_{i} \cdot n\right)} \]

Disney BRDF 源码:https://github.com/wdas/brdf/blob/main/src/brdfs/disney.brdf

漫反射(Diffuse)

Lambert 漫反射模型在边缘上通常很暗,于是 Disney 采用了一种更由艺术表现的经验模型(通过菲涅尔函数去提升边缘的亮度):

\[f_d(n,\omega_i,\omega_r) = (1+(F_{D90}-1)(1-n\cdot w_i)^5)(1+(F_{D90}-1)(1-n\cdot \omega_r )^5)*\frac{\mathrm{baseColor}}{\pi} \]

\[F_{D90} = 0.5 + 2 * \mathrm{roughness} * (n\cdot h)^2 \]

次表面散射(Subsurface)

基于 Hanrahan-Krueger BRDF 来近似达到各向异性 BSSRDF 的效果。理想很丰满,但是实际上一个开销低廉的 BRDF 还是很难较好地模拟次表面散射的效果,只能做些简单的次表面效果。

\[f_{ss}=1.25*(F_{ss}*(\frac{1}{n\cdot\omega_i+n\cdot\omega_r}-0.5)+0.5)*\frac{\mathrm{baseColor}}{\pi} \]

\[F_{ss} = (1+(F_{ss90}-1)(1-n\cdot \omega_i)^5)(1+(F_{ss90}-1)(1-n\cdot \omega_r)^5) \]

\[F_{ss90} = (\omega_i \cdot h)^2*\mathrm{roughness} \]

布料光泽(Sheen)

布料/丝绸等在边缘处往往会比普通的漫反射更明亮一些:

\[f_{sheen}=C_{sheen}*\mathrm{sheen}*(1-h\cdot\omega_i)^5 \]

\[C_{sheen}=1+(C_{tint}-1)\mathrm{sheenTint} \]

\[C_{tint} = \frac{\mathrm{baseColor}}{lum(\mathrm{baseColor})} \]

\[lum(color)\approx 0.3*color.r+0.6*color.g+0.1*color.b \]

菲涅尔项(Fresnel Term)

菲涅尔也同样采用 Schlick 的 Fresnel 近似,但同时 Disney 也希望可以调节 \(F_0\) 来控制菲涅尔反射的颜色,因此引入了 \(C_{spec}\) 来替换掉固定的 \(F_0\)

\[F(w_i,h) = C_{spec} +(1-C_{spec})(1-h \cdot \omega_{i})^{5} \]

\[C_{spec} = (\mathrm{metallic})*\mathrm{baseColor}+(1-\mathrm{metallic})*0.08*\mathrm{specular}*(1+(C_{tint}-1)\mathrm{specularTinit}) \]

float SchlickFresnel(float u)
{
    float m = clamp(1-u, 0, 1);
    float m2 = m*m;
    return m2*m2*m; // pow(m,5)
}

法线分布项(Normal Distribution Term)

使用了 Generalized-Trowbridge-Reitz(GTR)\({\gamma}= 2\) 的版本,并根据各向异性做了一定改进:

\[D(n,h,X_a,Y_a)=\frac{1}{\pi \alpha_x \alpha_y ((\frac{h\cdot X_a}{\alpha_x})^2+(\frac{h\cdot Y_a}{\alpha_y})^2+(n\cdot h)^{2})^2} \]

\[\alpha_x = \frac{\mathrm{roughness}^2}{\sqrt{1-0.9 * \mathrm{anisotropic}}},\alpha_y = {\mathrm{roughness}^2}*{\sqrt{1-0.9\cdot \mathrm{anisotropic}}} \]

\(\mathrm{anisotropic}\) 表述了各向异性的程度,\(X_a,Y_a\) 则描述了各向异性的旋转方向。

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 ));
}

几何函数 (Geometry Function)

Disney 在几何函数上使用 Smith 遮蔽函数,并基于各向异性 GGX 分布来得到如下:

\[G(n,\omega_i,\omega_r) = G_1(n,\omega_i)G_1(n,\omega_r) \]

\[G_1(n,\omega)= \frac{1}{1+\Lambda(n,\omega)} \]

\[\Lambda(n,\omega) = -\frac{1}{2} +\frac{1}{2} \sqrt{1+\frac{(\omega\cdot X_a)^2*\alpha_x^2+(\omega\cdot Y_a)^2*\alpha_y^2}{(n\cdot \omega)^2}} \]

在实践中,\(f_{spec} = \frac{D F G}{4\left(w_{r} \cdot n\right)\left(w_{i} \cdot n\right)}\)\(\frac{1}{4\left(w_{r} \cdot n\right)\left(w_{i} \cdot n\right)}\) 往往结合到 \(G\) 项,因此实际的 \(G_1(n,\omega)\) 是以下形式:

\[G_1(n,\omega) = \frac{1}{n\cdot \omega +\sqrt{(n\cdot \omega)^2+(\omega\cdot X_a)^2*\alpha_x^2+(\omega\cdot Y_a)^2*\alpha_y^2}} \]

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) ));
}

清漆项(Clearcoat)

清漆本来一般是通过覆盖在表面上的超薄半透明模型去实现的,Disney 直接给表面的 BRDF 加上清漆项来实现,而不用额外增加另一个模型的材质。该清漆项实际上就是一个额外的 cook-torrance 高光,并简单粗暴取一些参数固定的 D F G 项,于是便有:

\[f_{clearcoat} =\mathrm{clearcoat}*\frac{D_rF_rG_r}{4\left(w_{r} \cdot n\right)\left(w_{i} \cdot n\right)} \]

使用 \(\gamma = 1\) 的各向同性 GTR 法线分布,并通过 \(\mathrm{clearcoatGloss}\) 来控制清漆的光滑程度:

\[D_r=D(n,h,a)=\frac{a^2-1}{\pi *\log a^2* (1+(a^2-1)(n\cdot h)^{2})} \]

\[a=lerp(0.1,0.001, \mathrm{clearcoatGloss}) \]

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);
}

固定使用折射率固定为1.5(意味着 \(F_0 = 0.04\)) 的菲涅尔项:

\[F_r=0.04 +(1-0.04)(1-h \cdot \omega_{i})^{5} \]

固定使用 \(\alpha=0.25\) 的各向同性 GGX 遮蔽项:

\[G_r=G_1(n,\omega_i)G_1(n,\omega_r) \\G_1(n,\omega) = \frac{1}{n\cdot \omega + \sqrt{\alpha^2+(n\cdot \omega)^2-\alpha(n\cdot \omega)}} \]

float smithG_GGX(float NdotV, float alphaG)
{
    float a = alphaG*alphaG;
    float b = NdotV*NdotV;
    return 1 / (NdotV + sqrt(a + b - a*b));
}

总结

所谓的 基于物理的渲染(Physically Based Rendering,PBR),实际上就是整套渲染流程的每个成分,包含 material(材质)、lighting(光照)、camera(摄像机)、light transport(光路)等,这些都是在遵循真实世界物理理论的基础上所建立的模型。

目前绝大部分基于物理的渲染理论基础都是基于几何光学,而实际上它还不完全是真实世界的物理,因为它只体现了光的几何直线传播,没有体现光的波动性,这也是最近新渲染理论关注的点:波动光学。

不过,平时人们提起 PBR 经常是指材质,即与之相关的 BxDF,而单单 BxDF 内容也有很多更高级的话题:

  • BSDF:BSDF = BRDF + BTDF,即和BRDF相比,额外考虑光线从物体内部穿过的情况(透射现象),常用于半透明的材质。
  • BSSRDF:和BSDF相比,额外考虑次表面散射的现象(认为不单单只有一个表面),常用于半透明且内部成分复杂的物体(包括玉石、皮肤)。
  • 等等...

各种进阶材质:

  • 皮肤渲染(Skin Rendering)
  • 布料渲染(Cloth Rendering)
  • 半透明表面渲染(Translucent Surfaces Rendering)
  • 头发渲染(Hair Rendering)
  • 毛发渲染(Fur Rendering)
  • 车漆渲染(Car Paint Rendering)
  • 水体渲染(Water Rendering)
  • 湿润表面渲染(Wet Surface Rendering)
  • 天空与大气渲染(Sky and Atmosphere Rendering)
  • 薄表面材质渲染(Thin Surface Rendering)
  • 体积渲染(Volumetric Rendering)
  • 等等...

PBR 是一块内容庞大的主题,《Physically based rendering: From theory to implementation》算是覆盖比较全但很难啃完的进阶书籍,只能先尽量掌握好这些常见且基础的 PBR 知识。

参考

posted @ 2021-08-17 11:31  KillerAery  阅读(1319)  评论(0编辑  收藏  举报