Chapter 9 – Physically Based Shading 基于物理的着色

9.3 BRDF

最后,PBR(基于物理的渲染)实际上就是计算进入camera的那些光线的radiance。我们在第八章中学习的radiance的定义,对于一个确定的光线,我们需要计算Li(c,-v),其中c表示camera的位置,-v表示进入camera的光线的反方向。我们使用-v是因为,Li()中的方向向量必须要背离其中的坐标点,也就是说需要背离camera的坐标点;其次,视野向量v永远表示指向camera的向量。

在渲染中,场景通常被模拟为介质中的一组物体。这里我们所说的介质通常指的是空气,其并不会显著影响射线的radiance,因此在渲染中可以忽略。但有时射线穿过的截止可能会通过散射或者吸收来影响他的radiance。而这一类介质被称为participating media(参与介质),因为我们认为这些介质将会参与到光线的运动。我们在第十四章中将会详细学习participating media。在本章节中,我们假设并没有participating media,所以进入camera的radiance等于camera方向上距离最近的物体所射出的radiance:

上述等式中,p表示视野向量与距离camera最近的物体的表面的交点。

根据上述等式,我们的目标就是要计算Lo(p,v)。这一计算公式就是所谓的基于物理的着色模型。有时radiance直接由物体表面发射。更多的情况是radiance由某一点射出再经由物体表面反射至视野射线。在本章节中我们并不会考虑透明度(第十四章中学习)以及globa subsurface scattering(第十四章中学习)。换句话说,我们需要考虑的是局部的反射现象(local reflectance phenomena),其只是将光线指向我们正在着色的采样点并经由该点射向camera。这些现象包括表面反射和local subsurface scattering,而影响这些现象的只有入射光线方向l和射出的视野向量的方向vBRDF(bidirectional reflectance distribution function,双向反射率分布函数)将用来对局部反射率进行量化,其表达式为f(l,v)。

最初,BRDF用于统一的表面。也就是,表面上每一处的BRDF都是相同的。但是,现实世界中的物体(也包括我们在游戏中渲染的)几乎没有一致的材质属性。即使一个物体只由单一材质组成,例如,银质雕像,也会有划痕,污点,这些都会造成其表面上不同的视觉外观。技术上来说,基于不同的坐标来求出不同的BDRF的函数被称为spatially varying BRDF(SVBRDF)或者spatial BRDF(SBRDF)。但是实践中,我们还是会用BRDF来表示前两者。

入射与射出方向都有两种角度限制。通常这两个角度由θ和Ф表示,θ表示基于表面法线n纵向的角度,Ф表示横向的角度。大多数情况下,BRDF是一个由4个标量组成的函数。同向的BRDF是一个重要的特殊例子。只要入射光线和射出光线绕着法线旋转,角度并不会改变。下图展示了这种情况。同向BRDF函数由三个标量组成,因为我们只需要一个角度Ф表示光源与camera之间的旋转。也就是说,如果物体表面是统一的同向BRDF,那么只要光源与camera的相对位置保持不变,无论怎么旋转光源和camera,都不会改变BRDF。

上图中的BRDF,横向角度ФiФo都是基于一个确定的切线向量t。而同向BRDF只需要使用一个Ф即可。

由于我们忽略荧光现象以及磷光现象,因此可以假设某一波长下的入射光将以相同的波长被反射。而反射光的数量将根据波长的改变而改变,其可以通过两种方式进行模拟。将波长作为BRDF中额外的输入变量,或者我们将BRDF的返回值作为光谱分布值(RGB)。前者有时会用于离线渲染,在实时渲染中常常使用第二种方法。因在实时渲染中,我们一般会将光谱分布表示为RGB,这意味着BRDF需要返回一个RGB值。

为了计算Lo(p,v),我们将BRDF放入reflectance equation(反射率等式)

上述等式中的l∈Ω表示我们对位于物体表面上方(表面的法线方向)的半球进行向量l进行积分。需要注意的是向量l表示半球内的所有方向——其并不是一个由光源位置指向采样点的方向。这意味着任何入射方向上的光西安都会影响radiance。我们使用dl表示微分的围绕l的立体角。

总的来说,反射等式表示射出的radiance等同于入射的的radiance乘以BRDF乘以向量nl的点乘的积分。

在本章节之后的内容中,我们将会省略Li()与Lo()中的坐标点p,并将反射等式简化为:

当我们计算反射等式时,通常我们会使用球体坐标Фθ作为半球的参数。体积角dl等于sinθiii。使用角度参数之后,反射等式将转换为:

等式中的角度θiФiθoФo对应上图中的各个角度。

有时使用不同的参数能使得等式更为简单,我们使用μi=cosθi,μo=cosθo作为参数而不是直接使用角度θiθo。之后体积角的微分dl将等于dμidμo。将(μ,Ф)作为参数之后,积分方程将变为:

只有当光线向量l和视野向量v都位于物体表面的上方时,BRDF才有意义。当光线向量l位于物体表面的下方时,将BRDF乘以0或者完全不计算BRDF的值可以避免这种情况。但是如果视野向量位于物体表面的下方呢?也就是说n·v的值为负数?理论上说这种情况永远不会发生。物体的表面将背离camear,因此物体的表面是不可见的(背面剔除)。但是,在实时渲染中我们常常会使用插值顶点法线和法线映射,这两个技术可能导致视野向量v位于表面的“下方”。因此对于这种情况,我们会将n·v的值clamp为0或者使用其绝对值来计算出BRDF,但是这两种方法都会造成一些问题。寒霜引擎的解决办法是使用n·v的绝对值并加上0.00001。

物理学原理对于任何BRDF都有两个限制。第一个限制是Helmholtz reciprocity(赫尔姆兹互反定律),这意味着即使我们交换输入角度和输出角度,函数的返回值并不会变化:f(l,v)=f(v,l)。在实践中,实施渲染中的BRDF通常会违反这一定律。但是离线渲染会使用这一互反定律,例如bidirectional path tracing。但是当我们检测BRDF是否基于物理法则时可以使用该定律作为检测工具。

第二个限制能量守恒定律——输出的能量不能大于输入的能量(自身会发光的表面属于特殊的例子)。离线渲染的算法,例如光线追踪,都需要能量守恒以保证光线的聚集。对于实时渲染来说,我们并不需要完全准确的能量守恒,但是“笼统”的能量守恒是非常重要的。如果我们使用了BRDF来绘制物体的表面,且完全不遵循能量守恒定律,那么物体表面可能会过亮或者看起来不那么真实。

directional-hemispherical reflectance(方向性半球反射率)R(l),其是一个基于BRDF的函数。我们可以使用这一函数来检测BRDF是否符合能量守恒。该函数的主要原理是检测一个方向上的入射光线的所有反射光,而反射光的范围是物体表面法线方向上的半球。通过这一函数,我们能够知道某一方向上的入射光在反射之后的能量损耗。该函数的输入参数为光线的方向向量l,其定义如下:

需要注意的是,上述等式中的v,其类似于BRDF中的l,其指的并不是某一个方向向量,而是物体表面法线方向上的半球内的所有方向向量。

还有一个类似的函数,但是其与R(l)的意义相反,被称为hemispherical-directional reflectanceR(v),定义如下:

如果BRDF是“相互”的,那么R(v)应该等于R(l),这两个函数中任意一个都能表示入射光或者反射光的能量。directional albedo(方向性反射率)能够用表示这两种反射。

R(l)的值必须位于范围[0,1]之内,这样才能满足能量守恒。反射率为0表示所有的入射光都被吸收或者都损耗了。如果所有的光都被反射,那么反射率为1。大多数情况下,反射率的值位于这两个极值之间。与BRDF相同,R(l)的值也会随着波长的变化而变化,同时该函数返回的值是一个RGB向量,我们能将其用于渲染。由于RGB的三个通道的值都被限制在范围[0,1]之内,R(l)的值可以当作是一种颜色。需要注意的是,这一限制并不适用于BRDF。因为BRDF表示的是反射率的分布,或者说其是一个分布函数,所以某一方向上的反射率可以非常高。只要所有可能的l代入R(l)之后,我们得到的结果不大于1,那么我们就认为BRDF是满足能量守恒的。

最简单的BRDF就是Lambertian,其就是我们在第五章中学习的Lambertian着色模型。Lambertian BRDF拥有一个常量。Lambertian BRDF并不是BRDF的一部分而是下列等式的一部分。

虽然Lambertian BRDF非常简单,但是其常用于实时渲染中用来表示物体表面的局部散射(在之后的小节中,我们将学习更为准确的着色模型)。使用Lambertian的物体表面的directional-hemispherical reflectance也是一个常量。如果f(l,v)是一个常量,那么我们可以将R(l)转换为一下等式:

Lambertian BRDF所求出的反射率常量就是diffuse color(漫反射颜色)cdiff,其也被称为albedo(反射率)ρ。在本章节中,为了强调Lambertian BRDF与subsurface scattering的联系,我们将这个值称为subsurface albedo(表面下方的反射率)ρss。我们将在之后的小节中学习该变量。而我们可以将上述等式转换为:

等式中的1/π是因为我们引入了“半球”这一概念,并且计算了cos的值。π这一参数在BRDF中是非常常见的。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据