Crash Course in BRDF Implementation【译】

BRDF实现速成课

Crash Course in BRDF Implementation

by Jakub Boksansky

个人翻译并注释。

图1 使用本博文描述的BRDF的BEEPLE Zero-Day场景渲染结果[1]。使用Falcor路径追踪器[2],每像素两百万条光线。

1 Introduction

创造逼真的材质模型作为计算机图形学研究的一个主题已经有几十年了。多年来已经提出了许多模型——经验模型、基于物理的模型、基于物理表面测量数据的模型。早期的经验模型,例如Phong或Lambertian,在利用有限的计算资源求值的同时提供合理的结果。它们长盛不衰的关键之一是能够合理地再现一系列真实世界的材质,提供直观的参数供美工调整(而不是物理单位)。

用于有效求解场景中光传输的算法的进步,例如路径追踪、光子映射和其他方法,使我们能够基于光在有大量表面的场景中的多重交互求解复杂材质,同时隐式渲染焦散(caustics)、间接(全局)照明、软阴影等效果。光传输算法负责建立光在场景中传播的路径,材质模型则计算光如何与沿路径的表面相互作用。这种方法的形式模型由著名的渲染方程[3]描述,其中表面上材质的贡献由BRDF给出。

光栅化方法需要显示渲染焦散、间接(全局)照明、软阴影等效果。

本文中,我们将探讨游戏中常用的一些基本BRDF的实现及其背后的理论。许多现有的BRDF代码都经过高度优化,使用了许多近似和技巧,使其难以理解和修改。为了更容易研究现有的实现,我们提供了带有内部工作原理解释和全部已讨论BRDF的推导的代码。我们还将讨论BRDF在间接照明中的使用,例如蒙特卡罗路径追踪,其中需要重要性采样及确保能量守恒。这些通常不在游戏引擎中实现,因为光栅化不需要,但对于使用新兴实时光线追踪的应用程序来说是必需的。

2 So, what is the BRDF?

BRDF描述了给定入射光和出射光方向组合下的表面反射率(reflectance)。换句话说,它决定了当一定量的光从另一个方向入射时,有多少光在给定方向上反射,具体取决于表面的属性。例如,对于漫反射表面,BRDF指定在所有方向上都有少量反射,而对于镜子,所有光都在一个方向上反射。这个公式非常灵活,因为它使我们能够将表面材质的响应封装到BRDF实现及其参数设置中,独立于光传输的底层算法。注意,BRDF不区分直接和间接入射光,意味着它可用于计算场景中放置的虚拟光(局部照明)和从其他表面反射一次或多次的间接光(全局照明)的贡献。这也意味着BRDF独立于光照的实现,可以单独开发和编辑(BRDF只需要知道入射光的方向及其在着色点的强度)。 \[ L(P,\omega_o)=L_e+\int_{\Omega} \boldsymbol{f(P,\omega_i,\omega_o)} L_i(P,\omega_i)(\omega_i\cdot\hat{n}_p) d\omega_i \] 图2 渲染方程,BRDF以粗体高亮标记(这里使用latex公式,非图)

渲染算法和光照的独立性意味着我们可以将这种抽象的BRDF实现为“材质插件”,可以通过简单API访问,并且不同渲染器产生的视觉结果将相同。这导致了受技术美术人员青睐的材质库(如MDL[4])和通用材质创作工具(如Substance Designer)的出现。材质也可以独立于渲染算法进行研究和开发。

为了使这种抽象发挥作用,并使BRDF基于物理(逼真),BRDF应遵循以下原则:

  • Helmholtz互易性:入射和出射方向可以交换(因此称为双向),并且所得的反射率相同。注意,某些算法会跟踪来自相机的光线(路径跟踪),某些算法会跟踪来自光源的光线(光子映射),或两者均有(双向路径跟踪)。Helmholtz互易性确保所有类型的算法得到一致的结果。
  • 能量守恒:从表面反射的能量应等于接收到的能量(对于具有完美白色反照率(albedo)且无吸收的表面)

像Phong这样的早期经验模型通常不能满足这些要求,因此不适合真实感渲染。它们也无法正确再现许多材质的行为,如粗糙表面或金属,我们将在稍后更详细地讨论。一旦可编程且足够强大的GPU出现,从经验模型到基于物理模型的转变就会被推动,甚至对于实时渲染也是如此。

必须指出,一些成功的模型并不满足这些要求。 Disney模型[5]不是能量守恒的(但他们的后续文章[6]讨论了以后的项目的能量守恒),Autodesk模型[7]不一定满足Helmholtz互易性。迪士尼模型与单向路径追踪结合使用,缺乏互易性不会带来严重问题。完美的能量守恒也可能不是一个严格的要求,因为除非BRDF反射的能量多于它接收的能量,否则不太可能造成问题,除了能量损失的表面会变暗之外。最后,BRDF实现的高性能和美工的易用性可能比满足 BRDF 的所有理论要求更可取,尤其是在渲染内容完全受控时。

2.1 Construction of BRDF

游戏中使用的大多数BRDF由两个BRDF组成:漫反射(diffuse)波瓣和镜面反射(specular)波瓣。这种分解来自这样一个事实:当光与表面相互作用时,部分光被反射走(镜面反射BRDF),其余部分则散射到表面中。在材质内部,会发生更多的次表面散射,部分光最终再次集中表面并以随机方向离开材质(漫反射BRDF)。由于表面内部的散射,这种光被“过滤”并导致物体呈现出某一颜色。这也意味着光可以在表面下传播一段距离,将光带离入口点,从而产生“次表面散射”效果。常见的简化方法是忽略这种现象并将退出点设置为等于进入点。我们不会在本文中详细讨论次表面散射,推荐Pettineo[8]最近发表的一篇博文,该文提供了有关这个主题的精彩总结。

图3 分解为漫反射(左)和镜面反射(右)波瓣。BRDF值以蓝色显示,余弦加权BRDF贡献以红色显示(散射能量/离开辐射贡献)。

早在1924年,Pokrowski[9]就在光学文献中讨论了镜面反射和漫反射的分解。注意BRDF值(蓝色)和余弦加权的散射能量(红色)之间的重要区别。余弦项来自渲染方程,将在第3.1节中进一步讨论,但对于详细解释,我们推荐Graphics Codex[10]中有关材质的章节。

菲涅尔(Fresnel)方程描述了有多少光反射走(或散射进)材质。在掠射角下入射的光更有可能被反射,产生有时称为“菲涅耳反射”的效果(见图4)。菲涅耳项还负责对金属(metal)和电介质(dielectric)之间的区别进行建模。金属的吸收系数比电介质高得多,这意味着部分本来会反射的光被吸收了。由于这种吸收取决于波长,某些金属(例如金)的反射颜色取决于各个波长的吸收方式,而电介质的反射通常会呈现不变的光源颜色。关于菲涅耳项的更多细节将在4.3节中讨论。

图4 静止水面上的“菲涅尔反射”

注意,由于贡献漫反射BRDF的光已两次穿过材质边界,从技术上讲我们也应该应用菲涅耳项两次,但通常会创建漫反射BRDF来解决此问题。

我们已经提到,光在离开之前会在表面下传播一段距离,从而产生次表面散射效应。这假设行进的距离相对较短,并且光通过它进入的相同(或非常相似)的表面射出。然而,对于全透明或半透明材质,光可以穿过物体并从另一侧射出。更复杂的是,材质内部和/或粗糙表面的散射会导致光扩散(以随机方向传播,如通过磨砂玻璃、冰……)。透明度和次表面散射都可以使用“体积光传输”方法来渲染,该方法模拟光在体积内的传播方式。这些方法通常代价很高昂,其效果可以使用以下方法来近似:

  • BTDF(Transmittance):描述光线如何通过表面传输到另一侧(在物体边界上)的函数,由Jos Stam提出[11]
  • 参与介质(Participating media):由于光穿过物体而发生的简单消光。
  • 次表面散射算法:计算入射光的近似出口点。

注意,BTDF仅描述表面边界上的透射率,而不描述对象内部的透射率。光仅在进入和离开体积的点处与材质相互作用,就好像网格是空心壳一样(实际上,这就是网格的建模方式),忽略了介质内部可能发生的散射。在这种情况下,必须显式应用可能发生的消光。

到目前为止,我们已经讨论了BRDF和BTDF来描述光的反射和透射,但文献中还常见一个总称“双向散射分布函数”(BSDF或BxDF),表示BRDF、BTDF、BSSRDF等。

最后,我们所有的BSDF(镜面反射BRDF、漫反射BRDF和BTDF)必须以有意义的方式组合,最关心的是能量守恒,我们将在5.1节中讨论。

3 Implementing simple BRDFs

本节中,我们将描述众所周知的简单 BRDF——Lambertian、Phong等。我们还将定义一个接口,使我们能够实现更复杂的BRDF作为直接替代品。开始前,让我们借助图5定义一些常用的向量。

向量\(N\)是给定表面的着色法线(可能来自法线贴图)。向量\(V\),视线矢量,指定从着色点到观察者(相机)的方向。更一般地说,它指定出射光方向,在典型的路径追踪器中,这与光线方向相反。矢量\(L\)指向光源,或者指定入射光线反射的方向(根据上下文)。向量\(H\)是位于\(V\)\(L\)之间的半向量。它也等于第4节中讨论的微面模型的微表面法线。向量\(R\)是向量\(L\)沿法线\(N\)的完美(镜面)反射方向,向量\(T\)是三角形平面上垂直于\(N\)的切线。所有这些向量都被标准化。向量\(v\)\(l\)\(V\)\(L\)在三角形平面上的投影。

图5 BRDF求值常用的向量

3.1 Lambertian diffuse BRDF

Lambertian函数是用于漫反射项的最简单的BRDF函数之一,假设入射光在所有可能的方向上均匀散射(在表面法线周围的半球内),但它仍然是许多现实世界材质的行为的良好近似,求解速度非常快。因此,对于次级光弹射(与合适的镜面反射BRDF结合),它可能是一个不错的选择。它也是UE4引擎中使用的默认漫反射BRDF[12]。它不依赖于视线,因此对于涉及带有重投影的时间累积的算法(去噪、TAA 等)很友好。对于从第一原理开始的完整推导,Saikia写了一篇很好的文章[13],在这里我们将从Lambertian BRDF的定义开始:

次级光即secondary light,指来自被直接光照射的物体的散射光。直接光即primary light。

Saikia文章地址:Deriving Lambertian BRDF from first principles

\[ f_{Lambertian}(L,V)=\frac{diffuse\_reflectance}{\pi} \]

计算来自已知方向\(L\)(例如一个虚拟光源)并向观察者反射的光很直接:

1
brdfLambertian = (diffuseReflectance / PI) * dot(N, L);

通过这个,我们实现了BRDF接口的函数,称为eval。注意,我们已将余弦项从渲染方程(图 2)移至求解函数。这是一种常见的做法,因为在某些情况下,它可以与BRDF中使用的另一个余弦项抵消。此类实现有时被称为“内置余弦项的BRDF”,必须注意不要再次应用它。漫反射率(通常用符号\(\rho\)表示)指定有多少入射光在漫射波瓣中反射,通常根据“基色”(base color)参数计算得出,我们将在第4.3.1节中讨论该参数。有时也使用术语反照率(albedo),该术语可能含糊不清,因为反照率(定义为入射光和反射光的比率)可能取决于方向,尽管实践中它通常被指定为法向入射方向。

另一种常见的优化是将除以常数\(\pi\)移至预处理步骤,离线预划分漫反射纹理。但是,所有使用基色的函数都必须进行相应调整,其中一些函数可能不包含除以\(\pi\)的内容。另一种选择是预划分光强度(intensity),但对于光可能来自多次弹射的路径跟踪并不适用。为了让事情不那么混乱,我们在代码示例中的BRDF包含除以\(\pi\)的内容。关于这个主题的深入讨论可以在Lagarde的文章“to PI or not to PI”中找到[14]

目前为止,我们可以使用eval函数计算来自已知方向的光的BRDF贡献。对于大多数光传输算法(如蒙特卡罗路径追踪),需要另一个函数来确定我们应该在哪个方向追踪下一条光线。我们将此函数称为sample。它将采用一个随机数作为参数,并返回新的射线方向概率密度函数 (PDF) 的值,后者可以理解为选择该特定方向而不是其他可能方向的可能性。看看PDF在蒙特卡洛估计器中是如何使用的: \[ F=\frac{f(x)}{pdf(x)} \]

\(f(L,V)\)替换为Lambertian BRDF得: \[ I=\frac{f_{Lambertian}(L,V)}{pdf(L)} \]

\[ I=\frac{\frac{diffuse\_reflectance}{\pi}(N\cdot L)}{pdf(L)} \]

我们将值\(I\)称为采样权重,将在下一段中介绍它。 pdf的值取决于采样方法,并且它的选择可以是任意的,只要当BRDF非零时其PDF为正且非零即可。从最后一个方程可以看出,通过巧妙选择采样函数,它的PDF可以抵消一些BRDF项并简化计算。最基本的采样方法是在余弦加权半球中采样,\(PDF=\frac{N \cdot L}{\pi}\),这实际上是Lambertian和其他漫反射BRDF的极好选择。该采样方法的代码可以在Ray Tracing Gems[15]的 Sampling Transformations Zoo中找到,并在我们的代码示例中使用。这些方法通常通过在圆盘(disk)中生成一个随机点(通过扭曲两个随机数将正方形变形为圆盘)并将该点向上投影到半球上(仅通过计算Z分量)来工作。

为了展示PDF和BRDF项如何相互抵消,用余弦加权PDF代替得: \[ I=\frac{\frac{diffuse\_reflectance}{\pi}(N\cdot L)}{\frac{N \cdot L}{\pi}} \]

\[ I=diffuse\_reflectance \]

现在可以看出将余弦项从渲染方程移至BRDF求解中如何使其与\(\pi\)一起被PDF抵消,以使最终方程中仅保留反射率。当使用蒙特卡罗积分时,例如在路径追踪中,该值很有用,我们将其称为采样权重。当光线击中表面时,我们根据BRDF对反射光线的方向进行采样,该光线可以“携带”的光量必须通过该权重进行调整,以考虑表面的材质属性。

这种用与BRDF紧密匹配的PDF构建采样函数的方法不仅简化了代码,而且还减少了蒙特卡洛估计器的方差(噪声),因此是 BRDF 实现的一个重要方面。这种方法的一个很好的例子是使用VNDF(可见法线分布)进行采样,将在4.4节中讨论。

使用这些,我们现在创建了一个称为evalIndirect的优化函数,它将eval和sample组合成一个函数,返回采样方向及其权重。注意,它还消除了真实PDF的计算,这对于某些算法(例如多重重要性采样)仍然有用。为了解决这个问题,我们引入了名为pdf的新方法,它只返回采样给定方向的PDF。为了验证我们优化的evalIndirect返回的结果是否与sample和pdf一致,我们总是可以通过显式调用eval和pdf来实现evalIndirect,并检查值\(\frac{eval}{pdf}\)是否等于优化的evalIndirect函数的采样权重。

这4个函数定义了任何BRDF的接口,因此我们可以通过实现这些函数轻松实现不同的材质类型,并为不同的光传输算法重用代码。总结如下:

  • eval:对于已知的入射和出射方向求解BRDF
  • sample:采样BRDF以返回新的出射光线方向
  • pdf:返回采样给定出射方向的PDF值
  • evalIndirect:组合这些函数到一个优化版本中

3.2 Phong Reflection Model

过去常与Lambertian一起使用的另一种流行的反射模型由Phong提出[16],为实时渲染(他将其定义为>30FPS的渲染)提供了计算成本低廉的镜面反射高光。不要将Phong反射模型和Phong着色相混淆——Phong着色是一种用于实现平滑镜面反射高光的法线插值方法。虽然Phong最初的论文指出,他的反射模型是基于物理的(通过观察真实材质得到),但按照今天的标准它并不是基于物理的,因为它缺乏非镜面反射峰值(off-specular peak)、菲涅耳反射等现象。它的公式实现起来很简单(注意\((N \cdot L)\)是按照与Lambertian相同的方式添加到代码中的术语):

\[ f_{Phong}(L,V)=specular\_reflectance(R\cdot V)^{shininess} \]

1
brdfPhong = specularReflectance * pow(dot(R, V), shininess) * dot(N, L);

Phong着色为逐像素计算光照,Gouraud着色为逐顶点计算光照。

高光的宽度由指数(通常称为shininess或shine)控制,这是一个无界参数,但通常将其范围限制在10000左右。为了求解Phong模型,我们必须计算向量\(R\)(向量\(L\)沿法线反射),但正如Blinn在其优化版本[17]中所示,可以使用半向量\(H\)代替。为了在我们的代码中实现sample函数,我们使用了Ray Tracing Gems[15]中的方法。

Phong指数的典型取值:

10——"eggshell"

100——mildly shiny

1000——really glossy

10,000——nearly mirror-like

来自图形学虎书第五版

由于它既不能量守恒也不互易,因此将其称为这种形式的称为“Phong BRDF”在技术上是不正确的,但是,已经有人尝试修复这些缺陷并使其适合路径跟踪。Lafortune[18]和Lawrence[19]的文章展示了此类解决方案,包括重要性采样。人们已经创建了各种归一化项来使Phong模型能量守恒(例如,参见Giesen的文章[20])。Blinn推出了一个优化版本[17],并将Phong的镜面反射高光与Lambertian漫反射和恒定环境(ambient)项相结合,创建了Blinn-Phong反射模型,该模型成为实时应用程序的标准,直到被更先进的基于物理的模型所取代。目前,大多数已过时的旨在解释间接照明的环境项已被基于图像的照明、实时光线追踪或类似方法所取代。

Ashikhmin和Shirley[21]提出了基于Phong反射的最全面的模型之一,其特点是能量守恒的互易BRDF、各向异性反射,并与合适的漫反射BRDF和重要采样方法相结合。最近,Goanda[22]提出了另一种基于Phong的模型,该模型为了低计算成本进行了高度优化。Gotanda后来还推出了他的模型的改进分层版本[23]

3.3 Oren-Nayar Diffuse Reflectance Model

Oren和Nayar[24]提出了更先进的漫反射模型,该模型考虑了表面粗糙度。他们的模型基于这样的观察:当视线方向接近入射光方向时,粗糙表面反射的光比Lambertian模型预测的要多(这种效应称为反向散射(backscattering),这种非Lambertian表面的一个例子是月球)。Oren-Nayar模型通过推广朗伯模型并使其对表面粗糙度和视线方向敏感来解释这种现象。它是使用微面(microfacet)理论推导出来的,就和下一节将讨论的基于物理的镜面反射模型一样。

注意,当该模型与镜面反射BRDF结合使用时,底层的微面模型和分布函数可能不同(Oren-Nayar使用具有高斯斜率分布(Gaussian distribution of slopes)的V-cavity模型),并且粗糙度参数可能需要从一个到另一个转换或重新映射到合理的范围。由于Oren-Nayar模型中的粗糙度(表示为\(\sigma\))被定义为微面方向角的标准差,因此以角度单位指定。Lagarde关于Frostbite[25]的文章中的附录B建议的将Beckmann粗糙度和Oren Nayar粗糙度之间的转换为:

\[ roughness_{OrenNayar}=\frac{1}{\sqrt{2}}\arctan(roughness_{Beckmann}) \] Oren和Nayar提出了他们模型的几个版本,并进行了不同程度的简化。本文附带的代码使用最简单的“定性(qualitative)”模型: \[ f_{OrenNayar}(L,V)=\frac{diffuse\_refelctance}{\pi}(N \cdot L)(A+B\max(0,\cos(\varphi_v-\varphi_l))\sin\alpha\tan\beta) \]

\[ A=1.0-0.5\frac{\sigma^2}{\sigma^2+0.33};B=0.45\frac{\sigma^2}{\sigma^2+0.09};\alpha=\max(\theta_l,\theta_v);\beta=\min(\theta_l,\theta_v) \]

\(\theta_l\)\(\theta_v\)\(N\)\(L\)\(V\)之间的角,\(\varphi_v\)\(\varphi_l\)是这些向量之间的方位角(azimuth)(它们在法线定义的平面上的投影之间的角度)。我们的代码示例计算这些向量到法线平面的投影以获得正确的角度,但优化版本也消除了一些三角函数的使用(以平方根为代价),可以在PBR[26]中找到。

3.4 Disney (Burley) Diffuse Model

另一种流行且广泛使用的模型是Disney漫反射[5],有时也称为Burley漫反射。它是通过观察测量数据得出的经验模型,包括依赖于粗糙度的掠射逆反射(grazing retroreflection)现象。在这方面,它类似于Oren Nayar模型,但计算起来更简单。它基于Schlick的菲涅尔近似公式(参见第 4.3 节),并扩展了基本Lambertian模型,以根据粗糙度在指定范围(0.5到2.5)内增加或减少掠射角的反射率: \[ F_{D90}=0.5+2\ roughness\ \cos^2\theta_d \]

\[ f_{Disney}(L,V)=\frac{diffuse\_refelctance}{\pi}(1+(F_{D90}-1)(1-\cos\theta_l)^5)(1+(F_{D90}-1)(1-\cos\theta_v)^5) \]

由于该模型不是使用微面理论推导出的(与Oren-Nayar模型不同),此粗糙度参数没有与微面法线的统计分布相同的含义,并且可能与镜面反射BRDF使用的粗糙度不兼容。 Burley的论文建议将粗糙度重新映射为镜面反射BRDF粗糙度 (\(\alpha\)),如下所示: \[ \alpha=roughness^2 \] 此外,该模型能量不守恒,在能量守恒很重要的渲染器中使用可能会出现问题(如路径跟踪)。Lagarde在他关于Frostbite引擎渲染的优秀文章[25]中描述了该模型的一个版本,该版本显著提高了能量守恒,确保反射的能量不会多于与基于GGX的镜面反射BRDF结合时接收到的能量。

3.5 More diffuse BRDFs

图6 细微的差别。粗糙物体(粗糙度 = 0.5)上的漫反射BRDF的比较。从左到右:Lambertian、Oren-Nayar、Disney diffuse、Frostbite diffuse。

本文未涉及的另一种值得研究的漫反射BRDF是Hanrahan-Krueger[27]和Heitz-Dupuy[28]提出的。一个有趣的研究方向是寻找与广泛使用的基于GGX的微面BRDF良好结合的漫反射模型,以实现能量守恒和合理的视觉结果,例如Gotanda[29]的工作中发现的模型。

4 Microfacet Model

最近的许多BRDF都是基于微面理论的,该理论最初是在光学文献中提出,并在Blinn[17]以及Cook和Torrance [30]的文章中引入到图形社区。微面模型的动机是为了更好地理解和模拟来自粗糙表面的光反射,如测量所示,这与简单的Lambertian和菲涅尔反射预测的结果不匹配。例如,微面理论解释了称为非镜面峰值的现象,当偏离完美反射方向的方向达到最大反射率时,就会发生这种现象,如Torrance和Sparrow[31]所讨论的。

使用微面模型的BRDF通常被称为基于物理的,以表明它们是根据物理定律(光学)设计的,而不是根据观察经验进行设计的,尽管在计算机图形学中,我们经常使用简化和近似来使计算可行,并通过消除物理单位和参数使 BRDF更加实用。

这种简化的一个很好的例子是省略菲涅耳方程中使用的复杂折射率(index of refraction)。有时,“物理合理”一词也用于描述行为与观察到的现实世界材质相同的模型,但不一定是使用光学定律导出的。对于实时渲染,我们通常还使用几何光学和RGB三元组来表示光,而不是波动光学和光谱分布。权衡是此类渲染器无法考虑薄膜干涉引起的衍射和光偏振等效应。

图7 由许多微面(microfacet)组成的微表面(microsurface)(蓝色)。显示了一些选定微面的微表面法线\(H\)(红色)。几何表面及其法线\(N\)用灰色突出显示。注意,根据微表面模型,微表面本身不需要像该图像上的示例那样是连续的。

微面理论将表面建模为具有不同坡度和高度的微面的集合(见图 7)。微面变化的程度和方式由微面分布函数\(D\)描述(通常取决于粗糙度参数来控制表面外观)。这赋予了BRDF其形状,从而影响材质的最终外观。

通常,单个微面被假设为完美镜面,但任何BSDF也可以用于微面。注意,仅对几何表面进行建模,并且使用微面模型计算微面的效果,因此我们仅观察它们的聚合效果[1]

微面模型反射项定义为[30][31][32]\[ R=\frac{F(L,H)G(L,V,H)D(H)}{4(N \cdot L)(N \cdot V)} \] > 勘误:\(F(L,H)\)应为\(F(V,H)\)

其中\(N\)是着色法线,\(H\)是指向\(L\)\(V\)之间方向的半向量(\(H=\|L+V\|\))。它也称为微表面法线、高光向量或半程向量,之前被 Blinn[17]用于优化Phong着色计算。使用半向量的公式很方便,因为它也可以用于折射,如 Walter[32]所描述的,以及通过生成与给定正态分布函数\(D\)相对应的半向量来进行重要性采样,我们将在稍后讨论。所有这些术语将在下面的部分中更详细地讨论,这里只是一个简短的总结:

  • D Term:微面分布函数——告诉我们有多少微面面向方向\(H\),以便从方向\(L\)入射的光沿方向\(V\)反射。
  • F Term:菲涅耳项,计算给定入射角下从表面反射的光量。
  • G Term:几何衰减项(即本文后面的掩蔽和阴影(masking and shadowing )项\(G_2\) ),解释了微面的相互阴影(和掩蔽),有时也用于BRDF的归一化。
  • Denominator:来自使用完美镜面作为微面的微面模型的推导。注意,Cook和Torrance的原始论文[30]在分母中使用常数\(\pi\)而不是4。 Walter指出[32]这是由于\(D\)项的不同归一化造成的,并且最近的文献都同意使用常数4。

4.1 Distribution Term

分布项\(D\)使用微面normal distribution function (NDF),该函数计算微面的哪些部分面向方向\(H\),以便从方向\(L\)入射的光沿方向\(V\)反射。换句话说,假设各个微面之间没有发生遮挡,给定的\(L\)\(V\)方向之间可以反射多少光(下面讨论)。NDF不应与正态(即高斯)分布混淆,尽管它是NDF的可能实现之一(例如,由Torrance和Sparrow[31]使用)。

图8 GG-X分布的“Longer tail”,alpha值设为0.4。

在文献中可以找到各种分布函数。Beckmann NDF是广泛应用于光学领域的一个例子,也广泛应用于计算机图形学领域。Beckmann分布使用指定为微面均方根 (RMS) 斜率的直观粗糙度参数来控制其形状。另一个重要的NDF是由Trowbridge和Reitz提出的[33],并由Blinn于1977年推荐[17]。后来Walter将其重新推导为GG-X[2][32]。虽然Trowbridge-Reitz分布与GG-X相同并且早于它,我们将在本文中使用更简单的GG-X公式。与Beckmann NDF相比,它提供的镜面波瓣形状具有“Longer tail”,这意味着镜面反射峰值的衰减更慢,如图8所示。这与许多测量的真实世界材质更接近,因此GG-X在游戏中广泛使用,但Pixar描述着色的论文[34]中提到Beckmann分布仍然被使用。应该指出的是,由于图形社区贡献的许多优化和近似,GG-X的求解代价更小。

Beckmann分布定义为: \[ D_{Beckmann}=\frac{e^{\frac{-\tan^2(\theta_h)}{\alpha^2}}}{\pi\alpha^2\cos^4\theta_h} \] \(\theta_h\)是法线和半向量的夹角,\(\alpha\)是粗糙度。\(\alpha\)和微面的RMS斜率\(\sigma\)的关系是:\(\alpha=\sqrt{2\sigma}\)[26]。作为一个优化,我们可以使用Hoffman的文章[35]中提出的等价\(\tan^2(\theta_h)=\frac{1-cos^2\theta_h}{cos^2\theta_h}\)来消去正切函数,其中我们使用方便易得的\(\theta_h\)的余弦,通过\(N \cdot H\)就可计算: \[ D_{Beckmann}=\frac{e^{\frac{\cos^2\theta_h-1}{\alpha^2\cos^2\theta_h}}}{\pi\alpha^2\cos^4\theta_h} \] GG-X分布定义为: \[ D_{GGX}=\frac{\alpha^2}{\pi\cos^4\theta_h(\alpha^2+tan^2(\theta_h))^2} \] 该公式还可以进一步简化[35]。我们以与Beckmann分布相同的方式替换正切函数,并展开分母,然后可以将其表示为\(((\alpha^2-1)\cos^2\theta_h+1)\)平方。得到的优化公式为: \[ D_{GGX}=\frac{\alpha^2}{\pi((\alpha^2-1)\cos^2\theta_h+1)^2} \] 还有一个由Blinn使用Phong反射模型导出的NDF(称为Blinn-Phong NDF)[17],并且在 Walter 的论文[32]中也进行了讨论,他得出的结论是,对于某些粗糙度值,Beckmann和Blinn-Phong分布非常相似。这可以解释Phong着色模型的经久不衰,因为它能够准确地表示某些材质(尤其是塑料)。Walter 的论文[32]中还提供了Beckmann粗糙度和Phong指数之间的近似转换公式(该论文还表明,对于0.2左右的粗糙度值,Phong分布与 Beckmann分布几乎相同)。今天它可能看起来已经过时,但在加载使用Phong指数的材质的旧模型时(如流行的OBJ格式)可能会很方便。 \[ shininess=\frac{2}{\alpha^2}-2 \]

\[ \alpha=\sqrt{\frac{2}{shininess+2}} \]

正如我们所看到的,每个模型的粗糙度单位可能有很大不同。Torrance和Sparrow以及Oren-Nayar模型直接使用正态分布的标准差,Beckmann和Trowbridge-Reitz使用斜率的统计均方根,而Burley使用在合理范围内根据经验选择的值。当多个BRDF耦合在一起时(通常是镜面反射和漫反射BRDF),将美工指定的粗糙度仔细转换为底层BRDF使用的粗糙度单位非常重要。这种转换的一个很好的例子可以在Disney的Principled BRDF[5]中找到。正如已经提到的,他们将粗糙度参数重新映射到用于镜面反射BRDF的\(\alpha\)作为该值的平方。这使得粗糙度的变化在感知上呈线性,并且与底层漫反射BRDF兼容,但在计算\(D\)\(G\)项时必须注意再次对\(\alpha\)值进行平方(参见上面的公式)。或者,可以单独指定每个BRDF的粗糙度以实现更多的美术控制。

4.2 Geometric Attenuation Term

几何衰减项𝐺解释了由于微表面的几何形状导致的反射光衰减(attenuation),这种衰减是在某些微面相互遮挡时发生的。它有时也用作BRDF的归一化项。正如Torrance和Sparrow[31]所指出的,\(G\)项抵消了菲涅尔项,并且导致了某些粗糙度的材质当菲涅尔预测的高反射率因\(G\)项在掠射角处造成的显著阴影而减弱时出现的“非镜面峰值”,在更低角度处出现峰值反射率。

微表面的几何形状由用于建模其形状的轮廓(profile)给出。已经有两种重要的微表面轮廓:V-Cavity模型,假设微表面由一定宽度和高度的V形凹槽组成,以及基于斜率随机分布的Smith模型[36]。Cook-Torrance和Oren-Nayar在他们的BRDF中使用了V-Cavity模型,但正如Heitz的一篇文章[37]所示,Smith函数是使用这两个的正确模型,因此,本文中我们将只讨论Smith的\(G\)函数,定义为: \[ G_1(H,S)=\frac{1}{1+\lambda(a)} \]

\[ a=\frac{(H \cdot S)}{\alpha\sqrt{1-(H \cdot S)^2}} \]

\(S\)\(L\)或者\(V\)向量,\(H\)是微面法线,\(\lambda\)是特定于所选NDF的函数。由给定NDF推导\(\lambda\)的过程在Brown的论文[38]中描述,Walter[32]和Heitz[37]的论文中展示了各种NDF(Beckmann,GG-X,Blinn-Phong)的\(\lambda\)函数(和优化后的\(G_1\)项): \[ \lambda_{GGX}(a)=\frac{-1+\sqrt{1+\frac{1}{a^2}}}{2} \]

\[ \lambda_{Beckmann}(a)= \begin{cases} & \frac{1-1.259a+0.396a^2}{3.535a+2.181a^2} &,where\ a<1.6 \\ & 0&, where\ a\ge 1.6 \end{cases} \]

在这里,我们展示了Walter[32]导出的\(\lambda_{Beckmann}\)的有理逼近,而不是需要高昂计算误差函数的原始函数。通过将\(\lambda\)函数替换为通用\(G_1\)公式并简化表达式,可以针对特定NDF优化\(G_1\)的评估,如我们的代码示例中所做的那样。

Schlick[39]提出了Beckmann分布的另一种常见有理近似,同一篇论文中出现了著名的Schlick菲涅尔近似。然而,他近似了不同版本的Smith \(G\)函数[32][35][37],并不适合微面BRDF。

图9 当入射光被微表面(microsurface)(蓝色)上的其他微面(microfacet)阻挡时,就会出现阴影(shadowing)(左)。当反射光被另一微面阻挡时发生掩蔽(masking)(右)。

发生几何衰减是因为许多微面可以以某种方式定向以反射给定方向下入射的光,但最终只有最接近光源的微面成功反射光(其他微面被阴影,如图9所示)。这同样适用于反射光,反射光在离开微表面时可能会被其他微面掩蔽。Smith的\(G_1\)函数可用于阴影\(G_1(H,L)\)和掩蔽\(G_1(H,V)\),它们组合出掩蔽-阴影函数: \[ G_2=G_1(H,L)*G_1(H,V) \] 此组合公式假设遮蔽和阴影不相关,然而这是不准确的,因为微表面中更深的面被同时遮蔽和阴影的概率更高。这可以通过使用史密斯掩蔽-阴影函数的高度相关(height-correlated)形式解决: \[ G_2=\frac{1}{1+G_1(H,L)+G_1(H,V)} \] 任一形式的\(G_2\)都可以用于前面介绍的微面模型反射公式中的\(G\)项,但相关版本更可取,因为它只是稍微费一点计算并且更准确。Lagarde[25]的工作中可以找到GG-X分布的高度相关\(G_2\)的显著优化实现。通过将GG-X分布的\(G_1\)项代入的公式并化简,我们得到的表达式包含可以方便地与微面模型的分母相抵消的项,从而使计算成本更低。Hammon[40]提出了GG-X的另一个有趣的高度相关\(G_2\)近似,它的计算速度非常快,但会引入一些误差。对于Beckmann分布,我们的代码示例不提供此类优化而是直接计算所有项。

由于\(G\)项有效地指定了可见微面的比例,因此组合NDF和\(G_1\)项(\(D \cdot G_1\))给出了可见法线的分布[41],这是我们稍后将讨论的高效采样例程的基础。

到目前为止,我们假设被阴影或遮蔽的光会丢失,即使对于具有完全光滑微面的简化模型来说也是不正确的。这就是基于微面的BRDF发生能量损失的地方,不幸的是,微面之间的多重散射建模非常复杂且计算成本高昂,在实时渲染中通常被忽略。Heitz的论文[42]、d’Eon的Hitchhiker’s Guide[43]以及Imageworks使用的技术[44](也在RTR[45]中进行了讨论)详细介绍了该主题。

4.2.1 Anisotropic materials

表现出各向异性反射的材质(例如拉丝金属)可以使用NDF的各向异性版本及其相应的几何项进行建模。关于这个主题的深入讨论可以在 Heitz[37]和 Ward[46]的论文中找到。这些函数的计算通常比较复杂,并且由二元粗糙度值(两个垂直方向的不同粗糙度)控制。必须在切线空间中进行计算,以确保整个网格上各向异性镜面高光的方向正确且一致。关于Disney Principled BRDF的文章[5]展示了使用附加的各向异性参数的直观参数化(在文章最新版本的附录中)。这与标准粗糙度参数结合使用来计算合理范围内的2D粗糙度。

PBR第543页[26]中建议的更简单的解决方案是仍然使用NDF和\(G\)项的各向同性版本,但根据各向异性高光发生的方向调整粗糙度值。

4.3 Fresnel Term

菲涅耳项\(F\)决定了有多少光将从表面反射,有效地告诉我们有多少光将用于计算BRDF。剩余部分\(1-F\)将传递到底层材质层(如漫反射BRDF或透射BTDF)。到目前为止,我们的实现仅讨论了两层(镜面反射和漫反射),但可以创建具有多个层的复杂材质。菲涅耳项应在光从一层传播到另一层的每个界面上进行计算。为简单起见,各个层的厚度通常为零,但可以结合光谱渲染对一些厚度进行建模,当层界面比穿过它的光的波长薄时产生衍射(diffraction)(虹彩(iridescence))等效果。为了进一步讨论分层材质,我们推荐Autodesk的文章[7]和Jakob等人[47]、Weidlich和Wilkie[48]的作品。对于实现虹彩,Belcour和Parla最近发表的论文很有趣[49]

菲涅耳项取决于视线方向、表面法线、材料属性(折射率和消光系数),并由相对复杂的菲涅耳方程表示,但该方程也考虑了光的偏振。菲涅耳项对于掠射角始终接近统一,这意味着所有光都会被反射,尽管对于中间角度,如Cook和Torrance[30]所讨论的那样,会发生“color shift”。

Christophe Schlick引入了一种广泛使用的菲涅尔近似值,用于计算机图形学[39]。正如他指出的那样,完整的菲涅尔方程不仅计算成本昂贵,而且依赖于不直观的折射率\(n\)和消光\(k\),这不符合我们对可预测且易用的参数的需求。更复杂的是,完整的折射率是一个由实部(折射率)和虚部(消光系数)组成的复数,并且是按波长指定的。这不适合使用RGB三元组进行渲染。Naty Hoffman题为“被认为有害的菲涅尔方程”的文章[50]对该主题进行了进一步讨论,并得出结论除非使用光谱渲染完整的菲涅尔方程并不比Schlick近似更精确。

Schlick近似使用这样的观察结果:在90度下观察时,所有材质都表现出完美的反射率,并且我们可以仅使用一个参数——法线入射(0度——\(F_0\))下的表面反射率来近似完整的菲涅尔方程:

\[ F=F_0+(F_{90}-F_0)*(1-u^5) \] 其中\(u\)是法线与视线方向之间角度的余弦 (\(u=N \cdot V\)),并且\(F_{90}\)等于 1,除了下节讨论的情况。注意,折射率和消光系数已被去掉,但我们现在需要指定法线入射时的反射率\(F_{0}\)。使用Schlick公式的另一个结果是着色无法解释光的偏振。Mojzik等人在该领域完成了一项有趣的工作[51]

4.3.1 Specifying reflectance at normal incidence

消除\(n\)\(k\)简化了计算,但也导致失去对材质是否表现为电介质(低吸收系数——塑料、木材等)或导体(高吸收系数——铜、金等)的控制。这些之间的差异最好通过金属反射的色调(color tint)来观察(因为部分光谱被吸收),而电介质的反射则接手光源的不变颜色。正如Cook和Torrance[30]所指出的,金属反射是根据法线入射(表示为\(F_{0}\),有时也表示为\(R_{F0}\))的材质的基色着色的。利用这些知识,我们可以通过引入一个称为金属度[52](metalness)的参数来“修复”金属菲涅尔反射的颜色,该参数将\(F_{0}\)作为电介质的默认反射率和金属的基色之间的混合计算[53]\[ F_0=lerp(F_{0Dielectricss},base\_color,metalness) \] \(F_{0Dielectricss}\)的一个常用值是0.04(4%反射率),UE4[12]和Frostbite[25]均用此值。一些现实世界材质的反射率甚至更低,水为2%,但某些电介质材质的反射率也可能更高,钻石为0.18[35]。该值不会随材质而变化,在渲染器中是固定的,其选择对最终外观有重大影响。金属度还会减弱金属的漫反射率[30][52],这是根据基色计算得出的: \[ diffuse\_reflectance=base\_color*(1-metalness) \]

这个参数组合(基色和金属度)有时称为金属度工作流,并且具有限制性,无法为漫反射和镜面反射设置不同的色相(color hue)。另一种方法是镜面工作流,它可以直接指定漫反射和镜面反射率[54],而不是根据基色计算它。它需要更多的存储空间,但可以创建更广泛的材质,包括具有显著不同的漫反射和镜面反射率的非真实材料,从而提供更大的美术自由。

Schlick近似求\(F_0\)公式:

\[ F_0=(\frac{n1-n2}{n1+n2})^2 \]

空气折射率为1,取塑料折射率为1.5: \[ F_0=(\frac{1.5-1}{1.5+1})^2=0.04 \] 取水的折射率为1.33,同理可求得\(F_0=0.02\)

Metallic/Roughness工作流和Specular/Glossiness工作流对应的材质贴图不同。

Metallic/Roughness工作流 Specular/Glossiness工作流
Base Color贴图
(三通道)
(对于金属存\(F_0\),对于电介质存漫反射颜色(此时\(F_0\)设为0.04),混合材质可以认为同时存了这两种数据)
(除了微观遮蔽信息外不该含有任何光照信息)
Diffuse贴图
(三通道)
(对于金属存0,对于电介质存漫反射颜色)
(除了微观遮蔽信息外不该含有任何光照信息)
Metallic贴图
(单通道,相当于图层遮罩)
(0代表非金属,1代表纯金属,中间值代表锈蚀等中间状态)
Specular贴图
(三通道)
(存\(F_0\)
Roughness
(单通道)
(0代表平滑,1代表粗糙)
Glossiness贴图
(单通道)
(0代表粗糙,1代表光滑)

当贴图分辨率与纹素密度过小时,在金属与电介质交界产生白边(金属工作流)/ 黑边(高光工作流)。

Metallic/Roughness工作流 Specular/Glossiness工作流
优点 由于电介质的\(F_0\)规定为0.04,所以设计师在对其赋值时不易出错。如需调整,在大多实现流程中有控制器可以直接覆写这个值。
内存需求小。
兼容性广。
边缘效应不明显。
可以在Specular贴图中自由调整电介质的\(F_0\)
缺点 边缘效应较明显。 自由调整电介质的\(F_0\)可能导致错误,打破能量守恒,渲染不正确。
内存需求大。
需要设计师了解PBR。

对于某些材质,可能需要对从\(F_0\)到1的过渡进行更多控制,以减少Schlick近似的误差。\(F_0\)的RGB值已针对法向入射进行测量或计算,但对于某些材质,中间角度的色相可能会略有不同(例如,某些金属和涂层表面),或者当我们想要创建非真实的材质——unobtainiums 。Gulbrandsen[55]通过引入两个参数来控制反射率和他称为edge-tint的参数来解决这个问题。最近,Hoffman提供了一种改进的解决方案[50],通过引入表示为\(h\)的附加参数来控制edge-falloff,其中包括Lazanyi的误差项[56]以减少Schlick的近似误差。\(h\)参数可以理解为\(F_{82}\)[57]——82度的反射率,可以使用真实解决方案进行计算,也可以针对给定材质进行测量。

注意,\(F_0\)最初取决于表面两侧的折射率,并且通常假设表面被空气包围。如果情况并非如此(例如,在水下),则应相应调整\(F_0\)(例如,参见RTR第324页[45])。

上述提到的Lazanyi的修复重新引入了\(n\)\(k\)参数(但在Hoffman的解决方案中不需要)。如果需要,可以Polyanskiy[58]创建的优秀数据库中找到各种材质的这些,但是仍然按波长指定。

Lagarde提出了对Schlick菲涅耳项的一个有趣的优化,它使用球面高斯近似[59],并已在UE4[12]中使用: \[ F=F_0+(F_{90}-F_0)*2^{(-5.55473*u-6.983146)*u} \] 重要的实现细节是,菲涅尔项必须针对采样微面的法线(半向量)进行计算,而不是表面(或着色)法线,否则菲涅尔项基本上会忽略材料的粗糙度,并且物体会出现比实际情况更具反射性。

一个相关的问题来自于这样一个事实:法线贴图通常用于创建空洞、划痕或铜锈,美工会将底色变暗以减少这些特征的反射。由于菲涅尔项在90度时总是接近1,因此效果通常与美工的意图相反,并且空洞变得更具反射性,因为它们的法线与视线方向接近90度角。可能的解决方案之一是Schüler[60]引入的修复,它可以防止菲涅耳项在某些条件下接近1。我们不设置\(F_{90}=1\),而是将\(F_{90}\)计算为\(F_{90}=min(1,60\ luminance(F_0))\)。这会为反射率小于1/60的\(F_0\)值创建平滑但非常快速的从1开始的衰减。数字1/50或值\(F_{0Dielectric}\)的倒数也经常用在这个地方。我们知道现实世界中没有材质的反射率低于2%,因此这些低值可以被认为是为限制菲涅耳项而保留的。最后注意,当使用金属度计算\(F_0\)时,此方法不会产生任何效果,因为它是我们代码示例中默认的,因为没有\(F_0\)会小于\(F_{0Dielectric}\) 。为了完整性,我们在代码中提供了此修复,因为它对于使用不同方式计算\(F_0\)或由美工直接设置的情况非常有用。某些引擎提供的遮挡(occlusion)值可应用于镜面反射组件或用于Schüler的修复以获得类似的效果。注意当来自8位纹理时,只有少数\(F_0\)值会触发此修复。有关此主题的更多讨论可以在Hoffman的文章[61]的末尾找到。

4.4 Sampling the microfacet BRDF

有了所有这些知识,我们现在可以实现微面镜面反射BRDF的eval函数,请参阅本文附带的代码示例以获取完整列表。

为了高效实现采样方法,我们需要一个例程,对使用选定的\(D\)\(G\)函数构建的微面BRDF进行重要性采样。本文中我们使用Heitz提出的基于VNDF的采样[41],他还在另一篇文章[62]中提供了针对GG-X分布采样的改进和优化版本。

此采样例程使用局部空间中指定的向量,其中正Z轴与着色法线对齐(与大多数采样函数一样)。因此,我们必须在采样之前将我们的视线向量变换到这个局部空间,并使用这种变换的逆变换将得到的光向量变换回来。注意,许多渲染器在切线空间中进行着色,例如由于法线贴图,这与VNDF采样的局部空间类似但不相同。虽然切线空间可以围绕几何法线构建,但我们的局部空间围绕着色法线。因此,对于已经在切线空间中指定的向量也需要进行额外的变换。

单位四元数是一种表示旋转的优雅方式,因为我们的目标是找到着色法线和标准基向量\((0,0,1)\)之间的旋转,所以这种四元数的构造可以显著简化。因此,我们使用四元数旋转将向量变换到VNDF局部空间并变换回来(通过简单地反转四元数的轴即可找到逆变换)。

为了获得采样方向的权重,我们必须计算BRDF除以该采样方法的PDF,如3.1节中所述。得益于VNDF采样的构造,BRDF的许多项与PDF的项相互抵消,得到的权重仅为\(F*(\frac{G_2}{G_1(H,V)})\)\(G_2\)\(G_1\)的分数可以仅使用\(G_{1L}\)\(G_{1V}\)项重写,如Heitz关于漫发射BRDF的论文[28]的附录所示。因为这里的向量\(H\)被构造为恰好在\(L\)\(V\)之间,所以\(G_{1L}\)项等于\(G_{1V}\)项,我们可以像代码示例中那样进一步优化其计算。

VNDF采样的原始实现(在VNDF论文[41]的补充材料中提供)依赖于初始化期间的预计算数据,正如Wenzel Jakob[63]所指出的,Beckmann分布的版本包含不连续性,这可能会在使用低差异序列(例如蓝噪声)时导致问题,或对于诸如Metropolis的光传输算法。Jakob的论文包含一种改进的方法,可以修复这些缺陷,包括代码。Walter[32]提出了以前广泛使用的应该被提到的方法,但其效率低于VNDF,并且有生成可能具有非常大的采样权重的样本的不良特性,从而导致萤火虫(尽管对于Beckmann分布这可以使用“Walter’s trick”部分缓解,通过将粗糙度调整为\(\alpha^{’}=(1.2-0.2\sqrt{|N \cdot L|})\alpha\))。

5 Combining BRDFs

本文中我们为了将镜面反射BRDF与漫反射BRDF结合起来,使用了一种基于菲涅耳项将镜面反射和漫反射BRDF混合在一起的简单方法。注意,微面模型已经用\(F\)衡量镜面BRDF的权重,因此我们还用\((1-F)\)衡量漫反射BRDF的权重。这是受到分层材料的启发,其中光与每一层相互作用,菲涅耳项用于计算有多少光从表面反射(有助于镜面波瓣)以及有多少散射到表面里(有助于下层,在我们的例子是漫反射波瓣)。使用这种方法,任意BRDF可以一起使用并组合成多层[48],例如,广泛使用的基于微面的GG-X镜面反射BRDF与Lambertian或Disney漫反射BRDF的组合。更复杂的多层材质通常使用一个或两个镜面波瓣(其中额外的镜面波瓣模拟基础表面顶部的透明涂层)、具有可选次表面散射的漫反射BRDF、用于透射的BTDF。注意,分层材质中的每个 BRDF 本身应该是能量守恒的。

注意,为了计算漫反射BRDF层,我们需要知道镜面反射BRDF层的菲涅耳项。在代码中,我们对镜面反射BRDF的半向量进行采样并将其用于菲涅耳项计算,即使仅计算漫反射项也是如此。这开销可能很大,因此使用近似归一化项或表格数据可能是更好的方法。

更正确但也更严格的解决方案是使用同时包含漫反射和镜面反射模型的模型,这些模型被设计为很好地协同工作,例如Ashikhmin-Shirley[21]和Kelemen-Szirmay-Kalos[64]的模型。另一种选择是选择偏爱的BRDF并找到合适的漫反射BRDF,然后将其简单地求和。这种方法的一个例子是Lagarde对Disney漫反射所做的修改[25]。有关实践中使用的多层材质的更多信息,可参见关于《使命召唤》里的材质的演讲[65]

当组合多个BRDF时,所得的BRDF仍应遵循确保能量守恒和Helmholtz互易的基本原则,但这在实践中通常很难实现。

5.1 Energy Conservation

引言部分中提到的BRDF必须遵守的基本原则之一是要求能量守恒——表面反射的光不应多于其接收的光。此外,如果表面是完美的反射器(白色反照率),也不会发生能量损失。在实践中,即使对于从微面模型导出的基于物理的BRDF,通常也会发生一些能量损失。能量损失的主要来源是缺乏微面之间的多次反射。

过去在构建用于实时渲染的材质模型时,能量守恒问题经常被忽视,特别是在仅使用单次弹射照明时。对于路径光线追踪和全局照明算法,重要的是要确保光线从表面反射时不会产生能量,否则无法保证路径追踪器的收敛。

图10 White furnace测试显示具有完美能量守恒的BRDF(左)和具有能量损失的BRDF(右)。

一个易于实施且实用的能量守恒测试测试是white furnace测试[37],它是由各个方向的白光照射的白色球体的渲染结果。如果材质是能量守恒的,则球体将在白色背景下消失。任何差异都表明能量损失或增益(见图 10)。由于球体的渲染包含视线和光向量的所有可能配置,我们可以很好地了解能量增益或损失发生的角度。

6 Parametrizing the BRDF

在本节中,我们将总结所描述的BRDF参数如何与美工设置的材质属性相关。到目前为止,我们已经使用了以下参数:

  • 镜面反射BRDF
    • 法向入射的镜面反射率\(F_0\)
    • 82度角入射的镜面反射率\(F_{82}\)(可选)
    • 粗糙度
  • 漫反射BRDF
    • 漫反射率
    • 粗糙度

所有这些参数都可以直接设置以获得更大的美术自由度(作为单个值或从纹理加载),或者使用已知值(测量的或预先计算的)对材质进行建模,但通常会限制可以为反射率和粗糙度设置的值以使指定物理上合理的材质变得更加容易,并使材质属性更加紧凑以便存储。

我们没有直接使用漫反射和镜面反射率,而是使用基色和金属度参数来计算它们,如4.3节中所述。这确保了物理上不可能的材质不容易创建,并且还使我们能够模拟电介质和金属之间的区别。粗糙度值直接指定并为镜面反射BRDF重新映射,与Disney Principled BRDF中的方式相同(通过平方)。\(F_{82}\)仅与Hofmann改进的菲涅尔近似一起使用,对于改善具有已知\(F_{82}\)值的金属(例如铬或金)的外观特别有用。

6.1 Transmission

为了引入渲染半透明表面所需的透射效果,我们可以重用本文中已经讨论过的概念——即菲涅耳项、微面模型和分层材质。菲涅尔方程告诉我们有多少光被反射走并散射进表面,因此我们只需决定散射到内部的光的哪一部分将贡献给漫反射BRDF,而其余部分将贡献给BTDF。我们在材质模型中引入了一个新参数——漫反射概率或透射率(transmittance),它直接指定了有多少比例的散射光将分别贡献给漫反射BRDF和BTDF。注意,此参数与不透明度(opacity)不同,不透明度也会影响镜面反射BRDF,因为对于高透射率的材质我们在掠射角下仍然会得到菲涅耳反射,但零不透明度的物体则完全消失(无法影响镜面反射BRDF)。

光的透射部分可以根据Snell定律完美折射,也可以使用微面BTDF来创建粗糙折射,就像我们创造粗糙反射一样。Walter的论文[32]对该方法进行了广泛的总结,所得的折射模型近似于微面反射项。

7 Code Sample

本文附带的代码示例实现了所有讨论的BRDF。文件是用HLSL编写的,但也可以在C++环境中编译(添加支持HLSL类型和函数的库,例如GLM),并且可以轻松集成到光栅化器或路径跟踪器中。注意,可以针对将使用的所选BRDF组合进一步优化代码。

默认设置是基于GG-X的微面镜面反射BRDF与Lambertian漫反射BRDF的组合,它们经过高度优化并且可以很好地协同工作。可以通过调用evalCombinedBRDF来集成代码示例,以计算给定光源对给定点的贡献。evalIndirectCombinedBRDF根据所选BRDF(漫反射或镜面反射)采样新光线方向及其权重,以确定路径追踪器中下一条光线的方向。

8 Conclusion and Further Reading

在电影和游戏的制作中,创建基于物理且合理的材质模型比完全真实的材质模型更为重要。这意味着模型不会(太多)违反物理定律,但也可以通过暴露直观且易于理解的参数来实现足够的美术控制,即使是以省略折射率等物理量为代价。

看看各个模型暴露了哪些参数(及其范围)是很有趣的。Brent Burley撰写的一篇关于Disney Principled BRDF的文章[5]是一个很好的起点,其中讨论了参数、范围及其映射的选择,以及选择底层BRDF来构建成功的材质模型的技术决策。还有关于与MERL数据库中测量的现实世界材质进行比较的有趣讨论。它还提供了按时间顺序排列的值得研究的著名作品列表(但直到2012年他的论文发表为止),并且有一个 Github仓库[66],其中的代码可以免费获得。Burley于2015年发表了一篇后续文章[6],根据他们的模型的实际使用进行了更多改进。

对于游戏中使用的实现,有Lagarde (Frostbite)[25]、Karis (Unreal)[12]和 Lazarov (Call of Duty)[67]的出色作品。有趣的是能看出不同的开发人员对相同的问题得出不同的结论(例如,使用Lambertian还是Disney漫反射、选择GG-X还是Beckmann NDF分布,等等),这表明这些问题没有单一的通用答案。

关于基于物理的BRDF的更深入的理论背景,可以学习RTR[45]中的第9章(该章提供了更多相关工作的介绍)、PBR[26]中的第8章和第9章、Background: Physics and Math of Shading[35](来自Naty Hoffman)、Graphics Codex[10]、Eric Heitz关于BRDF的著作。基于物理的着色课程网页包含大量供进一步研究的资源。Substance PBR guide[54]也值得熟悉,以了解技术美术如何使用PBR材质。

关于电影制作和离线渲染中使用的BRDF,可以学习Burley[5][6]的文章、Arnold渲染器的描述[68] 、Pixar的渲染[34]以及Autodesk使用的材质[7]。这些通常比游戏中使用的BRDF向美工公开更多的参数(例如清漆(clearcoat)和光泽(sheen)参数)。

由于计算机图形学学术界和工业界使用的BRDF和材质术语经常令人困惑,并且许多术语被互换使用或错误使用,我们建议阅读McGuire等人为渲染工程师撰写的BSDF波瓣分类法[69]

为了获得使用什么特定值来模拟不同种类金属的灵感,Jarrod Hasenjager进行了一项精彩的材质研究[70]

另一个有趣的研究主题是开发专用BRDF来解决特定问题,例如皮肤、头发、纺织品、划痕表面、时变材质、水和许多其他特殊材质的渲染。

9 References

[1] M. Winkelmann, "Zero-Day, Open Research Content Archive (ORCA)," 2019. [Online]. Available: https://developer.nvidia.com/orca/beeple-zero-day.

[2] N. Benty, K.-H. Yao, P. Clarberg, L. Chen, S. Kallweit, T. Foley, M. Oakes, C. Lavelle and C. Wyman, "The Falcor Rendering Framework," 2020. [Online]. Available: https://github.com/NVIDIAGameWorks/Falcor.

[3] J. T. Kajiya, "The rendering equation," Proceedings of the 13th annual conference on Computer graphics and interactive techniques, pp. pp. 143-150, 1986.

[4] L. Kettner, M. Raab, D. Seibert, J. Jordan and A. Keller, "The Material Definition Language," 2015.

[5] B. Burley, "Physically Based Shading at Disney," 2012.

[6] B. Burley, "Extending the Disney BRDF to a BSDF with," 2015.

[7] I. Georgiev, J. Portsmouth, Z. Andersson, A. Herubel, A. King, S. Ogaki and F. Servant, "Autodesk Standard Surface," 2019. [Online]. Available: https://autodesk.github.io/standard-surface/.

[8] M. Pettineo, "An Introduction To Real-Time Subsurface Scattering," 2019. [Online]. Available: https://therealmjp.github.io/posts/sss-intro/.

[9] G. I. Pokrowski, "Zur Theorie der diffusen Lichtreflexion," pp. 66-72, 1924.

[10] M. McGuire, "Graphics Codex," [Online]. Available: http://graphicscodex.com/.

[11] J. Stam, "An illumination model for a skin layer bounded by rough surfaces," in Rendering Techniques, 2001.

[12] B. Karis, "Real shading in unreal engine 4," in Proc. Physically Based Shading Theory Practice 4, 2013.

[13] S. Saikia, "Deriving Lambertian BRDF from first principles," 2019.

[14] S. Lagarde, "PI or not to PI in game lighting equation," 2012.

[15] P. Shirley, S. Laine, D. Hart, M. Pharr, P. Clarberg, E. Haines, M. Raab and D. Cline, "Sampling Transformations Zoo," in Ray Tracing Gems, 2019.

[16] B. Phong, "Illumination for computer generated pictures," Communications of the ACM, 1975.

[17] J. F. Blinn, "Models of light reflection for computer synthesized pictures," in Proceedings of the 4th annual conference on Computer graphics and interactive techniques, 1977.

[18] E. P. Lafortune and Y. D. Willems, "Using the modified phong reflectance model for physically based rendering," 1994.

[19] J. Lawrence, "Importance Sampling of the Phong Reflectance Model," 2008.

[20] F. Giesen, "Phong Normalization Factor derivation," 2009.

[21] M. Ashikhmin and P. Shirley, "An anisotropic phong BRDF model," Journal of graphics tools, 2000.

[22] Y. Gotanda, "Physically Based Shading Models in Film and Game Production: Practical Implementation at tri-Ace," 2010.

[23] Y. Gotanda, "Practical Physically Based Shading in Film and Game Production: Beyond a Simple Physically Based Blinn-Phong Model in Real-Time," 2012.

[24] M. Oren and S. K. Nayar, "Generalization of Lambert's reflectance model," in Proceedings of the 21st annual conference on Computer graphics and interactive techniques, 1994.

[25] S. Lagarde and C. de Rousiers, "Moving Frostbite to Physically Based Rendering," 2014.

[26] M. Pharr, W. Jakob and G. Humphreys, Physically based rendering: From theory to implementation, Morgan Kaufmann, 2016.

[27] P. Hanrahan and W. Krueger, "Reflection from layered surfaces due to subsurface scattering," in Proceedings of the 20th annual conference on Computer graphics and interactive techniques, 1993.

[28] E. Heitz and J. Dupuy, "Implementing a Simple Anisotropic Rough Diffuse Material with Stochastic Evaluation," 2015.

[29] Y. Gotanda, "Designing Reflectance Models for New Consoles," 2014.

[30] R. L. Cook and K. E. Torrance, "A reflectance model for computer graphics," ACM Transactions on Graphics, 1982.

[31] K. E. Torrance and E. M. Sparrow, "Theory for off-specular reflection from roughened surfaces," Josa, 1967.

[32] B. Walter, S. R. Marschner, H. Li and K. E. Torrance, "Microfacet Models for Refraction through Rough Surfaces," Rendering techniques, 2007.

[33] T. S. Trowbridge and K. P. Reitz, "Average irregularity representation of a rough surface for ray reflection," JOSA, 1975.

[34] C. Hery and R. Villemin, "Physically Based Lighting at Pixar," 2013.

[35] N. Hoffman, "Background: Physics and Math of Shading," 2012.

[36] B. Smith, "Geometrical shadowing of a random rough surface," IEEE Trans. on Antennas and Propagation, 1967.

[37] E. Heitz, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs," 2014.

[38] G. Brown, "Shadowing by non-Gaussian random surfaces," IEEE Transactions on Antennas and Propagation, 1980.

[39] C. Schlick, "An inexpensive BRDF model for physically-based rendering," Computer graphics forum, 1994.

[40] E. J. Hammon, "PBR Diffuse Lighting for GGX+Smith Microsurfaces," GDC, 2005.

[41] E. Heitz and E. d'Eon, "Importance sampling microfacet-based BSDFs using the distribution of visible normals," Computer Graphics Forum, 2014.

[42] E. Heitz, J. Hanika, E. d'Eon and C. Dachsbacher, "Multiple-scattering microfacet BSDFs with the Smith model," ACM Transactions on Graphics (TOG), 2016.

[43] E. d’Eon, A Hitchhiker’s Guide to Multiple Scattering, 2016.

[44] C. Kulla and A. Conty, "Revisiting Physically Based Shading at Imageworks," 2017.

[45] T. Akenine-Möller, E. Haines, N. Hoffman, A. Pesce, M. Iwanicki and S. Hillaire, Real-time Rendering, CRC Press, 2019.

[46] G. J. Ward, "Measuring and modeling anisotropic reflection," 1992.

[47] W. Jakob, E. d'Eon, O. Jakob and S. Marschner, "A comprehensive framework for rendering layered materials," 2014.

[48] A. Weidlich and A. Wilkie, "Arbitrarily layered micro-facet surfaces," in Proceedings of the 5th international conference on Computer graphics and interactive techniques in Australia and Southeast Asia, 2007.

[49] L. Belcour and P. Barla, "A Practical Extension to Microfacet Theory for the Modeling of Varying Iridescence," 2017.

[50] N. Hoffman, "Fresnel Equations Considered Harmful," 2019.

[51] M. Mojzík, T. Skřivan, A. Wilkie and J. Křivánek, "Bi-directional Polarised Light Transport," EGSR, 2016.

[52] P. S. Strauss, "A realistic lighting model for computer animators," IEEE Computer Graphics and Applications, 1990.

[53] B. Smith, "Reflection Model Design for WALL-E and Up," 2012.

[54] Allegorithmic, "The PBR guide by Allegorithmic," 2018. [Online]. Available: https://academy.substance3d.com/courses/the-pbr-guide-part-2.

[55] O. Gulbrandsen, "Artist friendly metallic fresnel," Journal of Computer Graphics Techniques, 2014.

[56] I. Lazániy and L. Szirmay-Kalos, "Fresnel term approximations for metals," 2005.

[57] N. Hoffman, "Fresnel Equations Considered Harmful (slides)," 2019. [Online]. Available: http://renderwonk.com/publications/mam2019/naty_mam2019.pdf.

[58] M. Polyanskiy, "Refractive index database," [Online]. Available: refractiveindex.info.

[59] S. Lagarde, "Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel," 2012. [Online]. Available: https://seblagarde.wordpress.com/2012/06/03/spherical-gaussienapproximation-for-blinn-phong-phong-and-fresnel/.

[60] C. Schüler, "An efficient and Physically Plausible Real Time Shading Model," in ShaderX7, 2009.

[61] N. Hoffman, "Crafting Physically Motivated Shading Models for Game Development," 2010.

[62] E. Heitz, "Sampling the GGX distribution of visible normals," Journal of Computer Graphics Techniques, 2018.

[63] W. Jakob, "An Improved Visible Normal Sampling," 2014.

[64] C. Kelemen and L. Szirmay-Kalos, "A microfacet based coupled specular-matte BRDF model with importance sampling," 2001.

[65] M. Drobot and A. Micciulla, "Practical Multilayered Materials - Call of Duty Infinite Warfare," in SIGGRAPH, 2017.

[66] B. Burley, "Disney BRDF Explorer Github repository," 2012. [Online]. Available: https://github.com/wdas/brdf.

[67] D. Lazarov, "Physically Based Lighting in Call of Duty: Black Ops," 2011.

[68] A. Langlands, "Physically Based Shader Design in Arnold," 2014.

[69] M. McGuire, J. Dorsey, E. Haines, J. F. Hughes, S. Marschner, M. Pharr and P. Shirley, "A Taxonomy of Bidirectional Scattering Distribution Function Lobes for Rendering Engineers," in Workshop on Material Appearance Modeling, 2020.

[70] J. Hasenjager, "Material Studies: Metals," 2016. [Online]. Available: https://www.behance.net/gallery/35636521/Material-Studies-Metals.

[71] E. Heitz, "Generating Procedural Beckmann Surfaces," 2015.

[72] M. McGuire, "Tweet #1174191724694032387," 2019. [Online]. Available: https://twitter.com/CasualEffects/status/1174191724694032387.

[73] P. Shirley, Ray Tracing in One Weekend, 2018.

  1. 但是Heitz发表了一篇有趣的论文,该论文以程序方式生成Beckmann分布表面的网格以用于研究目的[71] ↩︎
  2. GG-X可能是“Ground Glass - roughness unknown”的缩写[72],以用于光学测量的抛光至一定粗糙度的磨砂玻璃板命名。 ↩︎

Crash Course in BRDF Implementation【译】
https://reddish.fun/posts/Article/Crash-Course-in-BRDF-Implementation-translation/
作者
bit704
发布于
2024年1月12日
许可协议