PBR基础

信息

观前必看:

前置基础知识(必看)

如果你了解什么是立体角、辐射通量、辐照度、辐射率,可以跳过。

拓展阅读-迪士尼原则的BRDF与BSDF相关总结

PBR的基础知识,学起来也是相当枯燥的一章。

基于物理的渲染理念 ​

关于基于物理的渲染理念,其实跟图形学中对几何体的建模尺度有一定关联。图形学中,对几何体外观的建模,总会假设一定的建模尺度和观察尺度:

  • 宏观尺度(Macroscale),几何体通过三角形网格进行建模, 由顶点法线(Vertex Normal)提供每顶点法线信息
  • 中尺度(Mesoscale),几何体通过纹理进行建模,由法线贴图(Normal Map)提供每像素法线信息
  • 微观尺度(Microscale),几何体通过BRDF进行建模,由粗糙度贴图(Roughness Map)配合法线分布函数,提供每亚像素(subpixel)法线信息
PBR物体的渲染建模。从左到右:渲染后物体,几何体三角形网格,法线贴图,粗糙度贴图
PBR物体的渲染建模。从左到右:渲染后物体,几何体三角形网格,法线贴图,粗糙度贴图

传统光照模型中,一般只将几何体建模到中尺度的法线贴图(Normal Map)层面。虽说Blinn-Phong等分布也是基于微平面理论推导而来,但并没有配套粗糙度贴图(Roughness Map)为其提供亚像素级精度的细节,而且传统的NDF一般都没有经过归一化,不满足能量守恒,容易出现失真。

而在基于物理的渲染工作流中,通过将粗糙度贴图(Roughness Map)与微平面归一化的法线分布函数结合使用,将需渲染的几何体的建模尺度细化到了微观尺度(Microscale)的亚像素层面,对材质的微观表现更加定量,所以能够带来更加接近真实的渲染质量和更全面的材质外观质感把控。如下图:

微观几何 ​

光与表面之间的交互 ​

我们从图中可以看出如下这个在这里发生如下操作:

  • 反射(Reflection):在物体表面直接反射,我们一般称之为镜面反射。
  • 折射(Refraction):从表面折射入介质的光,会发生吸收(absorption)和散射(scattering)等,而介质的整体外观由其散射和吸收特性的组合决定。
  • 散射(Scattered):折射率的快速变化引起散射,在介质内部发生会造成光的方向会改变到各个方向。散射最终被视作的类型与观察尺度有关。散射距离:入射点到出射点的距离。观察像素: 屏幕上 1 个像素,对应物体表面真实世界的物理宽度
    • 次表面散射(Subsurface Scattering,SSS):观察像素小于散射距离。光子在内部微小颗粒之间来回反弹,不同波长光被吸收程度不同,会产生颜色偏移(比如皮肤红光穿透更深,背光泛红); 散射后的光子从表面另一个位置穿出,形成柔和漫反射光,这部分就是次表面散射光。 关键特征:入射点≠出射点。普通 BRDF 只能描述「同一点入射、同一点出射」的表面反射,完全无法模拟这种跨位置透光效果,因此次表面散射需要用 BSSRDF(双向次表面反射分布函数) 描述,是 BRDF 的扩展。
    • 漫反射(Diffuse):观察像素大于散射距离,散射被视作漫反射。局部着色模型处理即可。
  • 透射(Transmission):入射光经过折射穿过物体后的出射现象。一般在透明物体出现,需要引入BTDF来单独处理。
  • 吸收(Absorption):具有复折射率的物质区域会引起吸收,具体原理是光波频率与该材质原子中的电子振动的频率相匹配。复折射率(complex number)的虚部(imaginary part)确定了光在传播时是否被吸收(转换成其他形式的能量)。发生吸收的介质的光量会随传播的距离而减小(如果吸收优先发生于某些波长,则可能也会改变光的颜色),而光的方向不会因为吸收而改变。任何颜色色调通常都是由吸收的波长相关性引起的。

光与不同物质之间的交互 ​

一半分为两种情况,与金属物体的交互和与非金属物体的交互。

与金属物体表面交互时,折射光会立刻被吸收,能量被自由电子吸收,不会散射出来;

与非金属物体表面交互时,折射光就表现为常规的介质交互,有吸收也有散射,折射光会在经过部分吸收后,从表面重新射出。

次表面散射 ​

在渲染中一般将表面反射认作为specular,而diffuse实际上与次表面散射是同一种现象,本质都是次表面散射的结果。唯一的区别是相对于观察尺度的散射距离。散射距离相较于像素来说微不足道,可以近似于入射点=出射点,次表面散射便可以近似为漫反射。也就是说,光的折射现象,建模为漫反射还是次表面散射,取决于观察的尺度。

看左上角的,绿色的大圈就认为是一个像素映射到平面后的大小,这个时候所有进入表面内部都是在这个圈内出射的,这部分由于距离入射点很近所以就直接认为是从入射点出去的,也就是右上角的图,这部分就是可以近似为常见的漫反射,用局部着色模型处理。

下方的图这个内部光线出去时的出射点距离入射点就比较远了,就超出了绿色圈的范围,如果为了更加真实的着色效果。这部分就需要单独作为次表面散射来处理。

BXDF ​

双向散射分布函数(Bidirectional Scatter Distribution Function,BSDF)。它由两部分构成:双向反射分布函数(Bidirectional Reflectance Distribution Function,BRDF)和双向透射分布函数(Bidirectional Transmission Distribution Function,BTDF)。BSSRDF(bidirectional subsurface scattering reflection distribution function,双向次表面散射反射分布函数) 在上述这些BxDF中,BRDF最为简单,也最为常用。因为游戏和电影中的大多数物体都是不透明的,用BRDF就完全足够。而BSDF、BTDF、BSSRDF往往更多用于半透明材质和次表面散射材质。如下图所示。

BRDF 双向反射分布模型 ​

Bidirectional Reflectance Distribution Function

描述表面如何将入射光反射到各个观察方向的函数,已知法线,输入入射方向、出射方向,输出反射能量比例。

BRDF fr(l,v) 反射能量比例由以下公式得到:

fr(l,v)=dLo(v)dE(l)

fr 中的 r 的含义是 Reflection,表示这是反射函数。其中 l 是入射光线方向, v 是出射视角方向, Lo(v) 表示上半球所有方向的入射光线的贡献得到的出射方向的反射辐射率(Radiance),而 dLo(v) 表示来自于光线 l 贡献的反射辐射率(Radiance); E(l) 是指表面接受到的来自上半球所有方向的入射光线贡献的辐照度(Irradiance) 总和,而 dE(l) 特指来自于光线 l 方向贡献的辐照度(Irradiance)。

fr(l,v) 由两部分组成:漫反射项 fdiff 和 镜面反射项 fspec ,即:

fr=kdfdiff+ksfspec

k 表示各部分的比例。

漫反射项 ​

Lambertian BRDF ​

最基础的漫反射是使用Lambert漫反射模型或者是半Lambert漫反射模型。但正常的Lambert漫反射无法满足PBR的能量守恒原则。于是引入了Lambertian漫反射模型。

Lambertian假设:假设光线进入内部后,在无限小 的距离内就被完全均匀地打散并从同一个点射出来。因为散射极其充分,所以出射光的方向与入射方向彻底无关,只跟有多少总能量(反照率颜色ρ)有关。

公式如下:

fdiff=ρπ

公式极其简单, ρ 是表面的基础色(反照率), π 是为了保证”能量守恒“而作的归一化处理,也就是说反射出的能量不能大于接受的能量。结果是一个常数。

信息

反照率(Albedo):专门指漫反射 部分的基础颜色。它代表光线进入物体内部,被吸收和散射后,最终漫射出来的颜色。属于反射率 的一种

  • 如果 ρ=1 ,代表纯白,即所有颜色都“100% 反射”(不吸收)。
  • 如果 ρ=0.5 ,代表灰色,即所有颜色都“50% 反射”(吸收了一半能量)。
  • 如果 ρ=(0.9,0.2,0.2) ,代表红色,即红光反射 90%,绿蓝光只反射 20%。

推导:

首先漫反射是一个均匀向各个方向反射的一个现象。因此漫反射的BRDF一定是一个常数,假设入射光是均匀且遍布整个半球方向,即也是一个常数,可以得到:

Lo(ωo)=∫ΩfdiffLi(ωi)cosθidωi=fdiffLi∫Ωcosθidωi

这里 Ω 是指整个上半球,因为是对一个抽象的入射方向 dωi 积分,所以使用了抽象的范围表示积分区间。

由于假设入射光是均匀且遍布整个上半球方向,所以 Lo 与方向无关且等于 Li 。或者换种说法,假设表面是一个纯白色的粗糙表面,白色 ρ 为1,也就是暂不考虑 ρ 值,纯白色不吸收任何光,所以入射亮度会等于出射亮度。所以可以从等式两边消去:

fdiff∫Ωcosθidωi=1

因为 dω=dAr2 和 dA=(r·dθ)(rsinθ·dϕ)=r2sinθdθdϕ 得到 dω=sinθdθdϕ ,带入得:

fdiff∫02πdϕi∫0π2cosθisinθidθi=1

这里因为积分的对象改变了,所以相应的积分区域也会发生了改变。 ϕ 是水平角,有360°,也就是 2π ; θ 是垂直角,因为是半球,所以只有90°,也就是 π2 。

根据正弦二倍角公式: sin2θ=2sinθcosθ 得到 sinθcosθ=12sin2θ ,代入上式得:

12fdiff∫02πdϕi∫0π2sin2θidθi=1

因为 ∫02πdϕi=2π , ∫0π2sin2θidθi=−12×cos(2×π2)−(−12)×cos(2×0)=1

所以,最后化简为:

12fdiff×2π=1

即:

fdiff=1π

由于之前我们视为纯白色表面,没有考虑能量被吸收,将反照率考虑进来之后,得到最终的漫反射BRDF:

fdiff=ρπ

Lambertian BRDF不仅性能好,而且和复杂模型的效果也非常接近。我们这里的漫反射项的计算没有考虑材质表面粗糙度以及材质表面的镜面反射对漫反射的影响。迪士尼和 Oren-Nayar 的 BRDF 模型考虑了上述影响,他们的模型会在掠射角产生逆向反射。我们这里不这样做首先是因为这样做会产生额外的计算代价,但效果提升却不太明显。其次是复杂的漫反射模型也让 IBL 和球谐光照的实现变得更加困难。

局限性:

  • 太“平”:因为亮度不随视角变化,纯Lambertian材质的立体感很强,但缺乏真实感(真实物体表面多少有些微粗糙变化)。
  • 无法表现边缘透光:当强光从背后照射时,Lambertian只能算出背面是黑的,但像耳朵、手指 这类SSS材质,边缘会透出红光——这就必须用我们之前说的次表面半径 参数来计算,而不是用简单的 ρπ 了。

Disney 漫反射 BRDF ​

上面我们说过了,传统的 Lambertian BRDF就是简单的 ρπ (能量守恒下的常数),但这在物理上是不准确的。

于是迪士尼根据真实数据发现粗糙的材质(如布料、未抛光木材)在掠射角(视线贴着表面) 看时,反射率并不是恒定的,而是明显变亮了(称为“回射效应”,Retro-reflection)。

于是借助了Schlick 近似(Schlick 1994年提出的菲涅耳近似),提出了 Disney Diffuse(漫反射部分的 Schlick 菲涅耳近似):

fdiff=ρπ(1+(FD90−1)(1−cosθi)5)(1+(FD90−1)(1−cosθo)5)

其中 θi 是入射光线与法线的夹角, θo 是视角方向(出射光线)与法线的夹角, FD90是漫反射在掠射角(90度)时的反射率。

光照角度因子 (1+(FD90−1)(1−cosθi)5) :

  • 当光线垂直 照射 cosθi=1 时, (1−1)5=0 ,这个因子变成 1+0=1 ,不影响基础色。
  • 当光线倾斜 照射 cosθi→0 时, (1−0)5=1 ,这个因子变成 1+(FD90−1)=FD90 ,漫反射强度会变成 FD90 倍。

视线角度因子 (1+(FD90−1)(1−cosθo)5) :

  • 当视线垂直 观察 cosθo=1 时, (1−1)5=0 ,这个因子变成 1+0=1 ,不影响基础色。
  • 当视线倾斜 观察 cosθo→0 时, (1−0)5=1 ,这个因子变成 1+(FD90−1)=FD90 ,漫反射强度会变成 FD90 倍。

其中 FD90 通常是由粗糙度推导得出,公式如下:

FD90=0.5+2×roughness×cos2θh

其中 roughness 是粗糙度,注意要与后面的 α 区分开, α 是 roughness2 ; θh 是光线方向与视角方向的半角方向与法线的夹角。

这是一个经验公式,故不需要什么推导。


镜面反射项 DFG项 ​

Cook-Torrance Specular DFG的应用 ​

Torrance-Sparrow基于微表面理论,用后文将要讲述的三个函数建立了镜面反射BRDF模型。这个模型后来由Cook-Torrance引入计算机图形学,也被称为Cook-Torrance模型。Cook-Torrance BRDF 具体公式:

fspec(l,v)=F(l,h)G(l,v)D(h)4cosθlcosθv=F(l,h)G(l,v)D(h)4(n·l)(n·v)

其中 v 为视角方向(反射方向), l 为入射光方向, n 为表面法线, h 为半角方向

但这种表达方式在物理学上不太严谨,因为我们这里的入射光和反射光准确来说都说立体角方向,所以应该使用 ωi 表示入射立体角方向, ωo 表述反射立体角方向(视角方向),下标 i 和 o 表示 incoming(入射)和outgoing(出射); ωh 表示半角立体角方向,也是微表面法线所限制在的立体角范围,有以下公式:

fspec(ωi,ωo)=F(ωi,ωh)G(ωi,ωo)D(ωh)4cosθicosθo=F(ωi,ωh)G(ωi,ωo)D(ωh)4(n·ωi)(n·ωo)

其中, θi 表示入射光方向 ωi 与宏观表面法线 n 的夹角, θo 表示反射方向 ωo 与宏观表面法线 n 的夹角。 F 表示菲涅耳反射项, G 表示几何函数、阴影遮蔽函数, D 表示法线分布函数。这三个具体都是什么,我们之后会说到。

推导:

假设一束光照射到一个微表面上,入射光方向为 ωi ,视角观察方向为 ωo ,对反射到 ωo 方向的反射光有贡献的微表面法线为半角立体角向量 ωh 。

根据辐射率与辐射通量之间的公式 L=dΦdωdA⊥ 以及 dA⊥=cosθdA 得:

dΦh=Li(ωi)dωidA⊥(ωh)=Li(ωi)dωicosθhdA(ωh)

其中 dA(ωh) 是微表面法线在半角立体角 ωh 中的微分微表面面积, dA⊥(ωh) 为 dA(ωh) 在与入射光线垂直的面上的投影。 θh 为入射光线 ωi 与微表面朝向 ωh 的法线的夹角,如下图

把 dA(ωh)=D(ωh)dωhdA 带入得到:

dΦh=Li(ωi)dωicosθhD(ωh)dωhdA

微表面是光学平坦表面,所以反射光线遵循菲涅耳定理,则反射光的辐射通量为:

dΦo=F(ωo)dΦh

根据辐射率与辐射通量之间的公式 L=dΦdωdA⊥ 以及 dA⊥=cosθdA 还有以上公式得:

dLo(ωo)=dΦodωocosθodA=F(ωo)Li(ωi)dωicosθhD(ωh)dωhdAdωocosθodA

由BRDF定义和 dE=Lcosθdω 得到:

fspec(ωi,ωo)=dLo(ωo)dEi(ωi)=dLo(ωo)Li(ωi)cosθidωi=F(ωo)cosθhD(ωh)dωhcosθicosθodωo

信息

因为 L=dΦdωdA⊥=dΦdωcosθdA , E=dΦdA

所以 L=dEdωcosθ

dE=Ldωcosθ

我们知道在渲染方程 Lo(ωo)=∫Ωf(ωi,ωo)Li(ωi)cosθidωi 是对 dωi 的积分,所以方程中不能存在 dωo 和 dωh 作干扰,我们需要对 fspec(ωi,ωo) 做化简,把 dωo 和 dωh 消去。希望可以找到 ωhωo 的关系。

如上图所示,入射光与微表面相交于 O 点,与单位上半球相交于 I 点,出射光线与h单位上半球相交于 R 点。由于微表面都说镜面反射,所以法线等同于半角向量 h

由立体角的定义 ω=dAr2 可得,反射立体角 dωo 等于反射立体角和单位上半球的相交 dAo 的面积大小。同理,半角(法线)立体角 dωh 等于半角立体角和单位上半球相交的 dAh 的面积大小。故求 ωhωo 等于求 dAhdAo ,也就是两个相交面积的比值

连接 IR 相交半角(法线)方向 h 于点 P ,由于是半角向量,我们轻松可得 IR=2IP=2PR

在这个图中,我们还需要理解一件事情,半角(法线)立体角 dωh 所形成的那个圆锥中,法线可能是其中的任意一条线,当法线为圆锥最左边的边线时,出射方向相应的也会变成反射立体角 dωo 所形成的圆锥体的最左边的的边线。同理,法线是圆锥最右边的边线也是一样。这样我们就可以理解为什么, I 与 dAo 两头形成的连线一定经过 dωh 圆锥的两边。

所以,图中 dAh′ 与 dAo 的半径的比值关系也等于 IPIR=12 ,又因为圆的面积公式为 πr2 ,和半径的平方成正比,所以 dAh′dAo=14

因为单元球的半径为1,所以连线 OR=OQ=1 ,由因为入射角等于反射角等于 cosθh ,所以 OP=cosθhOR=cosθh 。由相似可以得到

dAh′′dAh′=1cos2θh

结合之前的结果可得:

dAh′′dAo=14cos2θh

由于 dAh 相当于 dAh′′ 在与半角(法线)方向垂直的面上的投影,所以

dAh′′=dAhcosθh

所以:

dAhdAo=14cosθh

我们代回到之前求得到 fspec(ωi,ωo) 中得:

fspec(ωi,ωo)=F(ωo)D(ωh)4cosθicosθo

最后加上几何函数项G,得到完整的Cook-Torrance BRDF:

fspec(ωi,ωo)=F(ωi,ωh)G(ωi,ωo)D(ωh)4cosθicosθo

D:法线分布函数**(Normal Distribution Function)** ​

当一个入射光 l 打到一个表面上,由于宏观表面是由无数个微表面构成,每个微表面的法线 m 各不相同,所以得到的反射方向也各不相同。只有反射方向与视角方向 v 一致时,这个反射光线才能被我们所看到。

也就是说一个入射光 l 打到一个表面上后,不是所有的反射光线都能被我们所看到。那么我们该怎么确定有多少反射光线能被我们所接收到呢?我们可以先思考,当视角方向和入射光方向不变的时候,我们可以利用它们的半角向量 h 与各个微表面法线 m 做比较来判断是否能够被我们所接受。这时候我们就使用法线分布函数‌(Normal Distribution Function, NDF),用于描述微表面模型中微观几何表面法线与半角向量同向的概率分布。

信息

法线分布函数写作 D(h) ,可以理解为微表面中法线方向为 h 的面积,但是我们在应用的时候还需要一些限制:

  • 单位宏观面积, D(h) 针对宏观着色微元 dA ,代表单位宏观面积内,法线为 h 的所有微平面总面积。
  • 单位立体角dωh , 微平面法线是连续分布,不存在法线严格等于某固定向量的微平面,必须引入范围区间。 所以我们求在单位立体角dωh 范围里面的法线。

这时我们就得到了 D(h) 的最终定义:

每单位宏观面积、每单位立体角内,法线为 h 的微平面总面积。

可以得到以下公式:

dA(ωh)=D(ωh)dωhdA

dA(ωh) 就是指在宏观面积 dA 中,法线位于立体角 dωh 内所有微平面的总面积

由于实际上不可能去模拟所有微表面的法线方向,而有的是该点处的表面法线方向,整体来说微表面的法线方向都是对宏观法线方向的一个扰动后的结果,也就是说微观的法线都是在宏观法线上稍微摆动了一下,如下图

NDF不是概率密度函数,也不是正态分布函数,而是一个面积的密度函数,这需要纠正的一点。 因为微平面的法线存在无数个,因此法线分布函数不能使用一个具体的向量值,而需要使用微分立体角限定一个范围。这样才可以宏观统计分布。

信息

归一化约束:

宏观表面中的所有微观表面的投影面积应当等于宏观表面的面积。

在上文中,我们有对 dA 进行一个简单的推导,得到了 dA(ωh)=D(ωh)dωhdA ,这个式子的含义是 dA 上法线位于立体角 ωh 内所有微表面的总面积,因此NDF的本质是一个密度函数。我们考虑对上式在上半球进行积分,其实就是把 h 的方向在上半球的每一个方向都计算一次相应的微表面面积,然后再累加起来。每个微表面的法线都是固定,在整个半球上积分也就是每个微表面都能够计算到。所以我们用 dAh 表示宏观表面内所有微表面的面积,用 Ω 表示上半球范围于是有:

dAh=∫ΩD(ωh)dωhdA

然后我们再对其求一个投影,其结果应该等于宏观表面的面积,也就是 dA :

dA=∫ΩD(ωh)dωhdAcosθh=∫ΩD(ωh)dωhdA(n·ωh)

由于 dA 是宏观着色区域面积,不随着积分变化,所以可以作为常量将 dA 提取出来,之后可以两边消去 dA 得:

∫ΩD(ωh)(n·ωh)dωh=1

即将 D(ωh) 投影到宏观表面上,会得到宏观表面的面积,其被约束等于1

换句话说, D(ωh)(n·ωh) 是被归一化的。

归一化意味着着色模型根据其角度大小按比例缩放镜面高光的强度,这样总反射能量在不同的表面平滑度下保持不变。总的来说也是为了保持PBR的能量守恒原则的。即 “入射多少能量,只要不考虑吸收,反射总能量在宏观上就是守恒的”。

更一般的,微表面与宏观表面在投影到垂直于任何视角观察方向 v 的平面上的面积也是相等的:

∫ΩD(ωh)(v·ωh)dωh=v·n

方程左边指的是微表面在垂直于视角方向的平面上的投影,右边指的是宏观表面在垂直于视角方向的平面上的投影。

需要注意的是在这里点乘 (v·m) ,不能够限制为大于或等于零。因为涉及到正负抵消,在上图可看到很多重叠的微表面,对最终效果有所影响的还是可见微表面,即在每个重叠集合中最接近相机的微平面。这一事实表明了将投影的微观区域与投影的宏观几何区域相关联的另一种方法:可见微平面的投影面积之和等于宏观表面的投影面积。

也就是说我们只需要计算可见微表面即可。我们可以通过定义遮蔽函数(masking function)G1(ωh,v) 来对其进行数学表达( G1 是 G 几何函数的基础,只考虑视角方向的遮挡),给出了沿着视角方向可见具有法线 ωh 的微表面的比率。

∫ΩG1(ωh,v)D(ωh)(v·ωh)+dωh=v·n

注意这里是加上了+号的限制,也就是现在必须是大于零的,也就是说背面的微表面不予考虑。乘积 G1(ωh,v)D(ωh) 则表示了可见法线的分布,如下图:

那么在这里可以对法线分布函数做一个性质的总结,如下所示:

  1. 微表面法线密度始终为非负值: 0≤D(ωh)≤∞
  2. 微表面的总面积始终不小于宏观表面总面积: ∫ΩD(ωh)dωh≥1
  3. 任何方向微表面的投影面积和宏观表面一致: ∫ΩD(ωh)(v·ωh)dωh=v·n
  4. 若观察方向为法线方向,则其积分可以归一化。即 v=n 时, ∫ΩD(ωh)(n·ωh)dωh=1

历史上主流的法线分布函数,按提出时间进行排序,可以总结为:

  • Berry [1923]
  • Beckmann [1963]
  • Phong [1973]
  • Blinn-Phong [1977]
  • ABC [1989]
  • GGX [2007] / Trowbridge-Reitz [1975]
  • Shifted Gamma Distribution,SGD [2012]
  • Trowbridge-Reitz(GTR)[2012]
  • Student’s T-Distribution , STD [2017]
  • Exponential Power Distribution , EPD [2017]

各向同性(Isotropic)NDF ​

信息

这里略微补充一下各向同性和各向异性的区别

简单来说就是,各向同性的BRDF在输入和输出方向围绕表面法线变化(都与法线的夹角保持不变)时保持不变;

而各项异性的话会跟着和表面法线夹角会有所改变,通常各项异性应用在头发、丝绸、磁盘的材质会比较多。

也就是说各向同性会在入射光线和出射光线的方向变化的时候,保持与法线的夹角不变,并且对应的BRDF的值也是不变的,而各向异性则会有不同的BRDF的值。

说人话就是,如下图,各向同性中BRDF不会随着 ϕ 而变化,只受 θ 的影响;而各向异性中,BRDF受 ϕ 和 θ 同时影响。


Blinn-Phong 分布 ​

了解了NDF所需要的性质之后,问题是需要NDF满足什么?期望对于较光滑宏观表面当 h=n 时也就是半角向量和微表面法线重合, D(h) 达到最大值。当大部分的 h 都偏向于 n 时, D(h) 为上涨趋势;当 h 越来越偏离 n 时, D(h) 值也要相应变小。而且,当宏观表面粗糙度变高时, D(h) 的值也会变小。此外,随着 h·n 的值变小,衰减的越慢,有一个拖尾的效果最好,更符合想要的效果。

首先构造一个函数出来,首先想到的是 (h·n)α ,也就是 cosαθh ,其中 α 是粗糙度系数,该值较大代表比较光滑,较小则代表粗糙表面,根据不同 α 的取值的 D(h) 的表现如下:

从上图可知,对于同一个 α 值,随着 θ 值慢慢变大,对应的微表面法线和宏观表面法线重合的微表面越来越少,对应的 D(h) 也缓慢衰减。当 α 的取值越大时,宏观表面越光滑,对应到当 θ 值变大时的 D(h) 衰减加快。

但是还是不满足之前关于NDF的性质,首先需要一定满足 α 是偶数才可以满足 0≤D(ωh)≤∞ 的特性。因为当 θ 大于90°的时候, cosθ 值为负数,此时 α 如果为奇数最终结果仍为负数,这在物理和数学上不允许。

于是我们引入了一种假设——高度场模型,所谓高度场的微表面模型就是微表面法线分布在宏观表面法线所在的半球上,即 θ 限制在 [0,π2] ,故不存在朝下的微表面法线。满足这条假设约束的微表面模型则不会有 α 的限制。

还记得我们上面的归一化约束吗, ∫h∈Ω(h·n)α(n·h)dωh (等同于 ∫Ω(ωh·n)α(n·ωh)dωh )在非高度场模型中永远等于0,即便是在使用了高度场的模型中,结果也不为1,甚至当 α 取值不同时结果也不同。也就是说不满足能量守恒的原则。

因此我们需要一个归一化因子(normalization factor)k ,即 ∫h∈Ωk(h·n)α(n·h)dωh=1

接下来就开始推导 k ,首先是将 dωh 转化,依托之前推导可知的 dωh=sinθdθdϕ ,代入可得:

∫02πdϕh∫0π2kcosαθhcosθhsinθhdθh=1

将一些常量提取出来并简化得到:

2πk∫0π2cosα+1θhsinθhdθh=1

只需要推导 ∫0π2cosα+1θhsinθhdθh 即可,我们直接使用换元法,令 u=cosθh ,则 du=−sinθhdθh 代入积分,同时变换上下限:当 θh=0 时, u=1 ;当 θh=π2 时, u=0 。于是得到:

∫10uα+1·(−du)=∫01uα+1du=[uα+2α+2]01=1α+2

我们直接代回原式:

2πkα+2=1k=α+22πk

最后的法线分布函数为:

D(h)=α+22π(h·n)α

这就是 Blinn-Phong 分布,从一开始 h·n 推导到了已经完成归一化的程度,其中 α 是 Blinn-Phong NDF 的“粗糙度参数”, α 高值表示光滑表面,低值表示粗糙表面。对于非常光滑的曲面值可以任意高(一个完美的镜面 α=∞ ),并且通过将 α 设置为0可以实现最大随机曲面(均匀NDF)。但是这个参数非常不方便与美术人员的操作,因为带来的视觉变化十分的不均匀。经常让美术家们操纵“界面值”,即通过非线性函数从中导出 α 。例如: α=ms ,其中 s 是0到1之间的艺术家操纵值, m 是给定的电影或游戏中 α 的上限(比如上图8196)。当BRDF参数的行为在视觉上上不统一时,这种 "界面映射 "是很常用的方案。

如下图是不同 α 取值的 Blinn-Phong 分布的表现:

在 UE 中,存在着不一样的映射,将 α=2αp−2−2 ,得到新的式子:

D(h)=1πα2(h·n)2α2−2

这里对 α 取了一个倒数映射,带来的最大的好处就是,让粗糙度系数更符合直觉,原来 Blinn-Phong 分布的 α 越大越平滑,明明叫做粗糙度,效果却与名称完全相反,这样的映射修复了这一反直觉的现象。这种映射还可以使得在表现粗糙材质的时候,其高光“拖尾”效果更接近真实的物理测量数据,提升了视觉真实感。

我们看一下它在不同 α 取值的 D(h) 的趋势图:

可以从图中看出,这样

还有一个重要的点,Blinn-Phong是不满足形状不变性(Shape Invariance) 的,关乎到后续的几何函数(这个很重要,后面会解释)


Beckmann 分布 + 斜率空间 ​

Beckmann NDF是光学界(optics community)在第一个微表面模型中使用的法线分布函数。当Cook-Torrance BRDF初步提出的时候也是选用 Beckmann,现在同样还在使用。Beckmann 归一化之后的法线分布方程如下:

D(h)=1πα2(n·h)4e((n·h)2−1α2(n·h)2)D(h)=1πα2cos4θhe(cos2θh−1α2cos2θh)

由于 cos2θ−1=−sin2θ ,所以这个式子可以进一步化简:

D(h)=1πα2cos4θhe(−sin2θhα2cos2θh)=1πα2cos4θhe(−tan2θhα2)

如下图是不同 α 取值的 Beckmann 分布的表现:

Beckmann分布在某些方面与Blinn-Phong分布非常相似。 两种法线分布的参数可以同样使用 α=2αp−2−2 关系式。可从下图看出:

图 Blinn-Phong(蓝色虚线)和 Beckmann(绿色)分布
图 Blinn-Phong(蓝色虚线)和 Beckmann(绿色)分布

但是Beckmann分布是满足形状不变性的 NDF。

信息

在做证明之前,我们还需要补充一点知识

斜率空间

就是通过使用斜率来表示一个向量(微表面方向)

二维斜率空间表示

如下图所示,微表面的斜率为 xB−xAyB−yA ,法线 h 的斜率 kh=yhxh=1tanθh ,因为法线与微表面垂直,所以它们的斜率乘积为-1,即 xB−xAyB−yA·yhxh=−1 。所以可得 xB−xAyB−yA=−tanθh=−xhyh

三维斜率空间表示

在三维空间中,如果法线 h 的斜率依旧用 1tanθh 表示的话,会存在一个问题z:无法用斜率来确定一个唯一的法线。例如将微表面绕 z 轴稍微旋转一点,此时法线 h 发生了变化,但是其斜率依旧没变。所以如下图,我们设法线 h 为 (Δhx,Δhy,Δhz) ,在这里将法线分别投影到 xz 和 yz 平面上,得到 OA 、 OB 。

红色区域是微表面,z轴是宏观表面法线方向
红色区域是微表面,z轴是宏观表面法线方向

还是和之前一样的推导公式, OA 的斜率 ΔhzΔhx=1tanθhcosϕh , OB 的斜率 ΔhzΔhy=1tanθhsinϕh

设微表面和 xz 平面的相交线为 L ,即图中微表面上的红色虚线。因为微表面平面方程(经过原点)为:

Δhxx+Δhyy+Δhzz=0

又因为 xz 平面方程为 y=0 ,代入可以求得交线 L 满足的方程:

Δhxx+Δhzz=0

可以求得其斜率为 ΔzΔx=−ΔhxΔhz=−tanθhcosϕh

同理,可以求得, yz 平面与微表面的相交线的斜率为 ΔzΔy=−ΔhyΔhz=−tanθhsinϕh

三维空间中的法线可以通过它所在的微表面与 xz 与 yz 平面的相交线的斜率组合成的向量来定义,即:

(−tanθhcosϕh,−tanθhsinϕh)

由于斜率和法线之间的关系,斜率可以作为法线的另一种参数化,在 z>0 的半球,即满足高度场模型下,给定任何向量,可以将其视为法线并找到垂直于它的表面的斜率。斜率空间 就是所有可能的斜率值的二维空间。由于斜率可以是任何实数,所以斜率空间只是实数平面。

将斜率空间可视化的一个好方法是将其与平面 z=1 ,即半球顶部相联系。 然后在原点的向量可以通过与平面相交来转换为斜率空间。

这里引入了一个符号 n~ 表示斜率空间中与三维向量 n (也就是 h )相对应的二维向量。

想象在三维空间的原点 (0,0,0) 放一个灯泡,在高度 z=1 的位置放一张无限大的透明玻璃板(即平面 z=1 )。
现在,空间中任意一条朝上的法线向量 v ,比如 (vx,vy,vz) ,就像一束光。我们沿着它的 z 方向把它“拉长”,直到它击中那张玻璃板。因为玻璃板的高度是 1,所以击中点的 z 坐标必须是 1;了把原来的向量 v 拉到 z=1 的高度,我们需要把整个向量除以它自己的 vz (即缩放倍数 1vz ),那么击中点的坐标为: (vxvz,vyvz,1) 。这里的可以看作为调整向量取负后的 x 、 y 分量,可以将斜面想象为倒置的 x 、 y 轴来解决这个问题,也就是对 x 、 y 取反方向。

因此可以通过将每个点投影到远离原点直到它碰到平面来想象半球被放大并拉伸到平面上。这在单位向量之间建立了双射(一对一映射, z>0 ,并且点在平面上)

正式地说,任意向量的斜率空间参数化 v 与 vz>0 的情况下可定义为:

v~x=−vxvzv~y=−vyvz

这假设向量是向上的,因此必须满足 vz>0 。它们不能区分向上和向下的向量,因为斜率没有方向概念,反转法线仍然得到相同的斜率。

从斜率转换回单位法向量也很简单,把拉伸后的向量进行一个归一化即可,公式如下:

v=normalize(−v~x,v~y,1)

单位向量的另一个常见参数化是极坐标 (θ,ϕ) 。计算出斜率和极坐标之间的转换是很简单的,我们定义极坐标,使得 θ 从 +z 轴向下测量, ϕ 从 +x 轴逆时针测量,就是我们上面那张三维空间的图一样的定义。

极坐标和 3D 单位向量之间的转换:

θ=acos(z)ϕ=atan2(y,x)

x=sinθcosϕy=sinθsinϕz=cosθ

极坐标空间和斜率空间的转换如下:

θ=atan(x~2+y~2)ϕ=atan2(−y~,−x~)x~=−tanθcosϕy~=−tanθsinϕ

为什么需要斜率空间

现在已经了解了如何定义斜率空间并从中来回转换。但是为什么有用呢?为什么我们要以这种方式表示向量或函数?

在微表面BRDF理论中,为简单起见通常假设微表面是一个高度场(对于许多日常材料来说,这是一个非常合理的假设)。如果微表面是一个高度场,那么它的法线被限制在上半球。斜率空间非常适合精确参数化上半球。

从性能的角度来看,斜率空间的转换成本也比极坐标低得多,这使得它更适合在着色器中使用。它只需要一些除法或归一化,而不是一堆正三角函数或反三角函数。

与单位向量的其他表示相比,斜率空间也没有边界。斜面的原点(0, 0)表示平面法线,越远斜率越极端,但不能使平面倒置或产生无效法线。因此可以在斜率空间中自由地对向量进行各种操作,而不必担心超出任何界限。

关于斜率空间的另一个有用的事实是,表面的许多线性变换如缩放或剪切都可以简单地映射到斜率空间的变换。例如将一个表面沿其 z 轴按因子 α 缩放表面会导致其法向量的 z 分量按 1α 缩放(由于法线采用逆转置),但由于 nz 在斜率空间的定义中是分母,所以我们可以得出表面的斜率按 α 缩放。

例如:二维表面中,当表面在 x 轴方向上发生拉伸 λ 倍。法线变化为 normalize(xhλ,yh) ,法线的斜率变化为 kh=λyhxh=λ1tanθh ,则微表面斜率变为 h~′=1λh~

斜率空间在NDF中的应用

微表面 BRDF 的关键要素之一是它的法线分布函数(NDF),而斜率空间的关键用途之一正是定义NDF。由于斜率空间是一个无界的二维平面,我们可以像在任意二维域中那样,引入现成的一维或二维分布函数,并以各种方式操作它们。只要我们最终在斜率平面上得到一个有效的、归一化的概率分布(有时称为斜率分布函数,或 P22 函数),我们就能将其转换为以极坐标或向量形式表达的、具有正确归一化的NDF。

通俗来说就是半球面(NDF定义域)是扭曲的、有边界的,而斜率空间是平坦的、无界的二维平面。在平面上定义分布、做采样、做滤波,都比在球面上容易得多。但问题来了:平面上的分布不能直接拿来就用,必须经过一个严密的数学转换,才能变成物理正确的NDF。

雅可比行列式(The Jacobian)

在将分布函数从一个空间映射到另一个空间时,重要的是要记住,这些函数的值并非无量纲的数字;它们是相对于底层空间的面积或体积测度的密度。因此,仅仅通过改变变量来用新坐标表达函数是不够的;你还必须校正映射对体积的拉伸或挤压,这种拉伸或挤压可能随位置变化而变化。

假设我们有域 A 上的概率密度 p(a) ,映射到域 B 上的密度 p(b) ,必须保证概率总量守恒:

p(a)dA=p(b)dB

这表示在无穷小体积 dA 中的概率量,映射后仍然等于 dA 中的概率量。

这个等式可以改写为:

p(b)=p(a)dAdB

这里的因子 dAdB 称为雅可比行列式,指的是包含变量从 a 到 b 变化的所有导数的雅可比矩阵 的行列式。 实际上,这是逆雅可比行列式,因为 A→B 的正雅可比行列式是 dBdA 。

什么是“逆雅可比”? 如果映射 A→B 把局部面积拉伸了 2 倍(即 dBdA=2 ),那么为了让密度乘以新面积后总量不变,新的密度必须变成原来的一半,即乘以 dAdB=12 。这个 dAdB 就是逆雅可比行列式。我们后面要算的,就是这个 dAdB 的精确数值

因此,当将斜率空间分布转换为 NDF 时,我们必须乘以适当的雅可比行列式。 但是我们如何找出那是什么? 首先,我们必须记住,NDF 的定义不是半球立体角上的密度,而是平面上投影面积上的密度。 因此,仅仅找到从斜率空间到极坐标的雅可比行列式 是不够的; 我们还需要找到从极坐标到投影面积的雅可比行列式。

最简单的方法是使用微分形式的 Formalism (形式理论)

这里我们还需要引入一种新的运算——楔积(又称外积,符号: ∧ )

有向面积、叉乘以及楔积介绍

总之记住楔积是用来求面积的,并且有三个重要性质:

结合律: (au→+bv→)∧w→=au→∧w→+bv→∧w→

反交换: u→∧v→=−v→∧u→

反交换的延申: u→∧u→=−u→∧u→=0

第一步,计算极坐标下的法线方向 (θ,ϕ) 对应的微表面,投影在水平面( xy 平面)上的真实面积是多少:

前面我们知道,极坐标转 3D 单位向量的公式是: x=sinθcosϕy=sinθsinϕ

我们先求全微分 dx 和 dy :

dx=∂x∂θdθ+∂x∂ϕdϕ=cosθcosϕdθ−sinθsinϕdϕdy=∂y∂θdθ+∂y∂ϕdϕ=cosθsinϕdθ+sinθcosϕdϕ

然后再做楔积 ∧ 求面积(把变化量组合成有方向的面积):

dB=dx∧dy=(cosθcosϕdθ−sinθsinϕdϕ)∧(cosθsinϕdθ+sinθcosϕdϕ)=0+sinθcosθcos2ϕ(dθ∧dϕ)−sinθcosθsin2ϕ(dϕ∧dθ)−0=sinθcosθcos2ϕ(dθ∧dϕ)+sinθcosθsin2ϕ(dθ∧dϕ)=sinθcosθ(dθ∧dϕ)(cos2ϕ+sin2ϕ)=sinθcosθ(dθ∧dϕ)

第二步,计算极坐标下的法线方向 (θ,ϕ) 对应的微表面,投影在斜率空间上占多少面积:

前面我们知道,极坐标转斜率空间的公式是: x~=−tanθcosϕy~=−tanθsinϕ

我们先求全微分 dx~ 和 dy~ :

dx~=∂x~∂θdθ+∂x~∂ϕdϕ=−cos−2θcosϕdθ+tanθsinϕdϕdy~=∂y~∂θdθ+∂y~∂ϕdϕ=−cos−2θsinϕdθ−tanθcosϕdϕ

然后再做楔积 ∧ 求面积(把变化量组合成有方向的面积):

dA=dx~∧dy~=(−cos−2θcosϕdθ+tanθsinϕdϕ)∧(−cos−2θsinϕdθ−tanθcosϕdϕ)=cos−2θtanθcos2ϕ(dθ∧dϕ)−cos−2θtanθsin2ϕ(dϕ∧dθ)=cos−2θtanθcos2ϕ(dθ∧dϕ)+cos−2θtanθsin2ϕ(dθ∧dϕ)=cos−2θtanθ(dθ∧dϕ)

第三步,求将密度从斜率空间转换到 NDF 形式的逆雅可比行列式 dAdB :

dAdB=dx~∧dy~dx∧dy=cos−2θtanθ(dθ∧dϕ)sinθcosθ(dθ∧dϕ)=1cos4θ

最后我们就可以用这个雅可比行列式去得到法线分布函数和斜率分布函数的关系:

D(h)=P22(x~,y~)cos4θ

如果同时考虑到粗糙度 α 的话,那么对于各项同性的 BRDF 而言,法线分布函数和斜率分布函数分别为 D(h,α) 和 P22(x~,y~,α)

Beckmann 分布的推导:

既然我们学习了斜率空间,就从斜率空间开始思考。前面我们学了,在斜率空间可以用一组二维向量 (x~,y~) 来表示一个微表面中的法线。我们期望当 x~=0 和 y~=0 的时候,也就是微表面法线与宏观法线重合的时候, D(h) 达到最大值。当大部分的 x~ 和 y~ 偏向于 0 时, D(h) 为上涨趋势;当的 x~ 和 y~ 越来越偏离 0 时, D(h) 的值也要相应变小。而且当宏观表面粗糙度变高时, D(h) 的值也要相应变小。此外,随着 x~ 和 y~ 的值越来越偏离 0,衰减的越慢。

那么满足这样的函数,我们大概第一个想到的就是 “二维高斯分布” (二维正态分布)。没错,Beckmann 分布就是基于二维高斯分布 推导的。我们先来看看二维高斯分布的完整公式:

f(x,y)=(2πσxσy1−ρ2)−1e[−12(1−ρ2)((x−μ1)2σx2−2ρ(x−μ1)(y−μ2)σxσy+(y−μ2)2σy2)]

这个公式看起来很可怕吧,是的,这很可怕。不过我们稍微分析一下,就能化简成很简单的公式。

其中 μ1 和 μ2 是这个二维高斯分布的中心点的 xy 坐标,也就是说,这个二维高斯分布的中心点也就是最大值所在地为 (μ1,μ2) ,在斜率空间中,我们宏观法线所在位置是 (0,0) ,所以 μ1=μ2=0 。

而 σx 和 σy 是控制分布沿着 x 轴和 y 轴方向的散开程度, σ 越大,曲线越胖,数据越分散,表面越粗糙。这个就是我们的粗糙度系数,由于我们这是各向同性,所以 σx=σy=α 。

最后一个 ρ 值是 x 与 y 的相关系数,取值在 [−1,1] ,由于这里是各向同性, x 与 y 相互独立,无线性相关性,所以 ρ=0 。

这里我们的 x 与 y ,也要换成斜率空间中的 x~ 与 y~

我们把这些值代入,可得:

f(x~,y~)=12πα2e(−x~2+y~22α2)

我们进一步对方程做优化。我们把与可调节的系数,即粗糙度系数 α ,有关不变系数优化掉,也就是用 α2 替换掉原来的 2α2 。顺便换成 P22 来表示斜率分布函数得:

P22(x~,y~)=1πα2e(−x~2+y~2α2)

现在我们的方程就与一开始的庞然巨物相比简单了很多。

前面我们学习到,在斜率空间中, x~=−tanθhcosϕh , y~=−tanθhsinϕh ,代入到公式中:

P22(x~,y~)=1πα2e(−x~2+y~2α2)=1πα2e(−tan2θh(cos2θh+sin2θh)α2)=1πα2e(−tan2θhα2)

我们现在所求的是在斜率空间下的分布函数,我们需要将其转换到 3D 向量空间,也就是将斜率分布函数转换为法线分布函数,使用之前求得的逆雅可比行列式 dAdB=1cos4θ :

D(h)=P22(x~,y~)dAdB=1πα2cos4θhe(−tan2θhα2)

这就是 Beckmann 分布函数的推导,不过推导到现在还不要着急结束,我们还需要证明其是否满足归一化约束。先回顾一下会用的结论,归一化约束 ∫ΩD(h)(n·h)dωh=1 ,立体角转化 dω=sinθdθdϕ 。

∫ΩD(h)(n·h)dωh=∫Ω1πα2cos4θhe(−tan2θhα2)cosθhdωh=∫02πdϕh∫0π2sinθhπα2cos3θhe(−tan2θhα2)dθh=2π·1πα2∫0π2sinθhcos3θhe(−tan2θhα2)dθh=2α2∫0π2sinθhcos3θhe(−tan2θhα2)dθh

使用换元法进行求不定积分:

令 u=tan2θh ,则 du=2tanθhsec2θhdθh=2·sinθhcosθh·1cos2θh=2sinθhcos3θh ,所以 sinθhcos3θh=12du 。

同时还要修改积分域,当 θh=0 时, u=0 ,当 θh=π2 时, u→+∞

代回原积分得:

∫0+∞12e(−uα2)du=12∫0+∞e(−uα2)du=12[−α2e(−uα2)]0+∞=α22

代回原式得:

∫ΩD(h)(n·h)dωh=2α2·α22=1

结果为1,满足归一化约束,到此为止,Beckmann 分布函数的推导结束了。


GGX 分布 ​

上述的 Blinn-Phong 分布以及 Beckmann 分布都可以发现一个问题,就是衰减的特别快,只要图像稍微向两侧走,就会快速降为0。反应到光和物体上就是会有一些锐利的高光,一旦 h 和 n 开始偏移,高光区域瞬间衰减。并没有慢慢衰减的一个过程,这并不符合现实世界的各种材质,所以需要一个更具有“长尾”的法线分布函数,那就是GGX。

GGX即Trowbridge-Reitz分布,最初由Trowbridge和Reitz推导出,在Blinn 1977年的论文中也有推荐此分布函数,但一直没有受到图形学界的太多关注。30多年后,Trowbridge-Reitz分布被Walter等人独立重新发现,并将其命名为GGX分布。

GGX 归一化之后的法线分布方程如下:

D(h)=α2π((h·n)2(α2−1)+1)2D(θh)=α2π(cos2θh(α2−1)+1)2=α2π(cos2θhα2+sin2θh)2

我们可以对这个式子进一步变形:

D(θh)=α2π(cos2θha2+sin2θh)2=α2π(cos4θhα4+2cos2θhsin2θhα2+sin4θh)=α2πcos4θh(α4+2tan2θhα2+tan4θh)=α2πcos4θh(α2+tan2θh)2

分母的这个 cos4θh 是不是很眼熟,这个不就是我们之前推导的斜率分布函数与法线分布函数之间的关系中包含的因子吗,是的,GGX 也是在斜率空间的基础上推导出来的。

推导:

这次我们需要找到一个比 Blinn-Phong 分布和 Beckmann 分布高光衰减更慢的函数,即在斜率空间找一个“中间隆起、两端缓慢衰减”的简单有理函数。

而有这么一个函数刚好满足这个条件,它就是 1(r2+α2)2 。

其中 r 是变量,在这里可以视为斜率空间中微表面的法线斜率 x~2+y~2=tanθh , α 是粗糙度系数。

在图中可以看出,两边的衰减没有那么剧烈了。既然找到了合适的函数,那么下一步就是要对它进行归一化约束。

设归一化系数为 k ,则 P22(x~,y~)=k(α2+tan2θh)2 ,然后我们先把它转换为法线分布函数:

D(h)=P22(x~,y~)·1cos4θh=kcos4θh(α2+tan2θh)2

由于归一化约束,所以需要满足:

∫ΩD(h)(n·h)dωh=∫Ωkcos4θh(α2+tan2θh)2cosθhdωh=1

因为 dω=sinθdθdϕ ,所以

∫ΩD(h)(n·h)dωh=∫Ωkcos4θh(α2+tan2θh)2cosθhdωh=∫02πdϕh∫0π2sinθhkcos3θh(α2+tan2θh)2dθh=2πk∫0π2tanθhcos2θh(α2+tan2θh)2dθh

使用换元法进行求解:

令 u=tanθh , du=sec2θhdθh=1cos2θhdθh ,所以 dθ=cos2θhdu

同时还有更改积分域,当 θ=0 时, u=0 ,当 θ=π2 , u→+∞ ,代入原积分得:

∫0+∞u(α2+u2)2du

继续换元化简,令 t=a2+u2 ,则 dt=2udu ,所以 udu=12dt ,

更改积分域,当 u=0 时, t=a2 ,当 u→+∞ 时, t→+∞ ,得:

12∫α2+∞1t2dt=12[−1t]α2+∞=12(0+1α2)=12α2

代回原式得:

∫ΩD(h)(n·h)dωh=2πk∫0π2tanθhcos2θh(α2+tan2θh)2dθh=12πk2α2=1k=α2π

求得归一化系数为 k=α2π ,代入到最初的式子中,我们的推导就结束了:

D(h)=kcos4θh(α2+tan2θh)2=α2πcos4θh(α2+tan2θh)2

下图展示了GGX在不同 α 值的表现,当偏移越大时并没有快速的衰减到0,而是平稳到了某个数值,能够得到更好的效果。

下图是一张 Beckmann 分布以及 Blinn-Phong 分布和 GGX 分布的对比,在这可以看出 GGX 的高光部位并没有一个快速衰减,而是呈现一个带有光晕的现象。这也就是 GGX 分布的拖尾效果。更加符合现实世界中的材质表现,这也是为什么 GGX 分布能够成为最流行模型之后的原因之一。

各种NDF高光对比,左下角的是Beckmann分布
各种NDF高光对比,左下角的是Beckmann分布

并且GGX分布还有形状不变性的特性,与后面介绍的GTR分布却没有这个特性,这也是导致GTR没有推广开来的原因之一。

信息

在迪士尼原理着色模型中,GGX 分布同样有一个类似上面 Blinn-Phong 分布以及 Beckmann 分布的映射关系以便用户来使用。Burley推荐将粗糙度 roughness 控制以 α=roughness2 暴露给用户,其中 roughness 是0到1之间的用户界面粗糙度参数值,以让分布以更线性的方式变化。这种方式实用性较好,不少使用 GGX 分布的引擎与游戏都采用了这种映射,如 UE 和 Unity。

GGX 分布的移动端性能优化

我们可以通过使用半精度浮点数(half precision floats)来对此实现进行改进。这种优化需要改变原始方程,因为在半浮点数half(即mediump)中计算 1−(n⋅h)2 时存在两个问题:

问题一:当 1−(n⋅h)2 接近1时(即高亮部分), (n⋅h)2 的计算会出现浮点数取消(floating point cancellation)现象

问题二: n⋅h 在1.0左右没有足够的精度。

可以通过拉格朗日恒等式(Lagrange’s identity)解决此问题,格朗日恒等式即:

|a×b|2=|a|2|b|2−(a⋅b)2

由于 n 和 h 都是单位向量,所以 |n×h|2=1−(n⋅h)2

于是,我们可以通过使用简单的叉积 |n×h|2 来直接计算半精度浮点数下的 1−(n⋅h)2 。

总的来说,此优化方案会带来更好的性能,并保持所有计算都在half(mediump)内进行。


GTR 分布 + 形状不变性 ​

那能不能有更好的拖尾效果的NDF呢?能够更好的去控制NDF的形状尤其是它的尾部,Burley 根据对 Berry,GGX 等分布的观察,提出了广义的 Trowbridge-Reitz(Generalized-Trowbridge-Reitz,GTR)法线分布函数,提供了更多的对于尾部的控制。公式如下:

D(h)=c((h·n)2(α2−1)+1)γ

其中, γ 参数用于控制尾部形状,而 c 是归一化常数,是一个包含了 γ 和 α 的复杂表达式 c=(γ−1)(α2−1)π(1−α2(1−γ)) ,随着 γ 的变化而变化。当 γ=2 时, c=α2π ,GTR 等同于 GGX。随着 γ 的值减小,分布的尾部变得更长,相反则更短。以下为各种值的 GTR 分布曲线与 θh 的关系图示:

不过从这个公式当中可以看出和GGX的主要差距就是在分母的指数上,总体上肯定希望让红线往绿线和蓝线方向偏移,因为长尾效果更好。注意上边当我们的变得很大的时候,其实是接近于之前的Beckman效果的,所以GTR在GGX和Beckmann实现了某种统一。因此通过修改分母的次数就可以得到相应的不同程度的拖尾效果。虽然GTR在拖尾效果上很好,但是为什么还是推广不开呢?虽然实现了可以随意修改参数得到不同的长尾效果,但是也同时丧失了形状不变性,导致其发布以来,无法被广泛使用。

信息

形状不变性

从之前得到过的斜率分布函数可以看出 P22 只和 x~ 、 y~ 、 α 这三个变量有关系,那么也就是说如果当斜率分布函数仅与 tanθhα 参数有关时( x~2+y~2=tanθh ),微表面模型拥有形状不变性,即改变粗糙度α值等效于拉伸微表面,并不改变微表面的形状。此时斜率分布函数可以写作:

P22(xh~,yh~,α)=1α2f(xh~2+yh~2α)⟹P22(tan⁡θhα)=1α2f(tan⁡θhα)

其中 1α2 是这个斜率分布函数的归一化系数,具体求法不再赘述, f() 代表一个表示了NDF形状的一维函数。为什么上面形式的斜率分布函数具有形状不变性? 根据形状不变性定义,法线分布函数 NDF 可视为二维斜率分布;原始 NDF 本质是三维分布。 对于具备形状不变形式的 NDF,对粗糙度 α 做线性缩放,等价于在斜率空间中对整体分布做线性拉伸: 将粗糙度缩放 λ 倍,等价于将微表面沿 坐标轴同步拉伸 λ 倍,拉伸后微表面斜率变为 (λx~,λy~) 。 将缩放后的斜率与粗糙度代入斜率分布函数推导:

P22(λxh~,λyh~,λα)=1(λα)2f(λ2xh~2+λ2yh~2λα)=1λ2α2f(λxh~2+yh~2λα)=1λ2α2f(xh~2+yh~2α)=1λ2P22(xh~,yh~,α)

最后多出来的 1λ2 是二维平面的**面积缩放修正项, 保证分布全空间积分恒等于 1 ,**其余内部没有变化,证明微表面相对形态未发生改变。

根据法线分布函数与斜率分布函数的关系可以将拥有形状不变性的法线分布函数写作:

D(h)=1α2coshθ4f(tan⁡θhα)=1α2coshθ4f(sin⁡θhαcosθh)=1α2(n⋅h)4f(1−(n⋅h)2α(n⋅h))

对于形状不变形的NDF可以通过粗糙度来控制表面的拉伸情况,下图所示:

对于形状不变的NDF,缩放粗糙度参数相当于通过倒数拉伸微观几何

形状不变性是一个法线分布函数NDF需要具备的重要性质。具有形状不变性的NDF,可以用于推导该函数的归一化的各向异性版本,并且可以很方便地推导出对应的遮蔽阴影项G。具备形状不变性的常用NDF为:GGX以及Beckmann,不具备形状不变性的NDF有Phong、Blinn-Phong、GTR,这也是为什么这些模型最终没有推广开来的原因。


各向异性(Anisotropy)NDF ​

现实世界中,大多数材质具有各向同性的表面外观,但有些特殊材质的微观结构具有显著的各向异性(Anisotropy),从而显著影响其外观。

创建各向异性NDF的常用方法是基于现有各向同性NDF进行推导。而推导所使用的方法是通用的,可以应用于任何形状不变的(shape-invariant)各向同性NDF,这便是GGX等形状不变的NDF能更加普及的另一个原因。

如上文所述,若一个各向同性(isotropic)的NDF具备形状不变性(shape-invariant),则其可以用以下形式写出:

D(h)=1αtαb(n⋅h)4f((t⋅h)2αt2+(b⋅h)2αb2(n⋅h))

其中,参数 αt 和 αb 分别表示沿切线(tangent)方向 t 和副法线(binormal)方向 b 的粗糙度。若 αt=αb ,则上式缩减回各向同性形式。

下图就是一个各项同性的分布是怎么通过拉伸表面变成一个各向异性的分布的。相反的任何一个各向异性分布的结构可以变换回各项同性分布的结构。


Beckmann 分布 各向异性 ​

Beckmann 分布函数是最符合这个形状不变性形式公式的,我们看各向同性的公式:

D(h)=1πα2(n⋅h)4e(−1−(n⋅h)2α2(n⋅h)2)

我们直接比着葫芦画瓢就能直接得出 Beckmann 的各向异性版本:

D(h)=1παtαb(n⋅h)4e(−(t⋅h)2αt2+(b⋅h)2αb2(n⋅h)2)

其中, h 为微表面法线(半角向量), n 为宏观表面法线, t 为切线方向, b 为副法线方向, αt 和 αb 分别表示沿切线方向 t 和副法线方向 b 的粗糙度。


GGX 分布 各向异性 ​

我们首先把各向同性的 GGX 分布函数转化为形状不变性形式的公式:

D(h)=α2πcos4θh(α2+tan2θh)2=α4πα2cos4θh(α2+tan2θh)2=1α2cos4θh⋅α4π(α2+tan2θh)2=1α2cos4θh⋅1π(α2α2+tan2θh)2=1α2cos4θh⋅1π(11+tan2θhα2)2=1α2(n⋅h)4⋅1π(11+1−(n⋅h)2α2(n⋅h)2)2

现在符合形状不变性形式,我们只需要比着葫芦画瓢将其转换为各向异性版本即可:

D(h)=1αtαb(n⋅h)4⋅1π(11+1(n⋅h)2((t⋅h)2αt2+(b⋅h)2αb2))2=1παtαb⋅(1(n⋅h)2+(t⋅h)2αt2+(b⋅h)2αb2)2

G:几何函数(Geometry Function) ​

实际上并不是所有微表面都能收到接受到光线,如下面左边的图有一部分入射光线被遮挡住,这种现象称为Shadowing。也不是所有反射光线都能到达眼睛,下面中间的图,一部分反射光线被遮挡住了,这种现象称为Masking。光线在微表面之间还会互相反射,如下面右边的图,一些被认为是shadowing部分的微表面会收到其他微表面反射的光,这可能也是一部分漫射光的来源,微表面理论忽略了这些相互反射。假如光线一直没出去反射,会造成一定的能量损失,后续会补充如何补齐这一块能量的方式(保持能量守恒)。

几何函数就是为了更好的模拟着色区域内微表面的凹凸不平而诞生的。

几何函数是保证 Microfacet BRDF 理论上能量守恒,逻辑上自洽的重要一环。其描述了微平面自阴影的属性,表示所有微表面中同时被入射方向和反射方向可见(没有被遮挡的)的比例,即未被遮挡的微表面占所有微表面的百分比。也就是说项计算出了真正能够有多少光到达观察方向。单纯的 NDF 数值不是有效的微表面的法线强度,需结合几何函数才能得到最终对 BRDF 能产生贡献的法线分布。

信息

遮蔽概率不变性(Masking Probability Invariance)

基于形状不变性。下图展示了给定出射方向下的拉伸一维表面对于微表面遮蔽情况的影响,拉伸一维表面就像拉伸图片一样即一个维度被乘以一个恒定的系数。这一操作并不改变该表面的拓扑结构,当观察向量同样被拉伸后被遮挡的光线仍然被遮挡,未被遮挡的光线仍然未被遮挡。这是一个关键性质,后续会方便几何函数的推导。当中涉及的所有斜率同时被缩放时,遮挡概率对拉伸是保持不变的。这包括微表面的斜率和与出射方向相关的斜率。它们都被拉伸系数相反缩放因此斜率宽度的分布也同样反向拉伸了。相应的 D(h) 也会改变。

在之前的 NDF 介绍中,我们通过定义遮蔽函数(masking function)G1(h,v) 来对其最后可见性进行数学表达,其给出了沿着视图向量 v 可见的具有法线 h 的微表面的比率。 G1(h,v)D(m)(v⋅h)+ 在球体上的积分给出投影到垂直于 v 的平面上的微观表面面积,其等于投影到垂直于 v 的平面上的宏观表面面积,其中 + 表示为被约束为大于等于0,也就是说在这里剔除了背面的影响因为背面微平面不可见,因此在这种情况下不对其进行计算。

∫ΩG1(h,v)D(h)(v·h)+dh=v·n

基于物理的掩蔽函数 G1(h,v) 应该总是满足这个上面这个式子,但是在这里需要对 G1(h,v) 做一定的约束,这是因为 D(h) 没有完全指定微表面(microsurface)。 G1(h,v) 仅告诉我们有多少百分比的微平面的法线指向了某些方向,而没有告诉我们这些法线是如何进行排列。而且对于固定的输出方向 v ,在二维中存在无限多个遮蔽函数 G1(h,v) 满足等式。

微表面轮廓

为了解决 G1(h,v) 不能确定唯一形式的问题,在这里引入了第二个约束:选择合适的微表面轮廓(microsurface profile),从而对决 G1(h,v) 项进行具象化建模。一旦选择了微观表面轮廓,遮蔽函数就完全确定了,它的唯一形式可以被计算出。如下所示,微表面轮廓会对得出的BRDF形状有着很大的影响。

在这里有很多微表面轮廓模型,但是符合物理并且满足上述公式约束的遮蔽函数有Smith 遮蔽函数和Torrance-Sparrow "V-cavity" function (V 型腔几何遮蔽函数)

Smith 遮蔽函数 ​

在真实的微表面中,是连绵起伏的山丘,一个点的高度和旁边的法线是有关联的(山顶法线朝上,山坡朝外),计算这种“关联表面”的遮挡概率,数学上极其复杂。如下图左图。

为了能算,Smith模型做出了一个**“无自相关”的假设:把微表面想象成无数根随机竖立的“针”或“碎片”**,它们的高度和朝向完全是独立的,跟邻居没有任何关系。如上图右图,虽然这看起来不像是真实的连续表面,但实践证明,用它算出来的光照结果视觉效果很好。

这个假设带来了一个神秘好处:法线和遮蔽脱钩,即**法线/遮蔽独立性(Normal/Masking Independence)。**因为是随机独立的,所以出现了一个关键性质:对于一个朝向你(没有被背面剔除)的微表面,它被远处其他微平面挡住的概率,跟它自己的法线方向没有任何关系。

意思就是说,如果一个表面法线朝向你的微表面,它被遮挡的概率与它的法线朝向没有关系;如果是背对你的法线的微表面(背面),它天然被自己挡住了,属于本地遮挡,与法线方向有关。

于是我们可以得到一个公式:

G1(v,h)=G1local(v,h)G1dist(v)

左边 G1(v,h) 指某个法线为 h 的微表面,在观察方向 v 下总共能被看见的概率。

右边第一项 G1local(v,h)=χ+(v,h) 指本地可见性, χ+ 是一个判断函数(要么为0要么为1),意思就是:如果你的法线朝向观察者,本地就没被自己挡住,记为1;否则背面不可见,记为0。

右边第二项 G1dist(v) 指远处遮挡概率,这一项只与观察方向 v 有关,与微表面法线 h 无关。

我们把这个公式代入到 ∫ΩG1(v,h)D(h)(v·h)+dh=v·n 中得:

∫ΩG1local(v,h)G1dist(v)D(h)(v·h)+dh=cosθo

其中 G1dist(v) 与法线无关,在积分中可视为一个常数系数提取出来,然后把 G1local(v,h) 替换成 χ+(v,h) :

G1dist(v)∫Ωχ+(v,h)D(h)(v·h)+dh=cosθo

由于这个方程是面向非背面法线的,所以 χ+(v,h) 可以直接剔除:

G1dist(v)∫ΩD(h)(v·h)+dh=cosθo

所以:

G1dist(v)=cosθo∫ΩD(h)(v·h)+dh

远处遮挡的概率,等于‘宏观表面实际亮度’除以‘所有微平面朝观察方向的投影面积之和’。也就是说,分母越大(微平面越“崎岖”),分母算出来的值越小,说明远处遮挡越严重。

完整的 G1(v,h) 方程如下:

G1(v,h)=χ+(v,h)cosθo∫ΩD(h)(v·h)+dh

这是Ashikhmin等人在法线、掩蔽相互独立的假设下剔除的准确遮蔽函数的积分形式。它们使用积分表示来预计算遮蔽函数,并且将它存储在一个查阅表中用来渲染。Smith遮挡函数通过将积分与从法向转换成斜率空间,可以将上面的式子重新改写成:

G1(v,h)=χ+(v,h)11+Λ(v)=χ+(v,h)1+Λ(v)

其中 11+Λ(v) 是 Smith 遮蔽函数的广义形式,是转换到斜率空间后的化简形式,对于许多随机曲面,其具有闭合形式的解。其中 Λ(v) 是表示微表面斜率上的积分:

Λ(v)=1cotθo∫cotθo∞(xh−cotθo)P22(xh)dxh

Smith遮蔽函数针对每个NDF会计算出不同的 Λ(v) 函数。需要注意仅具有形状不变性的法线分布函数(如GGX、Beckmann)可以导出具有解析形式的 Λ(v) 函数,而且不具备形状不变性的函数(比如Blinn-Phong),则 Λ(v) 不存在解析形式。

优点:Smith遮挡函数唯一满足其能量守恒并且满足法线/遮蔽独立的几何函数,选择它,首先不是因为它像真实表面,而是因为它在“法线/遮蔽独立”这个数学假设下,数学上绝对精准且严格满足能量守恒(不会出现反射光能量大于入射光的“永动机”情况)。

缺点:光线垂直 照向粗糙表面时,光线能射入凹坑底部,完美体现粗糙度;但当光线几乎平行(掠射)照向表面时,凸起的微表面会投射出长长的阴影,把凹坑全部盖住。此时光线只打在凸起的“光滑山顶”上,粗糙度瞬间失效,表面看起来异常光滑。因为它假设法线和遮挡位置无关,它无法准确模拟这种“光照角度剧烈改变粗糙度感知”的复杂耦合效应,导致掠射角下渲染结果偏暗或偏亮。

限制:Smith 假设表面是完全随机 的(像一堆散沙)。但布料有规律的经纬线编织、鳞片有规律的排列,这些属于强自相关 结构。一个凹坑旁边必有一个凸起,法线和位置强相关。在重复结构面前,Smith 的“独立性”假设彻底崩塌,算出来的结果会严重失真,所以 PBR 渲染布料时,往往要专门定制 NDF(如 Charlie 模型)和独立的遮蔽函数。

那么接下来还有问题需要解决,除了入射光会被遮挡以外,微表面产生的镜面反射光同样有可能被其它的微表面所遮蔽,导致其无法到达观察方向。也就是说在前面的基础上,还需要再考虑这个微表面产生的镜面反射光是否会被遮挡的情况。由于光路是可逆的,反射向相机的光被遮挡,同样可以看作是从相机射向微表面的光被遮挡。因此这种情况我们同样可以使用遮蔽函数 G1(v,h) 来描述,其中 v 的值取反射光的方向即可。

Smith 联合遮蔽-阴影函数 ​

分离的遮蔽阴影函数

当遮蔽函数 G1(v,h) 的 v 取值为入射光方向时,描述的是微表面反射出去的光被其它微表面所遮挡导致无法接收到入射光,从而产生阴影的情况,此时遮蔽函数也可称为阴影函数。当遮蔽函数 G1(v,h) 的 v 取值为反射光方向时,描述的是微表面产生的反射光被其它微表面所遮挡,无法射向相机的情况。可以使用一个函数来同时描述这两种情况,该函数被称为联合遮蔽阴影函数(joint masking-shadowing function),常用 G2 表示,取值范围为 [0,1] 。由于光路可逆,从相机方向看被挡住(遮蔽),等价于从光源方向看被挡住(阴影)。所以,完整的可见概率 G2 必须同时考虑视线方向v和光线方向l ,可得下式:

G2(l,v,h)=G1(l,h)G1(v,h)=χ+(v,l)1+Λ(l)⋅χ+(v,h)1+Λ(v)

这种被称为分离形式 的遮蔽阴影函数。如果使用该形式会导致得到的结果过暗。最极端的一个例子即是,假设光照方向和观察方向相同,即 l=v ,这意味着你盯着的那一面,光也正正好好从你眼睛的方向打过来。此时 G1(v,h)=G1(l,h) 。在现实中,只要这个微平面能被你看见,光就一定能原路照到它,没任何遮挡,理论上这种情况下应该为 G2=G1 ,但这个公式得到的却是 G2=G12 ,由于 G1 小于1,平方后会更小。这就等于把同一批遮挡物“双重计数”了,导致渲染出的边缘和正面高光无故变暗,这就是图形学里常说的**“双重暗化(Double Darkening)”**问题。

高度相关的遮蔽阴影函数

一个更精确的遮蔽阴影函数需要对遮蔽和阴影之间的相关性进行建模,由于微表面的高度。直观地讲一个面在微表面的高度越高,在出射方向(无遮挡)和入射方向(无遮挡)的概率就会同时增加。因此遮蔽和阴影是通过微表面的升高而相互关联的。直观理解:如果一个微平面凸起得够高,它在视线方向没被挡,那么在光线方向大概率也没被挡(两者正相关)。这种相关性可以在以下的联合遮蔽阴影函数中得到说明:

G2(l,v,h)=χ+(v,l)χ+(v,h)1+Λ(l)+Λ(v)

去除了分离形式中的分母中的 Λ(l)Λ(v) ,当出射方向和入射方向相距较远时这种形式是准确的。但当方向接近时则同样会造成更暗的效果。高度与分离形式计算复杂度几乎一样(都是算两个 Λ ),但高度相关形式显著更准。推荐使用。

方向相关的遮蔽阴影函数

之前讲的“高度相关”只考虑了微平面凸起的高度(高的容易都看见,低的容易都挡掉)。但它忽略了一个水平方向的因素:如果视线方向( v )和光源方向( l ) 在宏观法线 n 的同一侧(即方位角 ϕ=0 ),那么挡住视线的那个凸起,必定也挡住光源。这时候,两个方向的遮挡是“同一个人”造成的,完全相关。

在这种情况下,双重遮挡的概率不是相乘,而是取短板效应 G2(l,v,h)=min(G1(l,h),G1(v,h)) (木桶原理,最窄的那一关决定了最终可见度)。如果视线和光源在相反的两侧,挡住它们的凸起大概率不是同一个,这时候遮挡就趋向于独立。

为了描述这种从“完全相关(同侧)”到“独立(异侧)”的渐变,给出了混合公式(分离形式和方向形式):

G2(l,v,h)=λ(ϕ)G1(l,h)G1(v,h)+(1−λ(ϕ))min(G1(l,h),G1(v,h))

其中 λ(ϕ) 函数值的范围为 [0,1] ,并且其值随着 v 和 l 的相对方位角 ϕ 的增加而增加(也可写作 λ(l,v) ),目前常用的函数有如下两种:

λ(ϕ)=1−e−7.3ϕ2λ(ϕ)=4.41ϕ4.41ϕ+1

但是 λ(ϕ) 是类似于Ginneken等人的经验模型。没有找到函数的Smith解析表达式,只是长得像Smith,所以必须分别计算遮蔽和阴影。 这就是为什么必须混合可分离的形式和方向相关的形式,并且无法将高度相关性结合到他们的模型中。

高度方向相关的遮蔽阴影函数

将高度相关与方向相关的函数结合,即可得到高度方向相关的遮蔽阴影函数。其中Smith高度方向相关的遮蔽阴影函数如下所示:

G2(l,v,h)=χ+(v,l)χ+(v,h)1+max(Λ(v),Λ(l))+λ(l,v)min(Λ(v),Λ(l))

极端情况 1:视线和光源完全重合( λ=0 )
分母变成 1+max(Λ(v),Λ(l)) 。因为两个方向一样, Λ 值也一样,分母就是 1+Λ 。这正好还原成了单个方向的 G1 (即 G2=G1 ),彻底解决了双重暗化问题。

极端情况 2:视线和光源方向差异极大( λ 趋向于 1)
分母变成 1+max(Λ(v),Λ(l))+min(Λ(v),Λ(l)) ,也就是 1+Λ(l)+Λ(v) 。这正好还原成了我们上面讲的 “高度相关形式”(分母相加)。

中间情况( λ 在 0 到 1 之间)
分母在“只取最大值”和“两者相加”之间平滑插值。

不同 NDF 下的几何函数 ​

Beckmann-Smith阴影遮蔽函数 ​

我们之前求到过Beckmann的斜率分布函数

P22(x~,y~)=1πα2e(−x~2+y~2α2)=1πα2e(−tan2θhα2)

再通过 Λ 函数的定义,可以得出Beckmann的 Λ 函数如下所示:

Λ(a)=erf(a)−12+12aπe−a2

其中 a=1tanθα 。这个公式的计算成本很高,因为它包含 erf (误差函数),它是高斯函数积分的“标准答案”,在数学上很完美,在 GPU(显卡)里,计算 erf 需要做复杂的级数展开和迭代循环,这个计算代价比普通的加减乘除要高出几十倍。如果在每个像素点的渲染中都要算一次 erf ,游戏帧率会直接“卡成幻灯片”。因为这个原因,通过用近似表示:

Λ(a)≈{1−1.259a+0.396a23.535a+2.181a2,a<1.60,a≥1.6

后续可以计算出对应的 G2 ,这里暂时不计算了。

GGX-Smith阴影遮蔽函数 ​

根据我们之前求得到的GGX NDF可以简单得到它的斜率分布函数:

P22(x~,y~)=α2π(α2+tan2θh)2=α2πα2(1+x~2+y~2α2)2

再通过 Λ 函数的定义,可以得出GGX的 Λ 函数如下所示:

Λ(a)=−1+1+1α22

其中 a=1tanθα ,所以:

Λ(v)=−1+1+α2tan2θo2Λ(l)=−1+1+α2tan2θi2

可以接下去继续推算 G2 ,代入到高度相关的Smith遮蔽阴影函数当中。

G2(l,v)=11+Λ(v)+Λ(l)=11+−1+1+α2tan2θo2+−1+1+α2tan2θi2=21+α2tan2θo+1+α2tan2θi=21+α21−cos2θocos2θo+1+α21−cos2θicos2θi=2cosθocosθicosθicos2θo+α2−α2cos2θo+cosθocos2θi+α2−α2cos2θi=2cosθocosθicosθi(1−α)cos2θo+α2+cosθo(1−α)cos2θi+α2

上诉式子即:GGX使用Smith高度相关的遮蔽阴影函数公式。此时的 G 项计算非常的复杂,注意到平方根下的所有项都是平方,并且所有项都在 [0,1] 范围内之后,可以通过简化公式来获取一个近似值,简化后的公式如下:

G2(l,v)=2cosθocosθicosθi((1−α)cosθo+α)+cosθo((1−α)cosθi+α)

分离形式(Schlick近似形式)的 G2 就不再计算了,直接给出结果:

G2(l,v)=2cosθocosθo+cos2θo+α2(1−cos2θo)⋅2cosθicosθi+cos2θi+α2(1−cos2θi)
GGX的各种近似 ​

Smith-Schlick-GGX

对于分离形式的,Christophe Schlick在1994年提出了一种极快的公式替代 xx(1−k)+k 来替代复杂的 G1 函数,被称为Schlick近似形式:

G2(l,v)=cosθok+cosθo(1−k)⋅cosθik+cosθi(1−k)

其中 k 是一个与粗糙度有关的拟合系数,越粗糙,所以 k 也就越大,那么 G2 衰减越快。

我们会在计算直接光和间接光的时候使用不同的 k ,常用的 k 有:

直接光 k=(α+1)28 ,间接光 k=α22 , α=roughness2

Smith-Joint-Schlick-GGX

对于高度形式,Heitz在2014年基于Schlick近似提出了Joint(联合的概念),将游戏和电影业界对遮蔽阴影函数(The Smith Joint Masking-Shadowing Function)的理解上升到了一个新的层次。

UE和Unity都在后续更新中转向了Smith联合遮蔽阴影函数(The Smith Joint Masking-Shadowing Function)的高度相关遮蔽阴影形式(Height-Correlated Masking and Shadowing),并相应地都做了一些近似与优化。

其中UE和URP中使用的:

α=roughness2Λ(v)=cosθi(cosθo(1−α)+α)Λ(l)=cosθo(cosθi(1−α)+α)G2(l,v)=0.5Λ(v)+Λ(l)

结合起来:

G2(l,v)=0.5cosθi(cosθo(1−α)+α)+cosθo(cosθi(1−α)+α)

这里有点误导的是,这里求的 G2 并不是 G2 ,而是 V2 ,其值为 G24cosθicosθo

我们求得的这个 G2 可以直接 fspec=DFG

各向异性版本

αt=roughnesst2αb=roughnessb2Λ(v)=cosθicos2θo(αtcos2θt+αbcos2θb)+cos2θoΛ(l)=cosθocos2θi(αtcos2θt+αbcos2θb)+cos2θiG2(l,v)=0.5Λ(v)+Λ(l)

V-Cavity(V 型腔几何遮蔽函数) ​

V-Cavity模型最初的想法是通过若干不同尺度的V型表面来近似渲染材质,这个模型不是用法线分布来模拟一个微表面上的散射而是计算不同微表面上的散射并平均它们的贡献。如下图所示:

但是现在V-Cavity遮蔽函数用来的很少,大多数还是用的上面讲的Smith模型,虽然V-Cavity的可见法线的分布在数学上有很好的定义。 但它在物理上是不可行的,它所模拟的是一个非现实的入射角下的表面轮廓。

有两种法线:一种是背向的法线会被去除;另一种是不背向的法线,产生一个由 D(h)cosθh 加权的辐射度贡献。因此在投射到出射方向之前,微表面的权重完全如同它们投射到几何表面上一样。因此模拟的是一个几何上平坦的微表面:微表面可以扰动光的反射,但它们在几何上并不存在。因此这种微表面模型是不现实的,因为它的行为更像法线图而不是位移图,如下图所示。

对于单个微表面来说,高度可见的法线会比不太可见的法线占据更多的投影面积,因此有更高的贡献。然而这种情况不会发生在V-Cavity中,因为不同的法线是单独模拟的,并根据法线的分布进行加权。在加权中没有视图依赖性(除了背向法线被丢弃)。这就是为什么V-Cavity没有很好地纳入可见度的影响,而最终模拟的东西接近于法线图。

在掠射角(视线几乎贴着表面)下,真实的粗糙表面会因为凸起的遮挡,反射峰值会向视线方向偏移(即“偏移效应”)。但 V-Cavity 因为把每个微平面都当成“平等投影面积”来平均,导致 BRDF 的峰值强度过低,并且反射方向没有发生应有的偏移,看起来就像一张只会变颜色、但不会因为角度变化而产生立体凹凸感的“法线贴图”。

下图显示了由各向同性的Beckmann产生的BRDFs,其中有V-Cavity和Smith掩蔽阴影函数产生的BRDF,以及从一个程序化随机微表面模型散射的数值模拟中计算出来的结果。可以看到在Smith掩蔽阴影函数下,随着粗糙度的增加,分布向出射方向移动。对于非常高的粗糙度值BRDF甚至主要是反向散射。这种效应是可以预期的,因为面向出射方向的法线是最明显的。相比之下这种效应并没有出现在 从V-Cavity模型中没有出现。

F:菲涅耳反射(Fresnel Reflectance) ​

菲涅耳效应 ​

菲涅耳效应(Fresnel effect) 作为基于物理的渲染理念中的核心理念之一,表示的是看到的光线的反射率与视角相关的现象,由法国物理学家奥古斯丁·让·菲涅耳(Augustin-Jean Fresnel)率先发现。其具体表现是在掠射角(与法线呈接近90度)下光的反射率会增加。而上述的反射率,便被称为菲涅耳反射率。如下图。

下图也是一个菲涅耳效应的经典范例,垂直看向水面和在远处斜视水面,水面反射的光强是不同的。垂直看水面能够看清水下的情况,但是近乎平行的看向水面,反而反射特别的强烈。

需要注意的是我们在宏观层面看到的菲涅尔效应实际上是微观层面微平面菲涅耳效应的平均值。

也就是说,影响菲涅耳效应的关键参数在于每个微表面的法线和入射光线的角度,而不是宏观平面的法线和入射光线的角度。即:

  • 当从接近平行于表面的视线方向进行观察,所有光滑表面都会变得100%的反射性。
  • 对于粗糙表面来说,在接近平行方向的高光反射也会增强,但不够达到100%的强度。

并且材质的种类会影响菲涅耳效应的强弱,金属的菲涅耳效应相对较弱,因为其正常情况下的反射率就很高,并且随角度变化很小,对于非金属则相反,非金属的反射率平时就较低,在表面法向量方向的反射率仅为4%(介电质反射率),但当视线与表面法向量夹角很大的时候,在菲涅耳效应的作用下反射率可以接近100%,这一现象也导致了金属与非金属外观上的不同。

菲涅耳方程(Fresnel Equations) ​

物体的表面是周围介质(通常是空气)和物体材质之间的交界面。光与两种物质之间的平面的相互作用遵循由奥古斯丁·让·菲涅耳提出的菲涅耳方程(Fresnel Equations)。

菲涅耳方程用来描述光在不同折射率的介质之间的行为的方程,菲涅耳方程能解释反射光的强度、折射光的强度、相位与入射光的强度的关系。

对于一个给定的物质,菲涅尔方程可以理解为一个反射率函数 F(θi) ,只依赖了入射光角度。原则上 F(θi) 的值在可见光谱是连续变化的。出于渲染目的,它的值被当作一个RGB向量。函数 F(θi) 有以下特征:

  • 当 θi=0° ,光线垂直于表面入射也就是光线方向等于法线方向 l=n ,此时 F(θi) 的值 F0 可以被认为是物质特有的镜面反射颜色。这种情况被称为法线入射(normal incidence),F0 被称为** 0 度角入射的菲涅尔反射值。**
  • 随着 θi 的增加,光线射向表面的掠射角(glancing angles)逐渐增加, F(θi) 的贡献就会越明显,在 θi=90° 的时候达到1(白色)。

信息

简单来讲菲涅耳方程:

描述了物体表面在不同入射光角度下反射光线所占的比率。

光线以不同角度入射会有不同的反射率。相同的入射角度,不同的物质也会有不同的反射率。

下图展示了几种物质的 F(θi) 函数的可视化形式。曲线是高度非线性的,直到 θi=75° ,值都几乎没有改变,但是会快速到1。从 F0 到1的增长大部分是单调的,尽管一些物质(如图中的铝)在变白之前有轻微的下降。

在镜面反射中,出射角的大小和入射角一样。 这意味着入射光线以掠射角 到达表面——随着 θi 接近90°,同样会以掠射角抵达眼睛。 因此,反射率的增加主要体现在物体的边缘。可以从下图中体现。

Schlick 菲涅耳近似等式 ​

完整的菲涅耳方程是十分复杂的,除了菲涅耳方程的复杂性,菲涅耳方程还有其他的特性,这使得在渲染中很难直接使用它们。Schlick给出了菲涅耳反射率的近似值如下所示:

FSchlick(v,n)=F0+(1−F0)(1−v·n)5

其中 F0 即 0 度角入射的菲涅尔反射值, v 是视角方向, n 是法线方向。

在PBR中,我们通常使用微表面法线,也就是半角向量 h :

FSchlick(v,h)=F0+(1−F0)(1−v·h)5

这个函数是在白色和 F0 之间进行RGB插值。尽管很简单,但还是相当准确的。下图是实线表示完整的菲涅耳方程,虚线表示Schlick的近似。

上图包含几种与Schlick曲线差距挺大的材质,在转为白色之前表现出明显的 "凹陷"。事实上最下面一行的物质被选中是因为它们与Schlick近似值的偏差特别大。即使对这些物质来说产生的误差也是相当微妙的。在少数情况下可以使用Gulbrandsen给出的另一种近似方法,该方法对精确捕捉此类材料的行为非常重要。这个近似值可以实现与金属的完整菲涅尔方程的较好匹配,尽管它比Schlick的方程在计算上更加昂贵。一个更简单的选择是修改Schlick的近似方法,允许将最后一项提高到5以上的指数。这将改变 90° 处向白色过渡的 "尖锐性"。这可能会导致更接近的匹配。

当使用Schlick近似时, F0 是控制菲涅耳反射率的唯一参数。这很方便因为 F0 有一个定义明确的有效值范围 [0,1] ,很容易用标准的颜色选择界面来设置,并且可以用为颜色设计的纹理格式来制作纹理。此外 F0 的参考值可用于许多实际材料中。折射率也可以用来计算。通常假设 n1=1 ,这是空气折射率的近似值,用 n 代替 n2 来表示物体的折射率。这种简化给出了以下方程:

F0=(n−1n+1)2

这个方程甚至适用于复数折射率(如金属折射率)。折射率在可见光谱上有显著变化的时候,精确计算 F0 的RGB值首先要求计算 F0 需在波长的密集处进行采样,然后将得到的光谱向量转换为RGB值。

在一些应用中, Schlick近似更一般的形式为:

FSchlick(v,n)=F0+(F90−F0)(1−v·n)1p

这提供了对菲涅尔曲线在 90° 时过渡到的颜色的控制以及过渡的"锐度,使用这种更普遍的形式通常是出于增加艺术控制的成分。但在某些情况下,它也可以帮助匹配物理现实。正如上面所说的,修改方程中指数可以使某些材质变得更为适合。此外将 F90 设置为白色以外的颜色可以帮助匹配菲涅尔方程不能很好描述的材质,例如被细小灰尘覆盖的表面。


PBR工作流 ​

工作流中的核心内容便是贴图,不论是UE4还是Unity都支持将PBR的参数以贴图的形式传入引擎,我们可以根据一个物体同一mesh或不同mesh的不同区域的属性差异来控制贴图上的属性产生不同,而没有贴图的话,一个物体只能使用一种参数属性。

美术制作的albedo纹理一般都是sRGB空间的,因此我们要先转换到线性空间再进行后面的计算。根据美术资源的不同,AO纹理也许同样需要从sRGB转换到线性空间

两种工作流的贴图差异及一些公共贴图
两种工作流的贴图差异及一些公共贴图

Metallic/Roughness工作流-金属度/粗糙度 ​

该工作流是PBR工作流中最为通用的。

该工作流被定义为一组贴图通道,通道作为纹理被送入着色器的采样器里。M-R工作流的特定贴图有基色(BaseColor)、金属度(Metallic)和粗糙度(Roughness)。

PBR着色器还将会利用到环境光遮蔽(AO)、法线(Normal)和高度(Height)贴图进行视差映射等。

Base Color基色贴图

RGB-sRGB:表示贴图为RGB三色贴图,在sRGB空间

基色贴图保存了金属的反射率和非金属的漫反射颜色,包含RGB三通道。如果某一区域在金属贴图中表示为金属,就取其作为反射率值,否则取其作为反射波长颜色。也就是金属部分的 F0 与漫反射项中的 ρ

  • 贴图颜色代表非金属的反射颜色和金属的反射率值。
  • 除了微遮挡外,基色不应该包含照明信息。
  • 暗值不应低于30 sRGB(可容忍范围) - 50 sRGB(严格范围)。
  • 亮值不应超过240 sRGB。
  • 原始金属的反射率很高,在70-100%范围内,我们可以将其映射到180-255 sRGB。

Metallic金属度贴图

GrayScale - Linear 灰度图,在线性空间

金属度贴图就像一个Mask(遮罩),告诉着色器如何使用在Base Color中采样的数据(采用金属or非金属的计算)。在金属度贴图中,0.0(黑色0sRGB)表示非金属,1.0(白色255 sRGB)表示金属。 着色器采样到白色时就会将Base Color中的对应区域作为金属反射率值对待。

  • 金属度图完全可以做成一张非零即一的黑白图,允许极少量两头极端范围内的过度值存在
  • 金属值应在235-256 sRGB,它们的基色贴图值应该在180-255 sRGB范围内
  • 生锈的、被灰尘覆盖的金属,金属度贴图可以表示非金属和金属之间的混合状态,但如果值低于235 sRGB,基色中的值也需要降低。
  • 理论上不应出现大面积的位于中间范围的金属值,那样做是错误的,现实不存在这种材料,但是强行为了特殊效果亦可。

Roughness粗糙度贴图

GrayScale - Linear 灰度图,在线性空间

Roughness贴图描述了表面不规则性也就会影响Diffuse和Specular的占比。描述过反射方向将根据表面粗糙度随机变化。光向变了但总光强不变。粗糙的表面会有较大的、看起来较暗的高光。较光滑的表面会保持镜面反射集中,即使反射的光总量相同,也会显得更亮或更强烈。在Roughness贴图中,黑色(0.0)表示光滑表面,白色(1.0)表示粗糙表面。

M-R工作流的缺陷

M-R工作流的一个缺陷就是它会产生白色边缘的伪影,这个边缘是由于插值造成的,在材料之间的过渡区域是很明显的,在这里,电介质材料和非常明亮的金属之间存在着鲜明的对比。这个问题在S-G工作流也存在但是几乎不可见而且是黑色的伪影。这个现象在材料的过渡区域很明显,因为这一部分从非金属变成了非常亮的金属。S-G工作流中漫反射贴图金属为黑色因此产生了较黑的伪影。

M-R工作流下的伪影
M-R工作流下的伪影
S-G工作流的偏黑边缘
S-G工作流的偏黑边缘

贴图分辨率和纹素密度对边缘伪影的可见性有直接影响。 例如,如果用硬边刷来创建金属和非金属之间的过渡区域,则低分辨率会使边缘变软,从而加剧伪影。 这种低分辨率问题也是由未按比例缩放以提供足够的纹理像素密度的UV引起的。

贴图分辨率会影响M-R工作流中可能出现的白边。 确保UV提供足够的密度以匹配分辨率,以最大限度地减少伪影。

优点

  • 更容易创作,不容易因为提供错误的F0而导致结果错误(specular过亮)。
  • 纹理占用内存少,因为 Metallic 和 Roughnesss 贴图都是灰度图(单通道)。
  • 更广泛被使用

缺点

  • 不能控制非金属的 F0 ,大多数直接使用0.04代替。
  • 边缘伪影更明显,特别是在低分辨率下。

渲染方程 ​

理解完上面的 M-R 工作流的概念,可以得出实时渲染中 M-R 工作流的PBR方程是这样的:

Lo=∫ΩfrLicosθidωi=∫Ω(kdρπ+ksDG4cosθicosθo)Licosθidωi

其中, k 代表“分配系数”或“权重”,它唯一的作用就是保证能量守恒——即把入射光的能量合理地分配给“漫反射”和“镜面反射”这两个过程,防止反射出去的总能量超过入射光能量。

ks表示镜面反射权重:

在早期的经验模型中,需要用一个固定的 ks 来控制高光强度。但F在你给的**基于物理的渲染(PBR)**中, ks 被干掉了,原因在于:

  • 菲涅尔项F本身就是一个动态的“镜面反射比例”。它告诉你:当光线垂直照射时,反射率很低(约4%);当光线掠射时,反射率接近100%。
  • 既然 F 已经精确计算出了“有多少光被镜面反射了”,那么人为再乘一个固定的 ks 就是多余的。因此,把 ks 直接设为 1(即去掉它),由 F 全权负责镜面反射的权重。

故 ks=F

kd表示漫反射权重:

既然镜面反射走了 F 比例的能量,那么剩下的能量理论上可以用于漫反射。但这里还有一个更关键的物理事实:金属没有漫反射。

因此, kd 的计算必须同时考虑两个因素:

  • 非金属(电介质)部分:扣除掉被镜面反射走的能量,剩下 1−F 可以用于漫反射。
  • 金属部分:因为金属几乎不产生漫反射,所以我们要把金属度(metallic)考虑进去,彻底砍掉金属的漫反射贡献。

故 kd=(1−F)(1−metallic)

所以,最后的渲染方程可以统合成:

Lo=∫Ω((1−F)(1−metallic)ρπ+DFG4cosθicosθo)Licosθidωi

一般我们在游戏引擎中使用时, 往往会把漫反射中的 1−F 项忽略。因为当 F 的值比较大的时候,都是在边缘区域,这时镜面反射很强,漫反射的强度相对很弱,完全可以直接忽略。忽略漫反射中的 1−F 项,可以为全局光照等的计算带来极大的便利。这样我们最终的渲染方程为:

Lo=∫Ω((1−metallic)ρπ+DFG4cosθicosθo)Licosθidωi

Specular/Glossiness工作流-高光度/光泽度 ​

我习惯上把 Glossiness 光泽度称作为 Smoothness 光滑度

M-R 工作流通过“金属度”这个开关,将材质分为“金属”和“非金属”两大类,自动化处理了复杂的菲涅尔效应,优点是简单、物理正确。

而 S-G 工作流则将材质属性(如高光颜色和强度)的控制权完全交给了美术师。它提供了前所未有的灵活性,但也要求使用者对PBR原理有更深的理解,以避免创造出能量不守恒的“物理不正确”材质。

该工作流也被定义为一组贴图通道。S-G 工作流的特定贴图有漫反射(diffuse)、镜面反射(specular)、光泽度(glossiness)贴图。(这里的漫反射和镜面反射和传统渲染流程里的贴图不同)。PBR着色器也将会利用到环境光遮蔽(AO)、法线(Normal)和高度(Height)贴图进行视差映射等。

Diffuse 基色贴图

RGB-sRGB:表示贴图为RGB三色贴图,在sRGB空间

基色贴图保存非金属的反射颜色,包含RGB三通道。但它不包含任何反射值,因此金属区域将是黑色(0.0)。该贴图色调指南和 M-R 的 BaseColor 相同,但是金属值为0.0纯黑色,不需要受暗部范围的约束。

sRGB三色图,包含非金属的反射颜色,即漫反射项中的C。

  • 颜色表示非金属材料的反射颜色和原始金属的黑色(0.0)。
  • 除了微遮挡外,基色应该没有照明信息。
  • 暗值不应低于30 sRGB(容差范围) - 50 sRGB(严格范围),原始金属的黑色除外。
  • 亮值不应超过240 sRGB。

Specular 反射贴图

RGB-sRGB:表示贴图为RGB三色贴图,在sRGB空间

Specular贴图定义了金属和非金属的 F0 值。这和 M-R 工作流不同,因为 M-R 工作流把非金属F0规定为了4%(0.04),并且只能通过SpecularLevel节点修改。其实 F0 应该也来源真实世界的测量值。

金属表面的灰尘or生锈应该降低反射贴图的反射率值并且提高基色中的颜色值(不再是金属)。非金属一般 F0 设置为0.02-0.05,对应sRGB范围为40-75 sRGB。如果找不到材料特定的 F0 值,就用0.04代替。宝石是个例外,它的F0在0.05-0.17范围内。

  • 镜面反射贴图包含非金属的F0和原始金属的反射率值。
  • 非金属反射的光量比金属少。 普通非金属的F0值约为0.02-0.05。sRGB值应介于40-75之间,其重叠范围为0.02-0.05(线性)。
  • 常见的宝石在0.05-0.17(线性)范围内。
  • 普通液体在0.02-0.04(线性)范围内。
  • 原始金属的反射率值将在70-100%镜面反射率范围内,映射到180-255 sRGB。
  • 如果找不到特定材料的IOR(折射率)值,则可以使用0.04(0.04 - 塑料)。

Glossiness 光泽度贴图

GrayScale - Linear 灰度图,在线性空间

和M-R工作流中粗糙度相反,0.0表示粗糙,1.0表示光滑表面。

优点:

  • 边缘伪影不明显
  • 可自己控制非金属 F0 值

缺点:

+ F0 可能用错从而导致破坏PBR原则

  • RGB 贴图多,占用内存多

渲染方程 ​

在 S-G 工作流中由于没有了金属度的概念,所有细节的调节全依靠美术对贴图的把握,所以渲染方程去除了金属度:

Lo=∫Ω(ρπ+DFG4cosθicosθo)Licosθidωi

工作流转换 ​

S-G 到 M-R 的转换

  1. 依靠金属与非金属在diffuse和specular的差异获得一张Metallic贴图(金属在diffuse是黑的)
  2. 以 Metalic 图作为遮罩对 Specular 处理,得到金属的反射率 F0 值
  3. 覆盖到原本的 diffuse(diffuse + 金属 F0 = BaseColor)

M-R 到 S-G 的转换

  1. 使用 Metallic 图作为遮罩,对 BaseColor 处理,提取 BaseColor 中的金属部分,剩余的部分覆盖56度灰(0.04),得到 Specular 贴图
  2. 使用 Metallic 图作为遮罩,对 BaseColor 处理,将金属部分抠去,得到 Diffuse 贴图

工作流常用的其他通用贴图 ​

环境光遮蔽 AO 贴图

AO贴图定义了表面点可访问到的周围的环境光量,它只影响漫反射结果,不遮挡镜面反射。

某些引擎可以用屏幕空间反射来模拟局部反射,即屏幕空间下的环境光遮蔽(SSAO)

高度贴图 Height

高度图在渲染中可用于视差映射,为凹凸/法线贴图额外提供了更明显的深度,增强真实性。

法线贴图 Normal

法线贴图用于模拟表面细节,在PBR和非PBR工作流中用法相同。

不再多说