彻底看懂PBR/BRDF方程

2022-3-26 12:26klbuafjvb 639 0

实时渲染中的PBR方程是这样的

[公式]

但是很多教程中对这些项的含义解释的不够清楚, 我在学习中遇到许多困惑. 搜索资料后找到的答案, 这里分享给大家. 阅读前需要读者对PBR有简单的了解.

1. L的单位是什么?

这其实是一个很重要的问题, 如果没有弄清楚单位, 整个PBR方程会令人非常困惑.

其实从

[公式]
这个字母就可以看出来,
[公式]
的单位是辐亮度, 常用的各种单位如下表所示:

[公式]

色度学单位和辐度学单位是一一对应的, 详细的分析和转换过程可以参考 https://zhuanlan.zhihu.com/p/118272193.

辐度学单位描述真实的物理辐射, 色度学单位描述人眼的感受. PBR方程使用两种单位系统都是可以的, 我们在这里使用辐度学单位.

需要注意的是辐亮度的定义为:

[公式]

这里下面除的面积是一个投影面积.


为什么要使用辐亮度这个单位呢? 我想原因主要是这两点:

(1) 符合光的传播特征, 光是发散式传播的, 辐亮度是一个不会随距离变化的量.

(2) 符合人眼的观察特征, 固定辐亮度的物体, 在任何距离观察亮度总是相同的.

这点是符合我们生活常识的. 原因的话可以理解为距离变远后, 虽然到达人眼的辐通量变少了, 但是形成的像也变小了, 所以看到的亮度不变.

这里用数学方式再来验证下:

设距离

[公式]
处的一微元表面, 面积为
[公式]
, 辐射度为
[公式]
, 人眼瞳孔面积为
[公式]
, 视网膜到瞳孔距离为
[公式]
.

微元表面在瞳孔上形成的立体角为

[公式]
, 通过瞳孔的辐通量
[公式]
, 设微元表面在视网膜上成像大小为
[公式]
, 已知
[公式]
, 得
[公式]
. 微元表面在视网膜上成像产生的辐照度
[公式]
.

所以

[公式]
不会随着
[公式]
的变化而变化, 在不同距离观察的亮度是相同的.

2. BRDF到底是啥?

首先不考虑BRDF函数, 我们来计算下整个半球面上的辐照度

[公式]
.

[公式]

把整个辐照度看作是半球上的辐亮度积分,可得:

[公式]

而在任意方向上出射的光的辐亮度微分和任意方向上入射光辐亮度微分成正比的:

[公式]

这个比例就是关于

[公式]
[公式]
的BRDF函数, 记为:

[公式]

需要注意的是这两个微分的不同,

[公式]
是关于值的微分,
[公式]
是在立体角上的微分.

BRDF函数乘以辐照度值, 得到的是辐亮度, 使单位发生了变化.

这样在整个半球面上积分,得到:

[公式]

BRDF满足:

(1) 交换律:

[公式]
,

(2) 能量守恒:

[公式]
.


3. 菲涅尔反射的含义是什么? 金属和电介质的菲涅尔项有什么不同?

菲涅尔反射描述一个完全平坦的,由两个不同折射率介质组成的表面对光的反射率。

在不同折射率的介质相交表面,光会部分反射且部分折射,反射的比例就是菲涅尔系数。菲涅尔系数满足

[公式]

菲涅尔系数是可以由麦克斯韦方程组直接推导出来的,形式也很复杂。

已知两种介质的折射率分别为

[公式]
。 首先根据斯涅尔定律得到折射角和入射角的关系:

[公式]

然后根据麦克斯韦方程组计算推导,平行和垂直偏振光的菲涅尔反射公式:

[公式]

渲染中我们无需考虑偏振光的影响,得到:

[公式]

不同材质的菲涅尔系数做成图示例如下:

可以看出在观察角度接近掠夺角(90度)的时候,菲涅尔系数都是趋近于1的,这种现象叫做菲涅尔现象。


接下来要分开讨论电介质和金属:

A.电介质

可以看出,对于电介质来说,菲涅尔系数基本上不会随着波长变化。

我们现在用Schlick近似来表示菲涅尔系数:

将观察角为0时的菲涅尔系数记为

[公式]
,将两种介质的折射率比例记为
[公式]
,得

[公式]

Schilick近似为:

[公式]

常见电介质的

[公式]
值为:

可以看出电介质的

[公式]
值一般都很小,在实时渲染中,我们直接取0.04作为默认值。

另外需要知道的是,我们这里的菲涅尔项是反射的比例,没有被反射的部分自然是形成折射。因为这里讨论的是不透明表面光,折射部分的光传入介质内部后,部分被吸收,部分再次出射形成漫反射/次表面散射。

B.金属

金属和电介质的区别主要体现在这两点:

(1) 金属的折射率是复数, 金属的折射率表示为

[公式]
,
[公式]
表示吸收率.

这里菲涅尔公式仍然适用, 只是计算起来会复杂一点.

上面我们说电介质的菲涅尔表示反射比例, 剩余的部分是折射. 对于金属来说, 因为金属内部是可以自由运动的电子, 剩余的部分是直接被金属吸收了. 也就是说, 金属不会产生漫反射.

(2) 金属的折射率随光波长变化剧烈, 因此在Schilick近似时, 我们要把

[公式]
用RGB三个分量来表示, 常见金属的
[公式]
值如下所示:

从这个性质也可以知道, 电介质的颜色是来自于漫反射, 而金属的颜色是来自于菲涅尔反射/镜面反射.

4. BRDF如何表示全镜面反射?

对于一个全镜面反射来说, 只需要考虑菲涅反射的系数, 也就是说

[公式]

这里

[公式]
[公式]
是关于表面法线对称的.

现在的问题是, 我们如何描述这里的

[公式]
BRDF项? 答案是使用狄拉克
[公式]
函数,
[公式]
函数满足:

[公式]

这样, 将狄拉克函数带入到方程中, 得到:

[公式]

得到BRDF的表示为:

[公式]

5. 如何理解漫反射?

前面我们已经讲过漫反射形成的原因, 就是没有被菲涅尔反射的部分, 再次出射形成的.

我们通常使用Labertian模型来描述漫反射, 这种模型假定在所有方向观察物体表面的亮度完全相同.

Lambertian模型下的BRDF函数表示为

[公式]
.
[公式]
叫做反照率或者固有色, 表示光在介质内部出射部分的比例,
[公式]
表示被介质吸收的比例.

现在来解释下为什么这里要除以

[公式]
, 这也是一个经常令人困惑的地方.

在Lambertian漫反射模型下 , 由能量守恒可知

[公式]

因为Lambertian漫反射假设在所有方向观察亮度都是相同的, 因此漫反射的BRDF

[公式]
[公式]
是无关的, 是一个常数, 将
[公式]
提到外面得:

[公式]

我们前面说过, BRDF的作用之一是将辐照度值

[公式]
转换为辐亮度值
[公式]
. 这里的
[公式]
也可以看作是一个用来实现转换的系数.


在现实生活中的漫反射并不是完全符合Labertian漫反射模型的, Oren–Nayar漫反射模型等一些更加复杂的模型可以更好地表示现实中的漫反射.

但是在实际渲染中发现, 使用更加复杂的模型的提升很小. 出于性能考虑, 目前在实时渲染中Lambertian模型还是主流.

6. 如何理解微表面模型在镜面反射中的应用?

微表面模型在BRDF中体现在法线分布项D和几何遮蔽项G.这里我们来分别分析下.

前面我们讲到菲涅尔反射的比例, 都是针对完全镜面反射, 即

[公式]
[公式]
关于表面法线对称.

在微表面模型中, 只有微元表面法线朝向

[公式]
(这种写法不严格, 明白其含义即可)的时候, 我们才能看到物体表面的某个微元, 法线分布函数
[公式]
, 就是一个描述
[公式]
分布方向的概率密度函数.

对于完全光滑的平面,

[公式]
.

对于粗糙的平面, 我们使用参数

[公式]
来表示表面粗糙程度, 并使用函数来近似.

从物理合理的角度来说, 法线分布函数必须满足

[公式]
. 也就是说, 在一小块面积为
[公式]
的表面上, 各个法线方向的面积的投影和还是
[公式]
.

从BRDF单位转换的角度来说, D项是负责将辐照度值

[公式]
转换为辐亮度值
[公式]
的部分, 类似于漫反射中的
[公式]
.

几何分布函数有很多种近似模型, 常用的一个为Trowbridge-Reitz GGX:

[公式]

既然微表面模型假设微表面是崎岖不平的, 自然会产生遮挡, 导致某些部分我们无法看到. 定义遮挡函数

[公式]
, 表示微表面法线为
[公式]
时, 我们从
[公式]
方向观察时, 能看到的物体表面的比例. 遮挡函数满足
[公式]
.

对于一般的表面来说, 微表面可见的比例和法线

[公式]
是无关的, 因此我们直接省略
[公式]
, 将遮挡函数记为
[公式]
.

从物理合理的角度来说, 一块面积为

[公式]
的微表面, 从
[公式]
方向观察时, 能观察到的面积之和必然是
[公式]
. 因此遮挡函数必须满足

[公式]

因为光在入射到平面上时也会有遮挡, 所以可以得到几何衰减项为:

[公式]

一个常用的几何衰减的近似为Schlick-GGX近似:

[公式]

7. 镜面反射的BRDF如何推导?

现在我们已经有了Torrance–Sparrow模型下镜面反射BRDF需要的DFG各项函数, 来推导下BRDF镜面反射的表示. 很多PBR教程这步都是直接给出一个结论, 没有具体的推导过程.

微表面模型中, 每个微表面都是产生完全镜面反射. 现在考虑从

[公式]
方向入射的光线, 从
[公式]
方向观察, 只有微元表面法线朝向
[公式]
的时候才产生反射.

我们在这里定义

[公式]
[公式]
[公式]
之间的夹角(在前面我们的
[公式]
表示的是和表面法线之间的夹角).

先不考虑几何衰减项

[公式]
, 在一个面积为
[公式]
的微表面上, 可以看到的反射部分面积为

[公式]
入射光辐亮度为
[公式]
, 由辐亮度定义可知, 入射到
[公式]
上的辐照度为

[公式]
根据菲涅尔定理, 且我们这里不考虑几何遮挡, 得到出射辐照度和入射辐照度满足:

[公式]
再次由辐亮度定义得到出射的辐亮度满足:
[公式]


现在来计算

[公式]
,这里以
[公式]
作为为球坐标系向上的方向, 得

[公式]

[公式]
表示
[公式]
之间的夹角, 和上面
[公式]
的定义是相同的,
[公式]
.

这里的

[公式]
表示
[公式]
之间的夹角, 因为
[公式]
关于
[公式]
对称, 得
[公式]
,且
[公式]
.得

[公式]

带入后化简得:

[公式]

再把几何衰减项带入得到完整的Torrance–Sparrow BRDF:

[公式]

8. 实时渲染中整个渲染方程如何确定?

现在就是确定整个的PBR方程.由前面的计算可以得到PBR方程为:

[公式]

实时渲染的材质通常需要混合金属和电介质材质. 我们用

[公式]
表示金属比例, 反照率
[公式]
同时表示电介质的反照率和金属的
[公式]
值.

这样在计算镜面反射时为了方便地实现金属和电介质的混合, 我们取

[公式]
, 0.04是电介质的
[公式]
默认值.

菲涅尔项

[公式]
本身就已经体现了镜面反射的比例, 上面的系数
[公式]
可以直接去掉.

对于漫反射项, 我们知道金属是不产生漫反射的. 所以先减去镜面反射的比例, 再乘以电介质的比例得

[公式]
.

这样就得到整个渲染方程大致为:

[公式]

一般我们在游戏引擎中使用时, 往往会把漫反射中的

[公式]
项忽略. 因为当
[公式]
的值比较大的时候, 都是在边缘区域, 这时镜面反射很强, 漫反射的强度相对很弱, 完全可以直接忽略. 忽略漫反射中的
[公式]
项, 可以为全局光照等的计算带来极大的便利. 这样我们最终的渲染方程为:

[公式]

9. PBR方程如何和光照联系?

一般来说, 实时渲染的光源只有一个或者几个, 实时渲染中计算时肯定不能直接按照积分来求值, 我们这里来看下怎么将直接光源带入到方程当中.

通常我们使用的光源都是确定光源(punctual light), 确定光源的含义就是只有某个方向上有值.

确定光源包括点光源, 聚光和直线光. 对于点光源和聚光, 我们使用辐强度

[公式]
描述强度. 对于直线光源, 使用辐照度
[公式]
来描述强度.

但是在渲染方程中, 我们输入的光照单位是辐亮度

[公式]
, 如何将光源的单位转化为辐亮度?答案还是使用狄拉克
[公式]
函数. 狄拉克
[公式]
本身是隐含了单位转换的功能的.

对于点光源来说, 设

[公式]
为物体表面到光源的方向, 物体表面到光源距离为
[公式]
, 点光源辐强度为
[公式]
, 将点光源视为一个无穷小的点, 得到入射的光照的辐亮度L为

[公式]

带入到PBR方程得:

[公式]


对于直线光源, 设直线光源的辐照度为

[公式]
, 得

[公式]


从另外一个角度来分析这个问题, 我们在前面提到过, BRDF输入一个辐照度

[公式]
, 得到一个辐亮度
[公式]
. 即

[公式]

对于单个确定光源来说, 只有一个方向上有光照, 设这个方向为

[公式]
, 得

[公式]

对于点光源来说, 容易算得

[公式]
. 对于平行光源
[公式]
.

上面我们提到的几何衰减Schlick-GGX近似公式为:

[公式]

这里在计算直接光照时,

[公式]
的系数至少为
[公式]
, 就是将确定光源作为理想光照的一个补偿.

关于IBL光照部分, 可以参考我的另一篇文章https://zhuanlan.zhihu.com/p/162793239, 这里不再深入讨论.


鲜花

握手

雷人

路过

鸡蛋

最新评论

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2022-10-5 11:34 , Processed in 0.090118 second(s), 21 queries .

Powered by Discuz! X3.4  © 2001-2017 Comsenz Inc.