【基于物理的渲染(1)】反射率方程
本文最后更新于 2025年5月8日 晚上
【基于物理的渲染(1)】反射率方程
能量守恒
光是一种能量,遵循的能量守恒原则,物体表面反射光的总量总是小于等于入射光的总量。
微表面模型
微表面模型是指采用了微分的思想看待物体表面。无论表面是粗糙还是光滑,只要从足够小的尺度下观察,它们都是由一堆微小镜面构成的,因此物体表面的每一点都可以看作采用了相同的光照计算公式。因此我们在计算光照时,只需要考虑单个微表面的实现即可。
注意微表面不是一个单个具体值,而是涵盖了与该表面相关的所有信息,根据在公式中出现的位置,他可能代表多种含义,例如该微表面的面积、法向等,这种概念同样会引申到后续的微分立体角中!
微分立体角
立体角是角的三维推演,是一个球面上的矩形面积。微分立体角则采用了与微表面模型类似的思想,通过将面积缩的无限小,以在微观上总结计算规律。
要注意的是,微分不代表没有,因此微分立体角依然是有面积的。而微分立体角常用来形容光线,因此说明在PBR中,光线是有截面的!
辐射度量学
辐射度量学是一种物理学科,但我们不需要深入学习,仅仅了解其中的一些概念就行。辐射度量学用于帮助我们确定微表面上能反射的最大灯光强度。
- 辐射能量:光源做工。
- 辐射功率:光源每单位时间做工。
- 辐射强度:光源从每单位立体角发出的辐射功率。
- 辐照度(Irradiance):光源照射到表面的辐射强度。
- 辐射率(Radiance):光源照射到表面后反射的辐射强度。
上面这些简述不理解也没事,后面举几个例子就很容易理解了,而且其中我们要用到的只有3个概念:辐射强度、辐照度、辐射率。
辐射强度
辐射强度最简单,就是指的引擎中的灯光强度,即灯光从光源刚发出还尚未衰减的初始灯光强度。
辐照度和辐射率
而对于辐照度和辐射率的理解,可以先将光线看成是有面积的柱状物体(微分立体角)。
如图所示,辐照度是光线照射前按光线截面的每单位面积光照强度(即a区域),辐射率则是光线反射时按收光表面的每单位面积光照强度(即b区域)。
计算辐照度
灯光相关的信息包括它的辐射强度,我们是一开始就知道的。故当我们知晓灯光落点位置时,很容易的就可以求出辐照度:
1 |
|
本质就是衰减后到达表面的灯光强度。
计算辐射率
辐射率就是辐照度吗?肯定不是。考虑能量守恒,上图的a和b区域的每单位面积接收的辐射能量是不同的,因为他们的面积总大小不一样,但辐射能量的总量却是一样的。
通过对比面积的比值,我们可以用辐照度求出辐射率。而这一比值可以利用物体表面法向和光源方向的夹角配合三角函数求出:
1 |
|
由于表面法向和光源方向都是单位向量,故也可简写为:
1 |
|
由此我们便求出了一个微表面能接收到最大光照能量。
反射分布函数
所有微表面反照率的总和等于辐照度,但现实中的反射光却不一定等于入射光。因为根据材质的不同,反射光和入射光会存在一些差异。例如黑色物体会吸收光;粗糙的物体光斑更大更暗;镜面在特定角度能看到高光,有些角度又看不到。
因此反照率只能说明我们最大能反射的光能是多少,但实际的反射光还需要进一步处理。而用于描述反照率和实际反射光关系的函数,就叫做反射分布函数。
当然,反射只是光传播现象的一种,故相关函数其实共有以下几种:
- BRDF:双向反射分布函数(描述反射现象)
- BTDF:双向透射分布函数(描述投射现象)
- BSDF:双向散射分布函数(BRDF+BTDF)
由于性能原因,目前游戏引擎主流使用的是BRDF,但建模软件一般是使用BSDF。目前最主流且基于物理的BRDF是Cook-Torrance,不过下一章我们再细讲。
反射率方程
最终我们可以获得完整计算输入光和反射光关系的函数,即反射率方程:
- :反光的微表面。
- :入射光的微分立体角。
- :入射光能量(辐照度)。
- :表面法向和入射光方向的点乘(用于将辐照度转为辐射率)。
- :双向反射分布函数。
注意!如果你认真看了关于微表面的描述,那应该知道,此处的微表面和微分立体角具有多重含义。