【GAMES202】Real-Time Physically-Based Materials (surface models)1—实时基于物理的材质(表面模型)1

一、前言

这篇和下一篇我们会介绍实时渲染下基于物理的材质,也就是Real-Time Physically-Based Materials,这里有一些歧义,我们通常会把基于物理的材质叫做PBR,而PBR是Physically-Based Rendering的简称也就是基于物理的渲染,那么基于物理的渲染自然包括基于物理的光照基于物理的相机以及基于物理的材质。所以实际上是不准确的,但是通常人们约定俗成的就把基于物理的材质叫做PBR,这里我们也这么规定,以下提到PBR说的就是基于物理的材质,另一种情况我会特别标注出来。其次,虽然叫做基于物理的材质,实际上也并不是完全基于物理,因为要保证实时性,就要减小计算开销,自然会简化很多东西。

二、Recap: Microfacet BRDF

复习一下我们在GAMES101里提到的微表面模型,微观层面下有许多不同朝向的细小面片,它们的法线分布不同,导致我们最终从宏观看上去得到不同的效果。

其中有三个主要的项,F项也就是菲涅尔项,决定我们从一个角度看过去,有多少能量会被反射。G项表示Shadowing-Masking,我们待会介绍。而D项自然就是法线分布了。

1.Fresnel term

Fresnel现象我们以前说过,它告诉我们反射能量的多少取决于入射光的角度,入射光与法线接近垂直时,反射光是最多的。当然由于光路可逆,我们也可以理解为视线和平面法线越接近垂直,反射越强。

上图也是我们以前提到过的,对于绝缘体(Dielectric) , 如上图所示,反射能量和入射角的关系,入射角越接近90°,反射越强,否则越弱更多的是折射,如水面,玻璃等。

而导体(Conductor)的Fresnel走势和绝缘体基本一致,都是随着入射角增大,反射增强,只不过起点不同,中间还可能会有一些细微的差别。

上图是计算Fresnel的精准公式,我们在GAMES101里也提到过,它是准确的,但很复杂,又是考虑入射角折射角,又是光线极化的,所以一般人们常用一个简单的公式来近似。 

也就是Schlick's近似,是一个基础反射率加上一条曲线,我们前面讲Split Sum方法的时候也提过,它能满足当入射角=90°的时候,R(θ)的值为1,并且该曲线和Fresnel精准的公式计算的曲线拟合较好。 

2.Normal Distribution Function (NDF)

然后咱们来说第二项,法线分布,也就是这些微表面们各自的法线分布,微表面法线分布如果比较集中,也就是变化不明显,方向都差不多,那这自然是相对光滑的一种表面了,也就是Glossy如上面第一幅图,如果法线再集中一点那自然就是Specular了。而如果非常分散,那则相反,也就是相对来说比较粗糙,类似Diffuse。

整个D(h)项说白了就是看半程向量h在该法线分布下的和法线相同朝向的占比多少。

如果想从光滑变粗糙,可以理解为对微表面的高度场进行了一个Scale,把这些表面竖直方向拉长了,当然同时沟壑也加深了。

关于法线分布,人们发明了许多分布的模型去描述它,实时渲染中常用的模型就是Beckman模型和GGX模型。

(1)Beckmann NDF

Beckmann NDF模型很像高斯分布,它有两个参数,α也就是roughness粗糙度 ,α越小D(h)的值自然也就越大,物体看上去也就更光滑,反之则越粗糙,这是直观的理解,而从数学角度上,α实则对应了高斯中的σ,也就是标准差,它决定了分布的胖瘦,自然也就决定了反射的lob大小,那自然也就决定了反射的分散程度。而θh表示半程向量和法线的夹角大小,很容易理解,因为它肯定需要计算半程向量和法线的接近程度,那自然涉及到夹角。

这里有一个细节,为什么e的次幂项上面是tanθh的平方而不是θh的平方呢?首先θh那是定义在平面上的,而tanθh是定义在坡度空间的也就是slope space上的,如上面图画中所示,就是在单位球上把θ数值化的另一种空间,也就是单位球上的一个切平面上。定义在slope space上有一个好处,我们知道定义在平面空间上的高斯分布的support,也就是我们前面提到过的积分线是无限大的。而定义在slope space的高斯虽然是无限大的,但它对应一个有限的90°内的角度,这样就避免了会出现面朝下的微表面

而其中α的平方,cos4次方都是归一化中推导出来的,为的是使单位圆上的投影立体角积分为1,这里不再赘述。

(2)GGX (or Trowbridge-Reitz—TR)

我们介绍另一种模型叫做GGX模型,也可以叫TR模型。GGX模型有一个非常典型的特点那就是拖尾或者说长尾。从上图中曲线就可以看出,蓝色线是Beckmann的分布曲线,很快直接衰减到0。但是GGX则不同,它虽然会衰减,但是直到90°的时候,仍然有一定的值。

从上图可以看到,Beckmann的高光边缘比较锐利,界限比较分明因为它描述的分布就是从较高的峰值很快衰减到0。而GGX则不同,在它高光的周围有一圈光晕现象,也就是略微模糊,这也符合我们前面提到的GGX分布曲线的走势。另外如果对于稍微粗糙一点的物体,Beckmann的效果是只有一个高光而其他部分全黑,而GGX则是其他地方也有一定亮度,相对自然一些。

(3)GTR (Generalized Trowbridge-Reitz)

还有一种在GGX模型之上做的扩展的模型,叫GTR模型。GTR有一个参数γ,通过调整γ的值,可以调整曲线的走势以达到不同的效果,如上图所示γ越小,拖尾越长,而γ=2的时候就是GGX模型,而γ增大到一定程度的时候就变成了Beckmann模型,所以说GTR模型把Beckmann和GGX整合在了一起。

3.Shadowing-Masking Term

Shadowing-Masking Term,也就是G项,我更倾向于叫几何遮蔽。它解决的是微表面之间相互遮挡的问题。尤其是Grazing angle的情况下,自遮挡现象会更严重,无论是入射方向还是视线方向,如上图所示。我们把从光出发,光线被微表面遮挡的现象叫做Shadowing。从眼睛出发看不到一些微表面的现象叫做Masking。整体来说G项就是为了提供一个darkening的操作,因为由于自遮挡,我们实际看到的现象肯定是偏暗的,而G项就是一个使结果变暗的操作。

G项的函数我们其实可以凭感觉大概猜出来,无非就是当我们视线垂直于表面的时候值为1,而接近Grazing angle的时候值非常小。

如果没有G项,仅凭我们的Fresnel和法线分布,以及分母的视线与法线点积,会导致Grazing angle情况下,我们会看到物体的边缘会发白,会非常亮,不符合物理,这也是为什么G项很重要。

Smith shadowing-masking term 

这里我们简单介绍一种常用的Shadowing-Masking项,也就是Smith shadowing-masking项。它线先假设了一种法线的统计学分布,并在这种情况下推导出一个G项,并且它把Shadowing和Masking拆开了,认为两者情况不相干,如上图的约等式所示,而事实上这两者是有关系的。

上面两幅图表示了Beckmann模型和GGX模型的法线分布推导出的不同的G项,可以看到两者在视线和表面垂直的时候值都为1,而接近Grazing angle时都会剧烈的衰减下跌为0,也就是发生剧烈的遮挡。

4.Multiple Bounces

我们把所有的项都考虑过后发现了问题,如上图所示,随着α,也就是roughness的增大,我们发现虽然物体的外观确实发生了变化,但是却发现变暗了,这是不应该的。于是人们通过白炉测试,也就是把所有地方的环境光照都设置为相同,再渲染,发现随着α的增大,能量损失越来越严重,这是不正确的。

从上面的图不难想到,当我们的粗糙度提高的时候,也就是法线分布越分散的时候,微表面的沟壑越来越多,越来越深,这导致其中一个微表面的反射光很容易被另一个微表面挡住,而如果此时我们还是只考虑光线的一次弹射,看到的效果自然就会有大量的能量损失。 

我们解决这个问题的思路自然是把丢失掉的能量补回去,怎么补呢?类似光线追踪的方法对实时渲染来说太慢了。

所以说在是实时渲染里我们会采用另外一种思路:如果一条反射光没被挡住那就是被我们看见了,不需要考虑。而如果一根反射光被挡住了,就经过下次弹射以及多次弹射再被我们看到。那也就是说,被挡住发生下次弹射是一个概念。

The Kulla-Conty Approximation

基于上面的思想,有人发明了Kulla-Conty近似方法。Kulla-Conty近似的基本思想,就是把这些因为微表面遮挡的反射光损失的能量再补回去。那么补多少能量是个问题。

怎么计算呢?看上图的积分公式。首先我们先设Li为uniform的,值为1,然后再带入渲染方程,得出的应该就是我们一次反射后能被观察到的能量的比例。这里我们只是把渲染方程做了一下换元的操作,所以才会变成上图所示的样子,如图设μ=sinθ,就可以推导出上面的公式,积分结果为E(μo)。(单位立体角:sinθdθdΦ)。这样就能回答我们之前的问题,损失的能量自然是1-E(μo),那我们补上这个能量就可以了。并且我们还可以看出,随着视角方向o的改变,损失的能量是变化的。

那我们自然希望补上这么一个BRDF使得它积分等于1-E(μo),也就是说我们要设计一种函数使得它的积分为1-E(μo)。首先,考虑到BRDF的可逆对称性,我们需要把视角因素考虑进去,所以乘上1-E(μi),然后乘上个c,解c就是我们需要的操作。

这里的c解得的结果如上图所示,π(1-Eavg)。Eavg是什么呢?上图右边公式已经给出了答案,就是我们之前计算出的E(μ)乘上μ的一个积分,也就是某个值,它表示光一次弹射后我们眼睛能接受到的平均能量,推导过程其实就是在对μ求积分的基础上分母上除以一个空积分。

现在还有个问题,我们算的Eavg有些复杂,E(μ)本身已经是一个二重积分了,现在又积分了一下,就更加麻烦了。于是我们想到,对于一个不知道是否有解析解的积分,我们能想到的就是预计算或者打表了,而为了表的存储开销小一些,我们积分的维度或者说依赖的参数不能太多。我们看看我们需要哪些参数,首先观察方向o,其次就是BRDF,而BRDF很复杂,所以我们通常假设已知BRDF,这样就只需要α,也就是roughness来描述BRDF就够了,所以对于E(μ)来说一张二维的表就可以描述所有情况了,而对于Eavg,那就只需要一个一维的表就够了,它只依赖于roughness。

可以看到,使用了Kulla-Conty近似方法之后,再进行测试,就没有能量损失带来的变暗了,如上图所示。

还有一个问题,我们之前考虑的是物体没有颜色的情况,而颜色意味着能量被吸收,也可以理解为是损失,如果它本身因为物体的颜色而损失能量的话,那我们眼睛接收到的能量就不可能是1,也就是说不能用1-E(μ)去代表它损失的能量,这样做会导致补回去的能量过多。 

Kulla-Conty近似方法当然考虑了这个问题,这里我们先不考虑由于颜色带来的损失,而是根据我们之前说的步骤计算之后,最后再考虑由于颜色,它损失了多少能量。

这里我们定义一个平均的菲涅尔项Favg,它定义的是不考虑入射角大小的情况下,平均每次反射出的能量比例是多少,那对于有颜色的物体来说它的值自然是小于1的,它的计算公式如上图所示。

由此我们可以把反射出来的能量分成两部分,一部分是被我们看到的能量也就是Eavg,而另一部分则要参与后续的多次弹射。

根据上面的思路我们就可以进行一个递归式的推导,推导出一种通用性的公式。首先如果考虑没有被遮挡直接被我们看到的能量那就直接用F*E就可以了,F表示有多少被反射,E表示有多少不会被遮挡。那如果是经过一次遮挡然后弹射进入我们的眼睛自然就是F*(1-E)*F*E。弹射k次就在前面加k次幂就好了。考虑上面所有的情况,也就是k所有的取值情况,我们把它们加起来就可以得到一个级数项,也就是Kulla-Conty近似方法得出的颜色项。最后我们把这个颜色项乘到之前没有考虑颜色的BRDF上就好了。

最后可以看到Kulla-Conty得到的结果很符合我们的期望,如上图所示


参考

GAMES202_Lecture_10.pdf

Lecture10 Real-Time Physically-based Materials (surface models)_哔哩哔哩_bilibili

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值