本文是GAMES 202的学习笔记,主要内容包括Microfacet BRDF和LTC,介绍Disney principled BRDF。
1. Real-Time Physically-Based Materials 综述
1.1 Physically-Based Rendering
基于物理的渲染:渲染内部的任何话题都应在pbr范围之内,例如材质(materials)、光照(lighting)、相机(camera)、光线传播(light transport)等。
但实时渲染中提到的PBR多用于指PBR材质,实时渲染在材质丰富程度方面远远落后于离线渲染,而且质量较差,并不完全物理正确。
1.2 实时渲染中的材质种类
1.2.1 物体表面上定义的材质
- Microfacet models:微表面模型
- Disney Principled BRDF:套材质的种类多效果好,不是PBR,是基于artist的角度来考虑的
1.2.2 体积上定义的材质
由于光线会进入到云、烟、雾、皮肤、头发等体积里,在RTR中基于体积上要比基于表面的困难许多,我们大部分考虑的还是光线在这些体积中作用一次(single)和多次(multiple)的分离考虑方法。
2. Microfacet models微表面模型
微表面理论认为物体在宏观上看上去是平的,但是在微观上看去会看到各种各样的微表面,这些微表面的朝向,也就是法线各不相同,这些微表面法线的分布导致的渲染出的结果各不相同。
Microfacet BRDF:
2.1 F项
菲涅尔项,表示观察角度与反射的关系。
有多少能量被反射取决于入射光的角度,当入射方向接近grazing angle掠射角度的时候,光线是被反射的最多的,也就是当你的入射方向与法线几乎垂直时候,反射的radiance是最多的。(由于光路的可逆性,我们可以认为眼睛看过去的方向是光线入射方向)
下图中最右边一张接近grazing angle:
菲涅尔项告诉我们有百分之多少的能量会被反射出来。
推导菲涅尔项时要考虑光线的S极化和P极化效果,公式比较复杂,因为要考虑不同介质,如从空气到物体表面各自的折射率和入射角折射角,最终推导出下面的公式:
平常使用的是上面公式的一个近似版本:
其中\(R_0\)(基础反射率)取决于物体,不同物体的\(R_0\)各不相同。
2.2 D项
微表面的法线分布,决定这一项的是不同微表面朝向的法线分布。
当朝向比较集中的时候会得到Glossy的结果;如果朝向特别集中指向时认为是specular的;如果比较分散会得到diffuse的结果:
我们把表面法线分布的函数定义为Normal Distribution Function(NDF),常用的有Beckmann、GGX等。
2.2.1 Beckmann 模型
2.2.1.1 一维高斯函数
a表示得到曲线的高度;
b(μ)是指曲线在x轴的中心;
c(σ)指width(与半峰全宽有关);
2.2.1.2 Beckmann NDF
为了描述法线分布,肯定是一个对于微表面的法线方向(半程向量方向)\(h\)的函数,\(h\)是半球上任一方向,为了描述这一方向对应的值是多少我们需要NDF:
\(\alpha\)描述的是法线粗糙程度,粗糙程度这个值越小,表面就越光滑;
\(\theta_{h}\)描述微表面半程向量法线与宏观表面法线(0,0,1)方向n的夹角;
定义只与\(\theta\)有关,与\(\phi\)无关,因此表述的是各向同性的结果,也就是沿着中心旋转得到的是相同的结果。
高斯分布公式中的\(x\)对应这里的\(\tan \theta_{h}\)而不是\(\theta_{h}\),因为高斯函数被定义在了Slope space坡度空间上的。
\(\tan \theta_{h}\)与\(\theta_{h}\)关系如图所示,一维中\(\tan \theta_{h}\)就是法线延长到切线的交点到宏观法线顶端的距离,二维中则是与切表面的交点到宏观法线顶端的距离。
由于高斯函数的定义域是非常大的,但在过了3σ之后会缩减到非常小但不是0,为了满足这一性质定义在坡度空间,因为虽然距离非常远,但是一定对应着单位球(圆)上一个有限的角度,从而保证在Slope space中无限大的函数无论如何也不会出现面朝下的微表面。
2.2.2 GGX 模型
Beckmann模型的NDF曲线与GGX模型的NDF曲线相比有一个明显的特点:Long tail 长尾性质。
长尾特性带来两个好处:
- Beckmann的高光会逐渐消失,而GGX的高光会减少而不会消失,这就意味着高光的周围我们看到一种光晕的现象;
- GGX除了高光部分,其余部分会像Diffuse的感觉;
对比图:
2.2.3 GTR 模型
GTR(Generalized Trowbridge-Reitz),多了参数γ,根据γ不同可以调节拖尾长度。包括了本身GGX,当γ=2时候就是GGX;当γ超过10会接近Beckmann;γ<2会有更长的拖尾。
下图马里奥纸片王国中使用了更小的γ:
2.3 G项
Shadiowing-Masking有另外一个名称:Geometry Term。这也是缩写为G的原因
用于解决微表面之间的自遮挡问题,尤其是在角度接近grazing angle时。
由于在微观上有不同的微表面,虚线部分本该入射的光被遮挡了;由于光线时可逆的,不只是看过去被遮挡,往外看时也被遮挡:
左图从light出发发生的微表面遮挡现象叫做Shadiowing;
右图从eye出发发生的微表面遮挡现象被称为Masking。
引入G项就是为了考虑由于遮挡产生的darkening现象,在接近grazing angle时遮挡现象最大也就是接近于0,垂直看向时无遮挡也就是1。如果不考虑G项,Microfacet BRDF分母中的\((\mathbf{n}, \mathbf{i})(\mathbf{n}, \mathbf{o})\)在入射方向、出射方向和法线的夹角接近90°时,会得到一个接近0的数,导致边缘过曝:
GGX Shadowing-Making项:
直接光照时:\(k=\frac{\left(\alpha+1\right)^2}{8}\),间接光时:\(k=\frac{\alpha^2}{2}\)
2.4 能量补偿
随着粗糙程度变大,我们渲染得到的结果却越暗:
当表面越粗糙的时候,反射光更容易会被表面挡住,同时越粗糙的表面在表面之间弹射的次数越多。但G项只考虑了一次弹射,导致粗糙表面丢失了很多能量。
离线渲染中补偿这些丢失的能量,通常实在微表面做类光线追踪,时间代价比较大。
2.4.1 基本思路
反射光看作两种情况:
- 当不被遮挡的时候,这些光就会被看到;
- 当反射光被微表面遮挡的时候,认为这些被挡住的光将进行后续的弹射,直到能被看到。
2.4.2 The Kulla-Conty Approximation
这种方法是通过经验去补全多次反射丢失的能量,其实是创建一个模拟多次反射表面反射的附加BRDF波瓣->fms,利用这个BRDF算出消失的能量作为能量补偿项。
首先需要计算最后反射出了多少能量:
下面的式子把BRDF、Lighting、cos在半球上积分,计算出射的能量:
- 认为任何方向入射的Radiance是1,也就是rendering equation中的Lighting项是1(因为是1所以式子中没有出现);
- 同样假设BRDF是各向同性的,也就是与i、o无关的;
- 最终积分的结果意义是,在uniform的lighting=1的情况下,在经历了1 bounce之后射出的总能量 \(E\left(\mu_{o}\right)\)
因为\(\frac{\mathrm{d}f(x)}{\mathrm{d}x}=f'(x)\),\(\mathrm{d}f(x)=f'(x)\mathrm{d}x\),所以 \(\sin\theta\cos\theta\mathrm{d}\theta=\sin\theta\mathrm{d}(\sin\theta)\),最后用\(\mu=\sin\theta\)进行了换元。
出射能量为\(E\left(\mu_{o}\right)\)那么被遮挡的能量就有 \(1-E\left(\mu_{o}\right)\),因为BRDF的可逆性,不仅出射会丢失能量,入射也会丢失能量。经过推导可以得到丢失能量的BRDF:
将其带入渲染方程可以验证丢失的能量为\(1-E\left(\mu_{o}\right)\) :
\(E_{\mathrm{ms}}\left(\mu_{o}\right)\)是二重积分,可以预积分将其打成关于\(\mu_{o}\)和\(rough\)表格:
加上损失的能量后效果好很多:
2.4.3 当单次反射的BRDF是有颜色的情况
有颜色就意味着:物体发生了能量吸收的情况,也就是有额外能量损失,也就是单次反射的积分结果不是1。
平均菲涅尔项:\(F_{avg}\),不管入射角多大,平均每次反射会有多少能量反射
我们可以将能看到的能量分为不同类型:
- 能够直接看到的能量:\(F_{avg}*E_{\mu_{o}}\)
- 一次弹射后看到的能量:\(F_{avg}*(1-E_{\mu_{o}})*F_{avg}*E_{\mu_{o}}\)
- k次弹射后看到的能量:\(F_{avg}^k*(1-E_{\mu_{o}})^k*F_{avg}*E_{\mu_{o}}\)
把0次到k次弹射的结果相加,得到一个无穷级数,最终得到了下式的颜色项:
直接将它乘进上节得到的BRDF中\(f_{\mathrm{ms}}\left(\mu_{0}, \mu_{i}\right)\)中,积分可得到有颜色因素的能量补偿,效果如图:
PS:用叠加Diffuse项来补偿能量的方法,是完全错误的
2.5 Linearly Transformed Cosines
LTC->线性变换的余弦,采用线性变换球面分布的数学思想成功的解决了光泽反射的面光源问题,它有以下特点:
- 主要是针对GGX模型,对于其他模型也同样适用
- 做的是不考虑shadow的shading
- 光源是多边形光源,且发出的radiance时uniform的
2.5.1 Lobe
Lobe就是在固定一边方向下的brdf的函数图象,由于BRDF是一个4维的函数,在固定一边之后就变为了2维的函数。
没有Ltc计算光照需要在多边形光源上我们需要取很多采样点,并且光源与shaing point连线判断遮挡。
2.5.2 LTC核心方法
- 在固定入射方向后,将出射的lobe(brdf的lobe)转变为一个余弦函数。球面的所有方向经过这个线性变换后使得brdf的lobe朝向向上;
- 在转换Brdf的lobe时,将多边形光源也进行变换;
- 将shading point点任意brdf的lobe在任意多边形光源下积分求shading的问题 转变为在一个固定cos函数下对任意的多边形光源积分求shading;
2.5.3 线性变换球面分布
首先原本面光源的光照计算公式:
S为面光源区域,s为面光源上的某一个点,p为着色点,\(n_p\) 为着色点法线, \(\omega_i\)为s到p的向量, \(\theta_p\) 为 \(n_p\)与\(\omega_i\)的夹角。
Daniel给出了无AO漫反射面光源公式:
\(\theta_p\) 为 面光源上s点的法线\(n_s\)与\(-\omega_i\)的夹角。可以看出来两个式子极其的相似,只是光泽反射多了复杂的BRDF以及面光源上纹理的颜色L。
线性变换球面分布(LTSDs)的就是对于任意一个球面分布函数,一定可以通过一个线性变换矩阵将其变化到另外一个球面分布函数。
BRDF是一个球面分布函数,\(cos(\theta_s)\)也是一个球面分布函数,那么:
M就为线性变换矩阵,也就是说对于任意一个\(f\left(p, w_{i}, w_{o}\right)\)一定找的到一个M变换矩阵把他变换到\(cos(\theta_s)\),也就是核心思想的第三点:
2.5.4 线性变换余弦分布
现在我们将变换过的BRDF带入最开始的面光源光照计算公式:
J项是雅可比行列式,用于线性变换之后面积发生变化进行一个归一化操作,和M矩阵一样预计算存在纹理中。
以着色点为顶点,我们的面光源为底,就构成了一个三棱锥如左图;由于 \(w_{i}\) 是平面上某一点到着色点的向量,因此我们在实际的线性变换过程是采用直接将这三棱每一条侧边向量乘以线性变换矩阵,这样就将等价平面中所有的\(w_{i}\)进行了线性变换。这也等价于将面光源进行了线性变换:
其中\(L\left(s,-\omega_{i}\right)\)可以用类似IBL的方法生成Mipmap,可以从积分中拿出,最后得到公式:
3. Disney's principle BRDF
Disney's principle BRDF诞生的首要目的就是为了让artist使用方便,因此它并不要求在物理上完全正确;但是在RTR中我们认为Disney's principle BRDF也算是PBR材质。
引用
GAMES 202
图片来自GAMES 202 PPT
https://gunay-pi.com/chapter-9-physically-based-shading/8/
https://zhuanlan.zhihu.com/p/385438367
https://zhuanlan.zhihu.com/p/384559264
https://zhuanlan.zhihu.com/p/68025039
https://zhuanlan.zhihu.com/p/360040187