项目代码仓库:
GitHub:https://github.com/AKGWSB/EzRT
gitee:https://gitee.com/AKGWSB/EzRT
目录
前言
基于物理的渲染!迪士尼原则的 BRDF 实现:

在 上一篇博客 中,我们利用 OpenGL 在 GPU 上实现了光线追踪,尽管获得了令人惊艳(并不)的效果,与此同时遗憾的是我们的代码仅支持漫反射这种材质,为了模拟更多的材质,我们不得不继续学习
尽管我们能够使用一些土方法,比如将随机向量和镜面反射向量,根据粗糙度做一个插值,就能简单模拟模糊镜面反射,运算速度快,并且(看起来)还有不错的效果。不过这毕竟是非常主观的 hack…
注:
该方法在 spp 上去之后会有严重的 artifact
我们希望有一种统一的规范(principle)来衡量材质。规范的意义在于,我们用不同的渲染平台,渲染器去渲染同样的物体,就会得到同样的效果,这将材质和渲染人为地分离解耦
什么是 principle?设想你去打吊针,你问医生剂量多少,你希望听到的是 xxx 毫升而不是 x 师傅矿泉水瓶装满九又四分之三
0. 前情回顾
渲染方程:

还记得上一篇文章中,我们留下的问题吗?在求解渲染方程的 f r f_r fr 项的时候,我们暴力地假定了:
f r = b a s e C o l o r π f_r = \frac{baseColor}{\pi} fr=πbaseColor
事实上,对于漫反射,这么假定能够得到不错的结果,但是如果 f r f_r fr 恒定不变,我们也只能得到这样的结果了(:
一个理想的情况是:对于不同的入射角度,出射角度,表面材质,这个 f r f_r fr 会有不同的值,我们命中了金属,就返回金属的颜色,命中了塑料,就得到塑料的颜色…
对于动态的入射出射角和材质,我们能够通过 f r f_r fr 函数来模拟不同的表面,于是今天我们的任务就是根据科学家的测量和数学家的建模,物理地地确定这个 f r f_r fr 的值
1. 微平面理论
微平面理论在真实感渲染中有着举足轻重的地位,作为像素的朝圣者,我们不得不对它三叩九拜。在接触微平面理论之前,来先入为主地看这样一张相片(图源百度图片):

仔细看反射的树木,模糊的看不到树枝的轮廓了。根据人们的经验,平面越平坦,形成的反射就越接近镜面。为什么几乎水平的地面形成的反射会如此模糊和粗糙?在探究这个问题之前,回想一下模糊形成的模糊的原因。在 近邻区域重复采样 这就是形成模糊的原因。:

那么地面形成了模糊,究其原因是反射光线没有严格按照镜面反射的方向射出,而是 分布 在了标准镜面反射方向的附近,相当于采样了周围像素:

我超,好像出大问题了… 初中物理告诉我们:光沿着直线传播,光在反射的时候严格地沿着法线反射
对于上图右侧的一条法线却出现多方向的出射光,如果 ”光沿直线传播“ 的物理定律没错的话,那么问题就出在 法线 上面!
幸运的是我们有显微镜!拿起显微镜看看物体的表面(左图引自百度图片)发现很多凹凸不平的小表面,这样的小表面形成了 多个不同的法向量 :

对于多个不同的法向量,根据反射定律算出来的出射方向就有很多个,多条光线的颜色平均就产生了模糊。这也就解释了为什么看似光滑的地面能够反射出模糊的图像:

这便是微平面理论的由来。对于粗糙的物体,微平面法线随意分布在宏观表面上反射的方向更加随意。而对于镜面反射的物体,其微平面法线集中在宏观表面法线的附近,其反射光线的方向接近宏观表面的镜面反射方向:

就好比用 20 x 20 的 kernel 去做 blur,效果比 3 x 3 的好,法线分布越离散,模糊程度就越大。至此,我们对微平面理论有了基本的认知
2. BRDF 介绍
BRDF,Bidirectional Reflectance Distribution Function,双向反射分布函数,通常也是渲染方程中的 f r f_r fr 项。BRDF 函数接收三个参数,分别是入射光线 w i w_i wi,命中点 p p p,和出射方向 w o w_o wo,并且返回一个能量值:
f r ( p , w i , w o ) f_r(p, w_i, w_o) fr(p,wi,wo)
这个函数描述了入射光沿着 w i w_i wi 方向入射,命中 p p p 点发生反射,能够有多少能量反射到 w o w_o wo 方向。举个例子:

BRDF 有一些性质,这使得它是科学且合理的。首先是能量守恒定律,这意味着所有反射光的能量之和必须等于入射光的能量:

对于漫反射来说,它的 BRDF 处处相等,于是简单漫反射材质的 BRDF 可以近似认为是一个常数,这也就解释了上一篇博客中,我们使用常数 b a s e C o l o r π \frac{baseColor}{ \pi} πbaseColor 做 f r f_r fr 项的原因。事实上这是 Lambert diffuse model 的描述,是一种简单好用的近似。而 1 / π 1 / \pi 1/π 是通过对 BRDF 函数立体角在半球面 Ω + \Omega^+ Ω+ 上积分积得到的
其次,根据光路可逆, w o → w i w_o → w_i wo→wi 和 w i → w o w_i → w_o wi→wo 是等效的,他们应当拥有相同的 BRDF 值:
f r ( p , w i , w o ) = f r ( p , w o , w i ) f_r(p, w_i, w_o) = f_r(p, w_o, w_i)