文章目录
- 0. 写在前面
- 1. 简单理解
- 2. Cook-Torrance BRDF模型
- 2.1 BRDF
- D 法线分布函数
- F 菲涅尔
- G 几何函数
- 1.1.3 L i ( p , ω i ) L_i(p,\omega_i) Li(p,ωi)
- 1.1.1 积分框架
- 1.1.2 f r ( p , ω i , ω o ) f_r(p,\omega_i,\omega_o) fr(p,ωi,ωo):
- 个人疑惑及解答
- 1.漫反射在物理中到底是什么?真实存在吗?
refer:
LearnOpenGL
《入门精要》
Adobe Part1
Adobe Part2
知乎王江荣
知乎实现代码
几种不同的DFG
代码参考 间接光部分
代码参考 直接光部分
0. 写在前面
如果想要更好的理解,可以先看这篇文章
- 首先,BRDF其本意是一个函数,特指Cook-Torrance BRDF模型中计算反射的部分
- 但一般所说的BRDF均指整个Cook-Torrance BRDF模型:
- 本人由于习惯,BRDF均特指计算反射的函数
- 本文不考虑透射(BTDF)情况
双向反射分布函数BRDF(Bidirectional Reflectance Distribution Function)
1. 简单理解
- 先简单的理解BRDF干了些什么事情,后面的公式才看得懂
首先用文字描述来解释一下BRDF干了什么事情:
对于每一个点(片元)
- (入射)先遍历其法向半球的中所有光源,累加得到辐照度(先理解为入射光)
- (反射)根据BRDF,仅计算到摄像机方向的反射强度
就是非常简单的一件事,只不过这个函数有点复杂,想要真正的完全理解并不容易,按照常理本应先从计算辐照度(入射光强度)开始入手,但其含有非常多的光学名词和概念,先从这里来会被绕晕;本文选择先从更容易被理解(但更复杂)的反射部分开始。
现在坐稳了,发车!
2. Cook-Torrance BRDF模型
这是通常大家所说的的BRDF的全名,其包含完整的反射计算(BRDF),SSS计算(BSSRDF)
f
=
k
S
S
S
f
S
S
S
+
k
r
f
r
f= k_{SSS}f_{SSS}+k_{r}f_{r}
f=kSSSfSSS+krfr
f
f
f包含两个部分:
- k k k指各部分所占比率: k S S S + k s p e c < 1 k_{SSS}+k_{spec}<1 kSSS+kspec<1 (SSS被吸收的损失)
- f S S S f_{SSS} fSSS被称为漫反射,实际为SSS
- f r f_{r} fr被称为高光反射部分,实际上是真正的BRDF
2.1 BRDF
现在先只考虑BRDF的部分,让我们来看看一个点在真实的物理世界中,是怎么反射光线的吧!
-
当前只考虑单个光源的情况(方向光)
-
已知当前点的 入射方向 v i v_i vi,法线n 和 观察角度 v o v_o vo(出射方向)(均为从当前点出发的标准化向量)
f r = D F G 4 ( v o ⋅ n ) ( v i ⋅ n ) f_{r}=\frac{DFG}{4(v_o\cdot n)(v_i\cdot n)} fr=4(vo⋅n)(vi⋅n)DFG -
DFG分别代表一个函数:(每个DFG都有非常多的版本,有的开销大效果好,有的效果一般性能好)
D 法线分布函数:估算在受到表面粗糙度的影响下,朝向方向与半程向量一致的微平面的数量。这是用来估算微平面的主要函数。
F 菲涅尔方程:菲涅尔方程描述的是在不同的表面角下表面所反射的光线所占的比率。
G 几何函数:描述了微平面自成阴影的属性。当一个平面相对比较粗糙的时候,平面表面上的微平面有可能挡住其他的微平面从而减少表面所反射的光线。 -
先将DFG视为常数,BRDF当前的作用:(还不明白)
这个函数用来衡量:一个点在收受指定方向的光照后,有多少比例的光会反射到 v o v_o vo方向
- 其实一条光线无非就两个变量:方向,强度(颜色) ;既然方向已经指定,这时我们要考虑的仅仅是强度,这也是BRDF的输出:一个0到1的数字
D 法线分布函数
- 选取的为
N
D
F
G
G
X
T
R
NDF_{GGXTR}
NDFGGXTR
- α \alpha α:粗糙度; n n n法线向量; h h h半程向量(与blinn一致,入射和出射的中间向量)
F 菲涅尔
- 选取的为
F
S
c
h
l
i
c
k
F_{Schlick}
FSchlick
菲涅尔的作用是:计算光线反射部分所占的比例
真实的菲涅尔方程是一个相当复杂的函数,因此Fresnel-Schlick近似在实时渲染中是比较常用的函数:
(opengl这里的公式错了,应该是n不是h)
G 几何函数
1.1.3 L i ( p , ω i ) L_i(p,\omega_i) Li(p,ωi)
-
立体角: ω \omega ω顾名思义,注意,仅角所对应的面积有关,与角所对应的形状无关
-
辐射通量(Radiant flux): Φ \Phi Φ 表示的是一个光源的功率(光源单位时间内所输出的能量),以瓦特为单位
-
辐射强度(Radiant Intensity): I = d ϕ d ω I = \frac{d\phi}{d\omega} I=dωdϕ 表示的是在单位球面上,一个光源向每单位立体角所投送的辐射通量。
-
辐射率(Radiance): L = d ϕ d A ⋅ I c o s θ L = \frac{d\phi}{dA}\cdot\frac{I}{cos\theta} L=dAdϕ⋅cosθI 平面光源的每单位面积,所投射的辐射强度(因为是平面,要计算角度衰减)(描述出射光, θ \theta θ为光源平面和出射方向夹角)
-
辐照度(Irradiance):(入射)平面单位面积所受L的总和
\
首先,这个模型计算的对象仅是Object上的一个点(即上文所述的摄像机方向):
L o ( p , ω o ) = ∫ Ω f r ( p , ω i , ω o ) × L i ( p , ω i ) × ( n ⋅ ω i ) d ω i L_o(p,\omega_o) = \int_\Omega f_r(p,\omega_i,\omega_o)\times L_i(p,\omega_i)\times(n\cdot\omega_i)\mathrm{d}\omega_i Lo(p,ωo)=∫Ωfr(p,ωi,ωo)×Li(p,ωi)×(n⋅ωi)dωi
1.1.1 积分框架
∫ Ω A d ω i \int_\Omega A\ \mathrm{d}\omega_i ∫ΩA dωi
- Ω \Omega Ω代表该点法线所面对的整个半球面
- ω i \omega_i ωi代表每一单位立体角
1.1.2 f r ( p , ω i , ω o ) f_r(p,\omega_i,\omega_o) fr(p,ωi,ωo):
个人疑惑及解答
1.漫反射在物理中到底是什么?真实存在吗?
学习过PBR的同学可能知道,BRDF模型的光照其实也包含漫反射部分和镜面反射部分;但是我们学过微平面表面模型,所有的PBR都是基于此,有这样的理论:
- 物体表面其实是无数镜面的,只会发生镜面反射和折射
- 反射的光自然是specular
- 折射的部分变为了次表面散射、透射和被吸收掉
也就是说,基于物理的真实世界的光照中,并没有漫反射这种东西!
那BRDF模型怎么大言不惭的说自己是PBR呢?
- 首先事实是:BRDF模型是对的,没有错
- 实际上BRDF中所谓的漫反射,其实是SSS部分
- BRDF并没有考虑SSS远距离的情况,而是认为其SSS出射在入射光附近(同一像素)(大部分物质都可以这样近似,因为其散射距离确实很近)
如果你对上述的解释还不理解,可能是你还不了解BSSRDF模型,可以看我的这篇文章