本文基于知乎Maple对brdf的文章,在此基础又收集了一些其它来源的关于brdf的文章,希望能够完全理解记忆相关知识
关于Jakub Boksansky的文章,看的过程中又去搜集了很多其它文章来理解,发现已经超出了我目前的知识厚度,因此只会简单的翻译一下我能理解的部分,感兴趣的可以自行看原文。
侵删~~~
文章地址:https://zhuanlan.zhihu.com/p/21376124
文章讨论了BRDF(Bidirectional Reflectance Distribution Function)双向分布反射函数
介绍了辐射度量学、BRDF定义、如何使用BRDF计算
scratchpixel关于brdf的教学内容偏少 基本上被maple的文章内容所覆盖 但是仍然可以起到补充的作用
地址:https://www.scratchapixel.com/lessons/3d-basic-rendering/brdf-linear-exposure/intro-brdf.html
Flux(辐射通量)、Irradiance(辐照度)与Radiance(辐射率)
结合上图理解
辐照度可以看作量化给定点的入射光子数,而辐射率是量化给定点从特定方向的入射光子数,辐射率可以代表从给定方向观察看到的点的颜色
其中给定点指的是很小的面积 \(dA\) 在这个极小的面积上辐射通量可以看做是不变的
而特定方向可以用一个非常小的圆柱体来表示 由于透视关系显示为小圆锥体
并且上图中的\(\theta\) 代表着通过该点的光子数占总光子数的比例 当圆柱体垂直时 全部光子通过该点 当圆柱体平行该点时 通过该点的光子数为0
根据辐照度与辐射率的单位或者具体的定义
我们可以得出 一个点的总辐照度 可以通过聚合打到该点半球上所有方向的入射光线辐射率:
而当我们只考虑一个方向时 就得到了辐照度的微分表示:
而BRDF定义了入射光辐照度 和 反射光辐射率的比值:
我们经过积分 就可以得到从特定方向观察到的某个点的颜色 即特定方向该点的辐射率:
Jakub Boksansky是一位来自英伟达的图形程序员,他的博客里实现了brdf 并且也是 Ray Tracing Gems II Chapter 14 的配套代码
地址:https://boksajak.github.io/blog/BRDF
BRDF 描述了给定的入射光和出射光方向组合的表面反射率。换句话说,它决定了当一定量的光从另一个方向入射时,有多少光在给定方向上反射,具体取决于表面的特性。这个公式非常灵活,因为它使我们能够将表面材料的响应封装到 BRDF 实现及其参数设置中,这独立于光传输的底层算法。请注意,BRDF 不区分直接和间接入射光,这意味着它可用于计算场景中放置的虚拟光(局部照明)和从其他表面反射一次或多次的间接光(全局照明)的贡献。这也意味着BRDF独立于灯光的实现,可以单独开发和编写(BRDF只需要知道入射光的方向及其在阴影点的强度)。
渲染算法和光照的独立性意味着我们可以将这种抽象的 BRDF 实现为“材质插件”,通过简单的 API 访问,而且不同渲染器产生的视觉结果将是相同的。
为了使BRDF实现的效果更加逼真,一般要求提出的BRDF模型要满足以下两个条件:
Helmholtz reciprocity------入射和出射方向可以交换(因此称为双向),并且所得反射率将相同。请注意,某些算法会跟踪来自相机的光线(路径跟踪),其他算法会跟踪来自光源的光线(光子映射)或两者都追踪(双向路径跟踪)。Helmholtz reciprocity确保所有类型的算法得到一致的结果。
Energy conservation(能量守恒)------对于具有完全白色反照率且无吸收的表面,从表面反射的能量应等于接收到的能量
但是一些成功的模型并不满足这些要求。 Disney 模型不是能量守恒的,而 Autodesk 模型不一定满足Helmholtz reciprocity。迪士尼模型与单向路径追踪结合使用,缺乏双向性不会带来重大问题。完美的能量守恒也可能不是一个严格的要求,因为除非 BRDF 反射的能量多于它接收到的能量,否则不太可能造成问题,除了能量损失带来的表面变暗。
矢量 𝑁 是给定表面的着色法线(可能来自法线贴图)。矢量𝑉,,指定从着色点到观察者(相机)的方向,更一般地说,它指定出射光方向,在典型的路径追踪器中,这与光线方向相反。矢量 𝐿 指向光源,或者根据上下文指定入射光线反射的方向。向量 𝐻,半向量位于 𝑉 和 𝐿 之间。它也等于第 4 节中讨论的微表面模型的微表面法线。矢量 𝑅 是矢量 𝐿 沿法线 𝑁 的完美镜面反射方向,矢量 𝑇 是三角形平面上垂直于 𝑁 的切线。所有这些向量都被标准化。向量 𝑣 和 𝑙 是 𝑉 和 𝐿 在三角形平面上的投影。 注意\(\varphi_{v} \theta_{v}\) 与\(\varphi_{l} \theta_{l}\) 是 𝑉 与 𝐿的球面坐标表达。
朗伯函数是用于漫反射项的最简单的 BRDF 函数之一,它假设入射光在所有可能的方向上均匀散射(在表面法线周围的半球内),即是完美的漫反射。
定义为:
考虑余弦项(代表着入射光方向带来的能量的损失):
其中\(diffuseReflectance\)代表着有多少光被反射 \(PI\)是球面积分 保证能量守恒的结果
Phong引入了过去常与 Lambertian 一起使用的另一种流行的反射模型,为实时渲染提供计算成本低廉的镜面高光。不要将 Phong 反射模型与 Phong 着色相混淆——Phong 着色是一种用于实现平滑镜面高光的法线插值方法。虽然 Phong 的原始论文指出,他的反射模型是基于物理的,但按照今天的标准,它并不是基于物理的,因为它缺乏非镜面峰值、菲涅尔反射等现象。
定义为:
高光的宽度由指数(通常称为光泽度shinines)控制,这是一个无界参数,但通常将其范围限制在 10000 左右。为了实现 Phong 模型,我们必须计算向量 𝑅 ,但正如 Blinn 在其优化版本中所示,可以使用半程向量 𝐻 代替
由于它既不能量守恒也不双向,因此将其称为这种形式的“Phong BRDF”在技术上是不正确的,但是,已经有人尝试修复这些缺陷。 Blinn 推出了一个优化版本,并将 Phong 的镜面高光与朗伯漫反射和恒定环境项相结合,创建了 Blinn-Phong 反射模型,该模型成为实时应用程序的标准,直到被更先进的基于物理的模型所取代
关于其它修正的Phong模型的BRDF 可自行到原文的参考文献查阅
Oren 和 Nayar 引入了更先进的漫反射反射模型,该模型考虑了表面粗糙度。他们的模型基于这样的观察:当视线方向接近入射光方向时,粗糙表面反射的光比Lambertian模型预测的要多(这种效应称为反向散射,这种非Lambertian表面的一个例子是月球)。 Oren-Nayar 模型通过推广朗伯模型并使其对表面粗糙度和观察方向敏感。
Oren 和 Nayar 提出了他们模型的几个版本,并进行了不同程度的简化。本文附带的代码使用最简单的“定性”模型:
粗糙度。。。。。
另一种流行且广泛使用的模型是 Disney 漫射模型,有时也称为 Burley 漫射模型。它是通过观察测量数据得出的经验模型。它类似于 Oren-Nayar 模型,但评估起来更简单。它基于 Schlick 菲涅尔近似公式(见后),并扩展了基本朗伯模型。
定义:
使用微面模型的 RDF 通常被称为基于物理的,以表明它们是根据物理定律(光学)设计的,而不是根据观察经验进行设计的,尽管在计算机图形学中,我们经常使用简化和近似来使计算简化。
一个著名的微表面模型Cook and Torrance :
其中各参数含义简述如下:
D 项 – 微面分布函数 – 告诉我们有多少微面面向方向 𝐻,该方向可以将从方向 L 传入的光沿着方向 𝑉 反射
F 项 – 菲涅尔项,评估给定入射角有多少光会从表面反射
G 项 – 几何衰减项(也称为掩蔽和阴影项),说明微表面的相互遮蔽,有时也用于 BRDF 的标准化
分母 – 来自使用完美镜面作为微表面的微表面模型的推导
常用的NDF 本文介绍了两种
一种是Beckmann:
其中\(\theta_{h}\)代表着法线与半程向量的夹角 \(\alpha\)代表着材质的粗糙率
一种是GGX:
对于上面的两个公式 我们可以将tan角使用余弦角来表示 因为余弦更加容易计算 只需要一个点积:
两者随着余弦角度变化的对比图:
从上图中可以看出 GGX有着更长的尾巴,意味着镜面高光下降的更为缓慢,更符合现实,因此GGX被更为广泛的应用
还有一个由 Blinn 使用 Phong 反射模型导出的 NDF(称为 Blinn-Phong NDF),并且在 Walter 的论文中也进行了讨论,他得出的结论是,对于某些粗糙度值,Beckmann 和 Blinn-Phong 分布非常适合相似的,这可以解释 Phong 着色模型的长寿,因为它能够准确地表示某些材料(尤其是塑料)。
正如我们所看到的,每个模型的粗糙度单位可能有很大不同。 Torrance 和 Sparrow 以及 Oren-Nayar 模型直接使用正态分布的标准差,Beckmann 和 Trowbridge-Reitz 使用斜率的统计均方根,而 Burley 使用在合理范围内根据经验选择的值。当多个 BRDF 耦合在一起时(通常是镜面反射和漫反射 BRDF),将艺术家指定的粗糙度仔细转换为底层 BRDF 使用的粗糙度单位非常重要。
几何衰减项 𝐺 解释了由于微表面的几何形状而导致的反射光衰减,这种衰减是在某些微面相互遮挡时发生的。
𝐺 项抵消了菲涅尔项,并导致了菲涅尔预测的高反射率因掠射角处的 𝐺 项产生的显着阴影而减弱,对于某些粗糙度的材料会出现“非镜面峰值”,即峰值反射率出现在较低的角度
微表面的几何形状由用于模拟其形状的轮廓给出。有两种重要的微表面轮廓:V-Cavity模型,假设微表面由一定宽度和高度的V形凹槽组成,以及基于斜率随机分布的Smith模型。 Cook-Torrance 和 Oren-Nayar 在他们的 BRDF 中使用了 V-Cavity模型,但正如 Heitz 的一篇文章展示的,Smith 函数是更为正确的模型,因此,我们将只讨论 Smith 的𝐺函数,定义为:
其中 𝑆 是 𝐿 或 𝑉 向量,𝐻 是微表面法线,λ 是特定于所选分布函数 (NDF) 的函数:
在考虑微表面的入射光与反射光时。我们可以发现两者均会发生遮蔽现象,所以我们的G函数会由两部分组成
如果我们考虑到微表面更深的面被阴影和遮蔽的可能性更高,还有一种更为精确的G函数提出:
任一形式的 𝐺函数 都可以用于前面介绍的微面模型反射公式中的 𝐺 项,但后一种更可取,因为它只是稍微贵一点但是更准确。
菲涅耳项𝐹决定了有多少光将从表面反射,有效地告诉我们有多少光将有助于评估 BRDF。剩余部分 (1 − 𝐹) 将传递到底层材料层(例如,漫反射 BRDF 或透射 BTDF)。到目前为止,我们的实现仅讨论了两层(镜面反射和漫反射),但可以创建具有多个层的复杂材质。菲涅耳项应在光从一层传播到另一层的每个界面上进行评估。为简单起见,各个层的厚度通常为零,但可以结合光谱渲染对某些厚度进行建模,以产生诸如当层界面比穿过它的光的波长薄时发生的衍射(虹彩)等效果。
Christophe Schlick 引入了一种广泛使用的菲涅尔近似值,用于计算机图形学 。正如他指出的那样,完整的菲涅尔方程不仅计算成本昂贵,而且依赖于不直观的折射率 𝑛 和消光 𝑘,这不符合我们对可预测且易于使用的参数的需求。更复杂的是,全折射率是一个由实部(折射率)和虚部(消光系数)组成的复数,并且是按波长指定的。这不适合使用 RGB 三元组进行渲染。 Naty Hoffman 题为“被认为有害的菲涅尔方程” 的文章对该主题进行了进一步讨论,并得出结论,除非使用光谱渲染,否则完整的菲涅尔方程并不比 Schlick 近似更精确。
Schlick 近似使用这样的观察结果:在 90 度以下观察时,所有材料都表现出完美的反射率,并且我们可以仅使用一个参数 ------ 法线入射(0 度到F0度)下的表面反射率来近似完整的菲涅尔方程:
其中 𝑢 是法线与观察方向之间角度的余弦 (𝑢 = 𝑁 ∙ 𝑉),并且 \(F_{90}\) 等于 1,除了接下来讨论的情况。请注意,折射率和消光系数已被消除,但我们现在需要指定从法线入射时的反射率\(F_{0}\)
消除折射率和消光系数简化了计算,但也导致失去对材料是否表现为电介质(低吸收系数——塑料、木材等)或导体(高吸收系数——铜、金等)的控制。正如 Cook 和 Torrance 所指出的,金属反射是根据法线入射材质的基色着色的(表示为 \(F_{0}\))。利用这些知识,我们可以通过引入一个称为金属度的参数来“修复”对于金属菲涅尔反射的颜色,该参数将 \(F_{0}\) 计算为电介质的默认反射率和金属的基色之间的混合:
\(F_{0Dielectrics}\)的常见选择是 0.04(4% 反射率),例如 UE4 和 Frostbite 使用的
在本文中,为了将镜面 BRDF 与漫反射 BRDF 结合起来,我们使用一种基于菲涅耳项的简单方法,将镜面反射和漫反射 BRDF 混合在一起。请注意,微面模型已经用 𝐹 衡量镜面 BRDF 的权重,因此我们可以用 (1 − 𝐹) 衡量漫反射 BRDF 的权重。这是受到分层材料的启发,其中光与每一层相互作用,菲涅耳项用于评估有多少光从表面反射以及有多少散射到表面。