一、基本概述
双向反射分布函数(Bidirectional Reflectance Distribution Function,BRDF)是用来定义给定入射方向上的辐射照度如何影响给定出射方向上的辐射率。更笼统地说,它描述了入射光线经过某个表面反射后如何在各个出射方向上分布这可以是从理想镜面反射到漫反射、各向同性或者各向异性的各种反射。
二、原理分析
I. 文章分析
1. 《A Data-Driven Reflectance Model》@Reference[1]
本文主要介绍了一种基于数据驱动形的BRDF模型,文章介绍了一种基于 矫正相机+旋转平台+稳定可见光光源+不同材质圆球对象 的实验装置,描述了标准的反射光束模型,完成入射反射光束的采集之后,确定了BRDF数据集的表征方法,通过对数据的线性、非线性、PCA主成分 分析方法,确定了BRDF数据需求表征的向量维度和具体参数;接着通过非线性方法对上述表征过程进行将维,得到了在10D条件的误差为可接受范围;并基于此建立了渲染重建模型。
2. 《BRDF LABORATORY MEASUREMENTS USING A CAMERA-AIDED SPECTRORADIOMETER》
本文主要介绍了一种附加可见光RGB相机的BRDF数据采集装置,采用了20nm~2000nm全波段的光谱测量仪器获取光通量数据,使用钨丝卤素光源进行照明,通过增加的 RGB Camera 建立了 SFM 模型,通过此模型从而解算出具体的观测采集点的位姿,从而大大降低了BRDF采集设备的硬件成本,文章对 SFM 模型重建后的位姿进行了实际测试对比,能够有效控制角度精度在1°以内,长度精度在6cm以内;文中对三种样品进行了测试对比,获得了较为良好的 BRDF 实验数据。
3. 《Automated three-axis gonioreflectometer for computer graphics applications》
本文主要介绍了一种BRDF数据采集装置,通过光束控制镜头及极化控制,输出了确定大小的入射光源,通过自动电控的旋转手臂调节入射光角度,样品安装在一个二维调节的的实验平台上,从而采集不同角度的图像,光源采集部分使用了光谱采集设备;软件代码实现了采集的全自动控制,包括参考光源的自矫正等,最后通过采集了两种材料评估了设备的基本性能能够满足BRDF采集需求,验证方向主要包括了能量守恒原理,互换定律。
4. 《Experimental Analysis of BRDF Models》
II. 理论分析@Reference[2]
BRDF理论光学入射出射光场模型如下:
BRDF的精确定义是出射辐射率的微分(differential outgoing radiance)和入射辐照度的微分(differential incoming irradiance)之比:
参数解析如下:
- 其中 \(l\) 为入射光方向, \(v\) 为出射光方向,也是观察方向。
- \(dL_{0}(v)\) 表示物体表面反射到 \(v\) 方向上的微分辐射出度,单位为 \(W·m^{−2}·sr^{−1}\),而 \(L_{0}(v)\) 计算了物体整个表面在观测点位置处的贡献总和。
- \(dE(l)\) 表示物体表面入射 \(l\) 方向上的光束微分辐射照度,单位为 \(W·m^{−2}\),而 \(E(l)\) 计算了物体整个表面入射光束的广场分布。
关于为什么是 辐射率(Radiance)/辐照度(Irradiance)之比,参考这里:
因为照射到入射点的不同方向的光,都可能从指定的反射方向出射,所以当考虑入射时,需要对面积进行积分。而辐照度irradiance正好表示单位时间内到达单位面积的辐射通量。所以BRDF函数,选取入射时的辐照度Irradiance,和出射时的辐射率Radiance,可以简单明了地描述出入射光线经过某个表面反射后如何在各个出射方向上分布。而直观来说,BRDF的值给定了入射方向和出射方向能量的相对量。引用
根据上述描述,可以确定离散有限元的BRDF着色方程如下:
🌻Tips: 各向同性BRDFs(Isotropic BRDFs)是一个重要的特殊情况。这样的BRDF在输入和输入方向围绕表面法线变化(保持相同的相对夹角)时保持不变。所以,各向同性BRDF是关于三个标量的函数。
1. 漫反射BRDF
A. Lambert 漫反射
光线在击中床场景中的某点后会朝着四面八方均匀的散射出去,因此漫反射的BRDF一定是一个常数,假设入射光线是均匀且遍布整个半球方向,可以得到以下方程:
由于入射光在各个角度方向上相同且等于 \(L_o\),则有 \(L_i(\omega_i)=L_i=L_o\),上式化简为:
最终可得:
考虑到材料除了漫反射以外,还会产生一定的吸收特性,基于此,最终漫反射的结果为 朗勃体漫反射模型 lambert:
B. Phong 反射模型
C. Oren-Nayar漫反射模型
D. Disney (Burley) 漫反射模型
https://zhuanlan.zhihu.com/p/365510738
2. 镜面反射BRDF(微表面模型 micro facet surface)
镜面反射模型主要基于微表面模型,该模型将复杂的镜面反射表面建立成法线方向概率随机分布的微镜面反射表面模型;通过建立法向量随机分布函数,菲涅尔方程,物体几何函数从而建立了理论的 BRDF 方程,这里的微表面的限制条件为:其变换尺度在几百纳米级别以上(针对可见光范围),否则会产生像光栅材料那样相互衍射、色散的结果,针对有一定透射率的物体的 BRDF建立,还需要考虑其不同角度下光束通过物体过程中散射从表面出射的情形,具体讨论参看 Video。
A. Cook-Torrance模型
其中 \(l\) 为光束入射方向,\(v\) 为观察方向,\(n\) 为宏观平面法向量,\(h\) 为微平面法向量,上述公式其他分布函数 FGD function 解析如下:
-
菲涅尔方程(Fresnel Equation) :
菲涅尔(发音为Freh-nel)方程描述的是被反射的光线对比光线被折射的部分所占的比率,这个比率会随着我们观察的角度不同而不同。当光线碰撞到一个表面的时候,菲涅尔方程会根据观察角度告诉我们被反射的光线所占的百分比。利用这个反射比率和能量守恒原则,我们可以直接得出光线被折射的部分以及光线剩余的能量。
当垂直观察的时候,任何物体或者材质表面都有一个基础反射率(Base Reflectivity),但是如果以一定的角度往平面上看的时候所有反光都会变得明显起来。你可以自己尝试一下,用垂直的视角观察你自己的木制/金属桌面,此时一定只有最基本的反射性。但是如果你从近乎90度(译注:应该是指和法线的夹角)的角度观察的话反光就会变得明显的多。如果从理想的90度视角观察,所有的平面理论上来说都能完全的反射光线。这种现象因菲涅尔而闻名,并体现在了菲涅尔方程之中。
描述了物体表面在不同入射光角度下反射光线所占的比率,观察角度与法线夹角越大反射程度一般越大,但是精确计算计算消耗较大,一般用Fresnel-Schlick近似法求得近似解:\[F_{Schlick}(h,v,F_0)=F_0+(1-F_0)(1-(h \cdot v)^5) \]\(F_0\) 表示平面的基础反射率,它是利用所谓折射系数(Indices of Refraction)计算得出的。越是朝球面掠角的方向上看(此时视线和表面法线的夹角接近90度)菲涅尔现象就越明显, 反光就越强。但是根据折射系数只能算出电介质(非导体)的F0为了兼容导体,一般会将 \(F_0\) 提前计算出来:\(F_0=\frac{(n-1)^2}{(n+1)^2}\),其中 \(n\) 为物体的折射率
-
几何函数(Geometry Function) :
描述了微平面自遮挡的属性,当一个平面相对比较粗糙的时候,平面表面上的微平面有可能挡住其他的微平面从而减少表面所反射的光线。
实际上并不是所有微表面都能收到接受到光线,如下面左边的图有一部分入射光线被遮挡住,这种现象称为Shadowing。也不是所有反射光线都能到达眼睛,下面中间的图,一部分反射光线被遮挡住了,这种现象称为Masking。光线在微表面之间还会互相反射,如下面右边的图,这可能也是一部分漫射光的来源,在建模高光时忽略掉这部分光线。
Shadowing和Masking用几何衰减因子(Geometrical Attenuation Factor)来建模,输入入射和出射光线方向,输出值表示光线未被遮蔽而能从反射到方向的比例。光学平面并不会将所有光线都反射掉,而是一部分被反射,一部分被折射,反射比例符合菲涅尔方程(Fresnel Equations),在UE4中采用了Schlick-GGX来进行建模:\[k=\frac{(Roughness+1)^2}{8}\\ G_1(\vec V)=\frac{\vec n \cdot \vec v}{(\vec n \cdot \vec v)(1-k)+k}\\G(\vec l,\vec v,\vec h)=G_1(\vec l)G_1(\vec v) \]一般情况下,粗糙程度越大,遮挡程度越大。
-
法线分布函数(Normal Distribution Function) :
其代表了所有微观角度下微小镜面法线的分布情况,粗糙表面法线分布相对均匀,光滑表面法线分布相对集中 (这种解释可能会有些抽象,后面会给出更加直观的物理上的解释)
用法线分布函数(Normal Distribution Function,简写为NDF)来描述组成表面一点的所有微表面的法线分布概率,现在可以这样理解:向NDF输入一个朝向,NDF会返回朝向是的微表面数占微表面总数的比例(虽然实际并不是这样,这点我们在讲推导过程的时候再讲),比如有1%的微表面朝向是,那么就有1%的微表面可能将光线反射到方向。
其中一种 NDF 分布函数 Beckmann distribution function :\[D(h)=\frac{e^{-\frac{tan^2\theta_h}{\alpha ^2}}}{\pi \alpha ^2 cos^4\theta_h} \]
可以看出无论是几何函数G,还是菲涅尔方程F,都是由于观察方向,入射方向的不同所导致的只有部分光线能够被反射:
III. BRDF的性质
1. 可逆性
BRDF的可逆性源自于亥姆霍兹光路可逆性 Helmholtz Recoprpcity Rule ;BRDF的可逆性即,交换入射光与反射光,并不会改变BRDF的值:
2. 能量守恒性质
BRDF需要遵循能量守恒定律。能量守恒定律指出:入射光的能量与出射光能量总能量应该相等。能量守恒方程如下:
根据上式可知:
因此,通过实验或者理论推导得到的BRDF函数应该满足如下条件:
3. 线性特征
很多时候,材质往往需要多重BRDF计算以实现其反射特性。表面上某一点的全部反射辐射度可以简单地表示为各BRDF反射辐射度之和。例如,镜面漫反射即可通过多重BRDF计算加以实现。
4. 一般材料BRDF特性
A. 金属材料
对于金属(Metallic)表面,当讨论到反射与折射的时候还有一个细节需要注意。金属表面对光的反应与非金属(也被称为介电质(Dielectrics))表面相比是不同的。它们遵从的反射与折射原理是相同的,但是所有的折射光都会被直接吸收而不会散开,只留下反射光或者说镜面反射光。亦即是说,金属表面只会显示镜面反射颜色,而不会显示出漫反射颜色。
三、测试实验
1. ABg模型
使用TracePro软件对相关光学反射模型进行设计分析 参考,ABg模型定义如下:
上式当中,A,B,g为各种材料测量数据拟合得到的参数结果,\(\vec{\beta}\) 和 \(\vec{\beta_0}\) 为散射光线和反射光线的单位矢量 \(\vec{r}\) 与 \(\vec{r_0}\) 在材料表面的投影,他们的差值为双向反射分布函数 BRDF 的变量。
在ABg模型中,参数A由物体反射能量决定,参数B,g由散射能量集中度决定,通过查阅相关文献,某种黑漆表面ABg参数如下:\(A=0.0003385,B=0.0001,g=3.5\) ,如下图所示:
基于上述Abg参数模型,不同入射角散射光空间能量分布如图所示:
这里需要说明的是,上图的Z轴夹角表示散射光线矢量与Z轴的夹角,X轴夹角为散射光束投影到XY平面之后与X轴的夹角。
仿真代码:
% TracePro Project Using
R = 10;
theta_out = linspace(0,pi/2,6);
90 - theta_out*180/pi
Z = R*sin(theta_out)
X = R*cos(theta_out)
% ABg Modle Test Demo
A = 0.0003385;
B = 0.0001;
g = 3.5;
delta_beta = linspace(0,1,100);
BRDF_ABg = A ./ (B + delta_beta.^g);
plot(delta_beta, BRDF_ABg)
% 三维BRDF分布
d = 1;
GridSize = 300
theta_x = linspace(0,180, GridSize);
theta_z = linspace(-75,75,GridSize);
theta_in = 80;
ReflectCOSVec = [0, d*sin(theta_in*pi/180)];
BRDF_Value = zeros(numel(theta_z),numel(theta_x));
for xi = 1:numel(theta_x)
for zi = 1:numel(theta_z)
SCV = [d*sin(theta_z(zi)*pi/180)*cos(theta_x(xi)*pi/180),d*sin(theta_z(zi)*pi/180)*sin(theta_x(xi)*pi/180)];
DIFFVec = SCV - ReflectCOSVec;
DIFFVecLen = norm(DIFFVec);
BRDF_Value(xi,zi) = A / (B + DIFFVecLen^g);
end
end
figure,
mesh(theta_z, theta_x, BRDF_Value)
xlim([-80,80])
ylim([0,180])
Title = strcat("入射角", num2str(theta_in))
title(strcat(Title, "° BRDF数值"))
xlabel("z轴夹角 / °")
ylabel("x轴夹角 / °")
zlabel("BRDF / sr-1")
2. BRDF Simulation @ TracePro 参考这里
此工程主要用来测试仿真了在物体表面发生光束散射的情况,工程模拟了在实际过程中,实验测量样品BRDF参数的实际流程,通过设计多个圆环采样点用于模拟在不同位置变化的相机位姿状态,在软件选择测量反射面并检视数据,在数据参数中设置BRDF相关参数,保存使用,如下图所示:
上述参数的生成方式使用了 《ABg 模型》,也就是说对于特定的材料,通过查阅相关资料得到其对应的ABg三个参数,通过该参数就能计算出对应入射角、散射角条件下的 \(\vert \vec{\beta} - \vec{\beta_0} \vert\),进而在表格中自动计算出对应的BRDF值用于数据仿真。
上述仿真工程中正上方的探测器数据如下:
🌻 工程文件下载:BRDFDemoShow.rar
在线光学仿真平台
3Doptix
Reference
- Wojciech Matusik, Hanspeter Pfister, Matt Brand and Leonard McMillan. “A Data-Driven Reflectance Model”. ACM Transactions on Graphics 22, 3(2003), 759-769.
- SIGGRAPH 2013 Course: Physically Based Shading in Theory and Practice, CourseVideoDownload ✌️
- Addy Ngan研究成果
- Experimental Analysis of BRDF Models,CourseResource
- MERL BRDF Database
- Lights and Shadows 🚀
- GAMES101-现代计算机图形学入门-闫令琪
- BRDF Cpp参考代码
- Learn OpenGL CN ✌️
- BRDF 数学基础理论文章 🚀
- 如何在Unity中造一个PBR Shader轮子
- 微表面BRDF数学理论Paper Microfacet Based Bidirectional Reflectance Distribution Function
- 微表面BTDF透射理论Paper Microfacet Models for Refraction through Rough Surfaces
- 彻底看懂PBR/BRDF方程@知乎
- 引擎底层如何实现BRDF渲染算法