目录
Image-Based Lighting (IBL)
- IBL不考虑visibility项,因此其求解的渲染方程如下:
L o ( p , ω 0 ) = ∫ Ω + L i ( p , ω i ) f r ( p , ω i , ω o ) c o s θ i d ω i (1) \tag{1}L_o(p, \omega_0) = \int_{\varOmega^+}L_i(p, \omega_i)f_r(p, \omega_i, \omega_o)cos\theta_i d\omega_i Lo(p,ω0)=∫Ω+Li(p,ωi)fr(p,ωi,ωo)cosθidωi(1) - 使用蒙特卡罗方法求解渲染方程需要大量的样本(采样),因此计算会非常耗时。(在编写的shader中涉及到采样一般不能应用到实时渲染中,但由于时间空间滤波方法、样本复用技术的出现,可以使采样应用到实时渲染中)
- 求解IBL的渲染方程时,使用《Shadow Mapping》章节公式(1)进行近似, 将光照从积分中提出(原理略)
L o ( p , ω 0 ) ≈ ∫ Ω f r L i ( p , ω i ) d ω i ∫ Ω f r d ω i ⋅ ∫ Ω + f r ( p , ω i , ω o ) c o s θ i d ω i (2) \tag{2}L_o(p, \omega_0) \approx \cfrac{\int_{\varOmega_{f_r}} L_i(p, \omega_i)d\omega_i}{\int_{\varOmega_{f_r}}d\omega_i} \cdot \int_{\varOmega^+} f_r(p, \omega_i, \omega_o)cos\theta_i d\omega_i Lo(p,ω0)≈∫Ωfrdωi∫ΩfrLi(p,ωi)dωi⋅∫Ω+fr(p,ωi,ωo)cosθidωi(2)- ∫ Ω f r L i ( p , ω i ) d ω i ∫ Ω f r d ω i (3) \tag{3} \cfrac{\int_{\varOmega_{f_r}} L_i(p, \omega_i)d\omega_i}{\int_{\varOmega_{f_r}}d\omega_i} ∫Ωfrdωi∫ΩfrLi(p,ωi)dωi(3)
- 公式(3)可以表示为:在整个球上,BRDF Lobe所覆盖区域中的光线积分起来再归一化。其实就是将IBL表示的图像进行模糊(后面称天空盒)。(即滤波环境光, 滤波核大小取决于BRDF Lobe的大小)
- lobe:理解为分布(反射波瓣)
- 实际应用中,先将使用HDR图获得的Cube Map进行模糊处理(即mipmap)(这一步可以预计算完成)。使用时,根据BRDF Lobe的大小,在mipmap查询(或插值计算)
- 只需要使用入射光线的镜面反射方向在Cube Map的mipmap中取一次值即可(得到原本光线周围一片光线的值)
- 通过上述步骤的近似,公式(3)就没有采样了
-
∫
Ω
+
f
r
(
p
,
ω
i
,
ω
o
)
c
o
s
θ
i
d
ω
i
(4)
\tag{4} \int_{\varOmega^+} f_r(p, \omega_i, \omega_o)cos\theta_i d\omega_i
∫Ω+fr(p,ωi,ωo)cosθidωi(4)
- 公式(4)的计算思路依然是尽可能的将计算维度降下来。(即,将积分中的变量或常量提出(降维))
- 公式(4)的预计算
- BRDF公式如下:
f ( i , o ) = F ( i , h ) G ( i , o , h ) D ( h ) 4 ( n , i ) ( n , o ) (5) \tag5 f(i,o) = \frac{F(i,h)G(i,o,h)D(h)}{4(n,i)(n,o)} f(i,o)=4(n,i)(n,o)F(i,h)G(i,o,h)D(h)(5) - 其中菲尼尔项使用Schlick近似
R ( θ ) = R 0 + ( 1 − R 0 ) ( 1 − c o s θ ) 5 (6) \tag6 R(\theta) = R_0+(1-R_0)(1-cos\theta)^5 R(θ)=R0+(1−R0)(1−cosθ)5(6) - 法线分布函数使用Beckmann分布
D ( m ) = χ + c o s θ π α b 2 ( c o s θ ) 4 exp ( ( c o s θ ) 2 − 1 α b 2 ( c o s θ ) 2 ) (7) \tag7 D(m) = \frac{\chi^+cos\theta}{\pi\alpha_b^2(cos\theta)^4}\exp(\frac{(cos\theta)^2-1}{\alpha_b^2(cos\theta)^2}) D(m)=παb2(cosθ)4χ+cosθexp(αb2(cosθ)2(cosθ)2−1)(7) - 从BRDF公式中可以看出,如果想要求出当前着色点的BRDF,未知数有夹角 θ \theta θ、基础反射率 R 0 R_0 R0、用户输入的Roughness α b \alpha_b αb。这是一个三维的函数。
- 降维过程如下:
∫ Ω + f r ( p , ω i , ω o ) c o s θ i d ω i \int_{\varOmega^+} f_r(p, \omega_i, \omega_o)cos\theta_i d\omega_i ∫Ω+fr(p,ωi,ωo)cosθidωi
将菲尼尔项显式写出
∫ Ω + f r R ( θ ) ( R 0 + ( 1 − R 0 ) ( 1 − c o s θ ) 5 ) c o s θ i d ω i \int_{\varOmega^+} \frac{f_r}{R(\theta)}(R_0+(1-R_0)(1-cos\theta)^5) cos\theta_i d\omega_i ∫Ω+R(θ)fr(R0+(1−R0)(1−cosθ)5)cosθidωi
f r R ( θ ) \frac{f_r}{R(\theta)} R(θ)fr为公式(5)去掉菲尼尔项
∫ Ω + f r R ( θ ) ( R 0 + ( 1 − c o s θ ) 5 − R 0 ( 1 − c o s θ ) 5 ) c o s θ i d ω i \int_{\varOmega^+} \frac{f_r}{R(\theta)}(R_0+(1-cos\theta)^5-R_0(1-cos\theta)^5) cos\theta_i d\omega_i ∫Ω+R(θ)fr(R0+(1−cosθ)5−R0(1−cosθ)5)cosθidωi
整理
∫ Ω + f r R ( θ ) ( R 0 ( 1 − ( 1 − c o s θ ) 5 ) + ( 1 − c o s θ ) 5 ) c o s θ i d ω i \int_{\varOmega^+} \frac{f_r}{R(\theta)}(R_0(1-(1-cos\theta)^5)+(1-cos\theta)^5) cos\theta_i d\omega_i ∫Ω+R(θ)fr(R0(1−(1−cosθ)5)+(1−cosθ)5)cosθidωi
拆分
∫ Ω + f r R ( θ ) R 0 ( 1 − ( 1 − c o s θ ) 5 ) c o s θ i d ω i + ∫ Ω + f r R ( θ ) ( 1 − c o s θ ) 5 c o s θ i d ω i \int_{\varOmega^+} \frac{f_r}{R(\theta)}R_0(1-(1-cos\theta)^5) cos\theta_i d\omega_i +\int_{\varOmega^+} \frac{f_r}{R(\theta)}(1-cos\theta)^5 cos\theta_i d\omega_i ∫Ω+R(θ)frR0(1−(1−cosθ)5)cosθidωi+∫Ω+R(θ)fr(1−cosθ)5cosθidωi
将基础反射率 R 0 R_0 R0提出
R 0 ∫ Ω + f r R ( θ ) ( 1 − ( 1 − c o s θ ) 5 ) c o s θ i d ω i + ∫ Ω + f r R ( θ ) ( 1 − c o s θ ) 5 c o s θ i d ω i R_0 \int_{\varOmega^+} \frac{f_r}{R(\theta)}(1-(1-cos\theta)^5) cos\theta_i d\omega_i +\int_{\varOmega^+} \frac{f_r}{R(\theta)}(1-cos\theta)^5 cos\theta_i d\omega_i R0∫Ω+R(θ)fr(1−(1−cosθ)5)cosθidωi+∫Ω+R(θ)fr(1−cosθ)5cosθidωi
因此最后的近似公式为:
∫ Ω + f r ( p , ω i , ω o ) c o s θ i d ω i ≈ R 0 ∫ Ω + f r R ( θ ) ( 1 − ( 1 − c o s θ ) 5 ) c o s θ i d ω i + ∫ Ω + f r R ( θ ) ( 1 − c o s θ ) 5 c o s θ i d ω i (8) \tag{8} \int_{\varOmega^+} f_r(p, \omega_i, \omega_o)cos\theta_i d\omega_i \ \approx R_0 \int_{\varOmega^+} \frac{f_r}{R(\theta)}(1-(1-cos\theta)^5) cos\theta_i d\omega_i +\int_{\varOmega^+} \frac{f_r}{R(\theta)}(1-cos\theta)^5 cos\theta_i d\omega_i ∫Ω+fr(p,ωi,ωo)cosθidωi ≈R0∫Ω+R(θ)fr(1−(1−cosθ)5)cosθidωi+∫Ω+R(θ)fr(1−cosθ)5cosθidωi(8)
- BRDF公式如下:
- 公式(8) 将公式(4) 积分内部分近似降维到只与夹角 θ \theta θ和用户输入的Roughness有关。因为 Roughness是线性值,而夹角的范围也是有限值(0-360)。因此可以通过预计算。求出当前天空盒Roughness与夹角 θ \theta θ 映射的表格(映射值为公式(8)中积分的结果),即纹理贴图。最后求解渲染方程时查询该纹理求解即可。
- 上述求解渲染方程的方式为 split sum 方法
Shadow from Environment Lighting
- 环境光可以理解为从四面八方入射过来的光照。由于每个方向的光照都不同,因此环境光求阴影理论上是做不到的。但可以将环境光描述为many-light问题。也可描述为采样问题。来近似计算阴影。
- many-light
- 以many-light问题计算阴影,需要为每一个光源计算shadow map。这样很不现实。因此现有的解决方案是,在这些光源中取少数具有代表性的光源(keylight),如太阳。再计算阴影。
- 采样
- 由于不确定当前着色点的visibility项,即当前着色点的遮挡情况,因此很难精准计算阴影。
- many-light
- 环境光阴影相关论文
- Imperfect shadow maps
- Light cuts
- 离线,光源做归类
- RTRT (real-time ray tracing)
- 可能为最优解决方案
- Precomputed radiance transfer
- 很准确
Frequency and filtering
- 该部分的理论(略)
- 傅里叶级数展开
- 将函数表示为正弦和余弦的加权和
- 滤波:去掉频率一些内容
- 低通滤波器
- 卷积理论
- 频域和实域对应关系
- 实域中做卷积等于频域上做乘积
- 频域和实域对应关系
- 两个函数乘积再积分可以理解为卷积操作,即滤波操作
- 积分里面的两个函数可以认为是频域函数
- 一个函数为低频,乘积得到的函数也是低频
- 两个频率函数相乘在积分就是卷积 即滤波操作
- 低频函数定义
- smooth function
- slow changes
Basis Functions
- 本人研究方向之一是拉普拉斯矩阵应用,因此忽略重构相关概念
- 定义
- 一个函数可以描述为很多其他函数线性组合
f ( x ) = ∑ i c i ⋅ B i ( x ) (9) \tag{9} f(x) = \sum_i c_i \cdot B_i(x) f(x)=i∑ci⋅Bi(x)(9) - B i ( x ) B_i(x) Bi(x)即为一个基函数
- 一个函数可以描述为很多其他函数线性组合
Spherical Harmonics(球谐函数)
- 定义:
- 在球面上的一系列二维基函数
- 理解为一维上的傅里叶级数
- 性质:
- 第
n
n
n阶有
2
n
+
1
2n+1
2n+1个基函数
- 编号从 − n . . . n -n ...n −n...n
- 前 n n n阶有 n 2 n^2 n2个基函数
- 第
n
n
n阶有
2
n
+
1
2n+1
2n+1个基函数
- SH的基函数的定义
- 每一个基函数都使用勒让德(Legendre)多项式去定义
- SH系数定义
c i = ∫ Ω f ( ω ) B i ( ω ) d ω (10) \tag{10} c_i= \int_{\Omega} f(\omega)B_i(\omega)d\omega ci=∫Ωf(ω)Bi(ω)dω(10)- 给定二维球面的函数,将其展开成使用SH的线性组合来描述。对于任何一个SH函数,其前面的系数是两个函数相乘再积分(就是谱系数的求解过程)
- 给定任意一个函数,用基函数描述时,求基函数系数的过程叫投影
- 任何一个函数都可以求出其再任何一个基函数上的投影
- 根据基函数重构,使用前4阶(与拉普拉斯特征重构相同)
球谐函数在环境光中的应用
- 在环境光照下,SH可以应用在diffuse物体着色, (这里使用天空盒描述环境光数据结构)
- split sum 方法解释:
- 如果有一个环境光照,入射(是反射到屏幕的光线,用入射便于理解)到当前着色点的光线沿着镜面反射方向,在天空盒查询某个值,其实渲染后,着色物体感觉像似一个镜子(查询一次,获得从天空盒采样的数值)。
- 如果把环境光做预处理,进行滤波(prefilter),即对天空盒进行模糊,再从着色点沿着镜面反射方向,在模糊的天空盒,查询某个值。(其实是查询一个区域的值做平均)使用这种方式进行着色结果更像diffuse。即,一个prefilter过的天空盒,加上一次查询。就好像不做filter,入射到当前着色点的光线沿着任何一个方向,查询天空盒上的值做平均。因此做滤波与不做滤波进行查询计算光照时,这两个操作近似等价。而split sum 方法规避了采样的过程。
- SH 方法
- 结论:对于任何的光照条件,只要材质是diffuse的,都可以使用前三阶的SH描述光照
- 由于BRDF是低频的(diffuse材质),光照与BRDF的点乘,也是低频的,因此光照也不需要超过三阶的SH描述。
- 两个函数做点乘时,结果的频率由最低频率函数决定
- diffuse BRDF使用SH进行简化
- 由于diffuse BRDF是平滑的(smooth)。在渲染方程中(环境光照渲染方程(公式1)),计算光照时使用光照乘以BRDF(cos项再解释中忽略)。即,环境光,是一个定义在球面上的函数。BRDF定义在半球上的光滑函数,他们逐点相乘再积分,即点乘操作。
- 光照可以是高频或低频
- BRDF是diffuse的,其可以看做是一个低通滤波器。
- 因此可以用少量的SH描述BRDF项(三阶即可描述)
- 根据上述内容可得:环境光可以使用球谐函数进行计算,并且使用三阶即可近似描述光照。
- 由于BRDF是低频的(diffuse材质),光照与BRDF的点乘,也是低频的,因此光照也不需要超过三阶的SH描述。
- 结论:对于任何的光照条件,只要材质是diffuse的,都可以使用前三阶的SH描述光照
- split sum 方法解释:
Precomputed Radiance Transfer (PRT)
- 利用球谐函数计算环境光照
L o ( p , ω 0 ) = ∫ Ω + L i ( p , ω i ) V ( p , ω i ) f r ( p , ω i , ω o ) m a x ( 0 , n ⋅ ω i ) d ω i (11) \tag{11} L_o(p, \omega_0) = \int_{\varOmega^+}L_i(p, \omega_i)V(p,\omega_i)f_r(p, \omega_i, \omega_o)max(0, n\cdot \omega_i) d\omega_i Lo(p,ω0)=∫Ω+Li(p,ωi)V(p,ωi)fr(p,ωi,ωo)max(0,n⋅ωi)dωi(11)
其中,- L i ( p , ω i ) L_i(p, \omega_i) Li(p,ωi)为入射光线
- V ( p , ω i ) V(p,\omega_i) V(p,ωi)为遮挡项
- f r ( p , ω i , ω o ) m a x ( 0 , n ⋅ ω i ) 合 并 称 为 f_r(p, \omega_i, \omega_o)max(0, n\cdot \omega_i)合并称为 fr(p,ωi,ωo)max(0,n⋅ωi)合并称为BRDF项
- 从公式(11)可以看出,只要将入射光线、遮挡项与BRDF项相乘再积分,即可求出当前着色点对应的光照值。
- 公式(11)中的三项都可以进行预计算
-
L
i
(
p
,
ω
i
)
L_i(p, \omega_i)
Li(p,ωi)
- 给定出射光线(屏幕接受的光线,也称观察方向),入射光线为当前着色点所有方向上的光线。即可以使用球面函数描述(该着色为中心的天空盒,即天空盒,因为天空盒是无限远的,在任意位置着色点的光照近似相等)
-
V
(
p
,
ω
i
)
V(p,\omega_i)
V(p,ωi)
- 为当前着色点在所有方向上的遮挡情况(遮挡0,不遮挡1),也可用球面函数描述。一般下半球都是遮挡的。毕竟光照只考虑上半球。
-
f
r
(
p
,
ω
i
,
ω
o
)
m
a
x
(
0
,
n
⋅
ω
i
)
f_r(p, \omega_i, \omega_o)max(0, n\cdot \omega_i)
fr(p,ωi,ωo)max(0,n⋅ωi)
- 当前着色点在各个出射方向上的BRDF也可以使用球面函数描述
-
L
i
(
p
,
ω
i
)
L_i(p, \omega_i)
Li(p,ωi)
- 公式(11)中的三项可以预计算生成天空盒,计算最终的光照只需将三项的天空盒对应的像素相乘,再积分。
- 使用预计算生产天空盒计算光照非常耗时。
- 因为如果计算当前着色点的光照情况,需要计算当前着色点预计算三个天空盒每一个像素相乘的结果再积分。如天空盒分辨率为 64 ∗ 64 64*64 64∗64,则一共需要计算 6 ∗ 64 ∗ 64 ∗ 3 6*64*64*3 6∗64∗64∗3次。
- 论文《Precomputed Radiance Transfer for Real-Time Rendering in Dynamic, Low-Frequency Lighting Environments 》
- 为了降低着色计算成本,引入PRT
- PRT思想
- 首先规定,除光照以外,其他物体不会发生变化。即场景物体不能发生变化。因此,BRDF和visibility都不会变。
- 将公式(11)看作两个部分
- lighting项: L i ( p , ω i ) L_i(p, \omega_i) Li(p,ωi)
- light transport项:
V
(
p
,
ω
i
)
f
r
(
p
,
ω
i
,
ω
o
)
m
a
x
(
0
,
n
⋅
ω
i
)
V(p,\omega_i)f_r(p, \omega_i, \omega_o)max(0, n\cdot \omega_i)
V(p,ωi)fr(p,ωi,ωo)max(0,n⋅ωi)
- light transport 对于任意着色点值是固定值
- 因此在渲染前可以先计算好,也是球面函数。因此也可以用基函数表示。
- light transport 对于任意着色点值是固定值
BRDF Diffuse Case
- 由于diffuse材质的BRDF是常量,因此公式(11)的
f
r
(
p
,
ω
i
,
ω
o
f_r(p, \omega_i, \omega_o
fr(p,ωi,ωo可以从积分中提出。
L o ( p , ω 0 ) = f r ( p , ω i , ω o ) ∫ Ω + L i ( p , ω i ) V ( p , ω i ) m a x ( 0 , n ⋅ ω i ) d ω i (12) \tag{12} L_o(p, \omega_0) = f_r(p, \omega_i, \omega_o) \int_{\varOmega^+}L_i(p, \omega_i)V(p,\omega_i)max(0, n\cdot \omega_i) d\omega_i Lo(p,ω0)=fr(p,ωi,ωo)∫Ω+Li(p,ωi)V(p,ωi)max(0,n⋅ωi)dωi(12)- 光照也可用基函数表示
L ( p , ω i ) ≈ ∑ l n B n ( ω i ) (13) \tag{13} L(p, \omega_i) \approx \sum l_{n}B_n(\omega_i) L(p,ωi)≈∑lnBn(ωi)(13)
其中:- n n n为第 n n n个基函数
- l n l_{n} ln 为光照系数
- B n ( ω i ) B_n(\omega_i) Bn(ωi)为基函数
- 将公式(13)代入公式(12)
L o ( p , ω 0 ) ≈ f r ( p , ω i , ω o ) ∫ Ω + ∑ l n B n ( ω i ) V ( p , ω i ) m a x ( 0 , n ⋅ ω i ) d ω i (14) \tag{14} L_o(p, \omega_0) \approx f_r(p, \omega_i, \omega_o) \int_{\varOmega^+} \sum l_{n}B_n(\omega_i)V(p,\omega_i)max(0, n\cdot \omega_i) d\omega_i Lo(p,ω0)≈fr(p,ωi,ωo)∫Ω+∑lnBn(ωi)V(p,ωi)max(0,n⋅ωi)dωi(14) - 积分符号和求和符号在BRDF下,满足可交换符号的性质。
L o ( p , ω 0 ) ≈ f r ( p , ω i , ω o ) ∑ l n ∫ Ω + B n ( ω i ) V ( p , ω i ) m a x ( 0 , n ⋅ ω i ) d ω i (15) \tag{15} L_o(p, \omega_0) \approx f_r(p, \omega_i, \omega_o) \sum l_{n} \int_{\varOmega^+} B_n(\omega_i)V(p,\omega_i)max(0, n\cdot \omega_i) d\omega_i Lo(p,ω0)≈fr(p,ωi,ωo)∑ln∫Ω+Bn(ωi)V(p,ωi)max(0,n⋅ωi)dωi(15) - 公式(15)积分中的内容可以看作两部分
- B n ( ω i ) B_n(\omega_i) Bn(ωi)为基函数
- V ( p , ω i ) m a x ( 0 , n ⋅ ω i ) V(p,\omega_i)max(0, n\cdot \omega_i) V(p,ωi)max(0,n⋅ωi)为球面函数,
- 因此式(15)积分中的内容可以用公式(10)表示为一组系数
- 由于任何一个light transport 都可以投影到任何一个基函数上,因此可以预计算
- 因此最终着色值只需要计算点乘即可
- 求diffuse材质的光照值公式为:
L o ( p , ω 0 ) ≈ f r ( p , ω i , ω o ) ∑ l n T n (16) \tag{16} L_o(p, \omega_0) \approx f_r(p, \omega_i, \omega_o) \sum l_{n} T_{n} Lo(p,ω0)≈fr(p,ωi,ωo)∑lnTn(16)
其中- T n T_{n} Tn为公式(15)积分部分的预计算结果。(对应拉普拉斯矩阵的谱系数)
- 代价
- 场景不能动,不能移动移除物体。
- 天空盒旋转,即光照旋转可以处理
- 旋转任何一个基函数,都可以用同阶的基函数线性组合来描述
- 基函数性质
- 正交性:投影自己为1,其他都是0
- 任何函数都可以与基函数进行投影,并且可用基函数重构原函数(与调和基性质一样)
- 支持选转
- 旋转任何一个基函数,都可以用同阶的基函数线性组合来描述
- 卷积与频谱性质,低频可描述原函数特征。
- 光照也可用基函数表示
- diffuse 材质的环境光照还可以用另一种方式进行推导
- 依旧将公式(11)看作两个部分。lighting项和light transport项
- 将lighting项用基函数近似
L ( p , ω i ) ≈ ∑ n c n B n ( ω i ) (17) \tag{17} L(p, \omega_i) \approx \sum_n c_{n}B_n(\omega_i) L(p,ωi)≈n∑cnBn(ωi)(17)
其中- c n c_n cn 为lighting项系数、 B n ( ω i ) B_n(\omega_i) Bn(ωi)为基函数
- 将light transport项用基函数近似
T ( p , ω i ) ≈ ∑ m c m B m ( ω i ) (18) \tag{18} T(p, \omega_i) \approx \sum_m c_{m}B_m(\omega_i) T(p,ωi)≈m∑cmBm(ωi)(18)
其中- c m c_m cm 为lighting项系数、 B m ( ω i ) B_m(\omega_i) Bm(ωi)为基函数
- 将公式(17)和公式(18)代入到公式(11)中
L o ( p , ω 0 ) = f r ( p , ω i , ω o ) ∫ Ω + ∑ n c n B n ( ω i ) ∑ m c m B m ( ω i ) d ω i (19) \tag{19} L_o(p, \omega_0) = f_r(p, \omega_i, \omega_o) \int_{\varOmega^+} \sum_n c_{n}B_n(\omega_i)\sum_m c_{m}B_m(\omega_i)d\omega_i Lo(p,ω0)=fr(p,ωi,ωo)∫Ω+n∑cnBn(ωi)m∑cmBm(ωi)dωi(19) - 交换积分和求和符号
L o ( p , ω 0 ) = f r ( p , ω i , ω o ) ∑ n ∑ m ∫ Ω + c n B n ( ω i ) c m B m ( ω i ) d ω i (20) \tag{20} L_o(p, \omega_0) = f_r(p, \omega_i, \omega_o) \sum_n \sum_m \int_{\varOmega^+} c_{n}B_n(\omega_i)c_{m}B_m(\omega_i)d\omega_i Lo(p,ω0)=fr(p,ωi,ωo)n∑m∑∫Ω+cnBn(ωi)cmBm(ωi)dωi(20) - 系数为常量可以从积分中提出
L o ( p , ω 0 ) = f r ( p , ω i , ω o ) ∑ n ∑ m c n c m ∫ Ω + B n ( ω i ) B m ( ω i ) d ω i (21) \tag{21} L_o(p, \omega_0) = f_r(p, \omega_i, \omega_o) \sum_n \sum_m c_{n}c_{m} \int_{\varOmega^+} B_n(\omega_i)B_m(\omega_i)d\omega_i Lo(p,ω0)=fr(p,ωi,ωo)n∑m∑cncm∫Ω+Bn(ωi)Bm(ωi)dωi(21)
- 公式(21)可以看出,其为双重求和问题,是系数 c n c_n cn、系数 c m c_m cm和一个积分相乘再求和
- 利用公式(16)计算光照的时间复杂度为
O
(
n
)
O(n)
O(n), 然而公式(21)的时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)。
- 但是由于SH的正交性,公式(21)中的积分,只有在 B n ( ω i ) = B m ( ω i ) B_n(\omega_i)=B_m(\omega_i) Bn(ωi)=Bm(ωi)是才有值,其他都为0. (可以理解为矩阵中只有对角线有值)。
- 因此公式(21)实际上的时间复杂的也是 O ( n ) O(n) O(n)
BRDF Glossy Case
- Glossy BRDF与Diffuse BRDF的区别
- Diffuse BRDF 是常数,即着色点在任何出射方向的BRDF都一样,与视角无关
- Glossy BRDF,着色点在每个出射方向上有不同的BRDF,与视角相关
- BRDF Diffuse Case中我们可以将BRDF提出(因为是常量),而BRDF Glossy Case不能这样做。但是求解过程大致相同。
- BRDF Glossy Case 环境光照计算推导
- 依旧将公式(11)分为lighting项 和 light transport项
- lighting项
L i ( p , ω i ) (22) \tag{22} L_i(p, \omega_i) Li(p,ωi)(22) - light transport项
V ( p , ω i ) f r ( p , ω i , ω o ) m a x ( 0 , n ⋅ ω i ) (23) \tag{23} V(p,\omega_i)f_r(p, \omega_i, \omega_o)max(0, n\cdot \omega_i) V(p,ωi)fr(p,ωi,ωo)max(0,n⋅ωi)(23) - lighting项用公式(17)近似
- light transport项由于包含BRDF项,因此近似相对复杂。
-
BRDF Diffuse Case 的light transport项是一个二维函数,只跟入射光线相关。而BRDF Glossy Case的light transport项是一个四维函数,跟入射光线和出射光线相关。
- 二维理解:入射光线与light transport项结果形成的矩阵
- 四维理解:入射光线在每个出射光线上light transport项结果形成的体
-
解决方式:
- 先使用SH将light transport近似成关于
ω
o
\omega_o
ωo的函数,即首先带入入射光线
ω
i
\omega_i
ωi求出该方向上所有出射方向的BRDF值(是一个向量)
T i ( p , ω o ) ≈ ∑ m c m B m ( ω o ) (24) \tag{24} T_i(p, \omega_o) \approx \sum_m c_{m}B_m(\omega_o) Ti(p,ωo)≈m∑cmBm(ωo)(24) - 再将公式(24)使用SH近似成 light transport项,
T ( p , ω i , ω o ) ≈ ∑ n c m n B n ( ω i ) (25) \tag{25} T(p, \omega_i,\omega_o) \approx \sum_n c_{mn}B_n(\omega_i) T(p,ωi,ωo)≈n∑cmnBn(ωi)(25)
- 解释:使用公式(24)求入射光线 ω i \omega_i ωi的所有出射光线上的light transport是一个向量,看作一个函数。再用基函数近似,求出一个系数。而对于每个入射光线 ω i \omega_i ωi的每个出射方向 ω o \omega_o ωo都会有一个系数。因此会形成一个系数矩阵,即公式(25)的 c m n c_{mn} cmn
- 每次计算时只使用 c m n c_{mn} cmn中第 n n n列的系数向量做计算,即求 ω o \omega_o ωo方向上的BRDF
- 先使用SH将light transport近似成关于
ω
o
\omega_o
ωo的函数,即首先带入入射光线
ω
i
\omega_i
ωi求出该方向上所有出射方向的BRDF值(是一个向量)
-
- 因此 BRDF Glossy Case 环境光照公式为
L o ( p , ω i , ω 0 ) ≈ ∫ Ω + ∑ k c k B k ( ω i ) ∑ n c m n B n ( ω i ) (26) \tag{26} L_o(p, \omega_i, \omega_0) \approx \int_{\varOmega^+}\sum_k c_{k}B_k(\omega_i) \sum_n c_{mn}B_n(\omega_i) Lo(p,ωi,ω0)≈∫Ω+k∑ckBk(ωi)n∑cmnBn(ωi)(26)
交换积分和求和符号
L o ( p , ω i , ω 0 ) ≈ ∑ k ∑ n c k c m n ∫ Ω + B k ( ω i ) B n ( ω i ) (27) \tag{27} L_o(p,\omega_i, \omega_0) \approx \sum_k\sum_n c_{k}c_{mn}\int_{\varOmega^+}B_k(\omega_i) B_n(\omega_i) Lo(p,ωi,ω0)≈k∑n∑ckcmn∫Ω+Bk(ωi)Bn(ωi)(27)
其中- ∑ k c k B k ( ω i ) \sum_k c_{k}B_k(\omega_i) ∑kckBk(ωi)为光源项
- 代价
- 任何一个着色点都要存系数矩阵(
c
m
n
c_{mn}
cmn)
- 例如用5阶SH,要存25*25的系数矩阵
- 渲染时需要向量与矩阵相乘。计算开销大(diffuse 为点乘计算)
- 任何一个着色点都要存系数矩阵(
c
m
n
c_{mn}
cmn)
总结
- SH 基函数通常使用 3、4、5阶。即9、16、25个基函数
- glossy 需要更多,计算慢,现在的GPU能达到100帧
- 接近镜面反射,SH无法实现
- inter reflection
- PRT可以表示多次bounce的BRDF
- 只适合描述低频
- Follow up works
- 使用其他基函数尽量描述中高频信息
- 预计算更多项
- 动态场景
- 动态材质
- 在半透明合毛发上的应用
- 使用解析解(我感情兴趣的点)
- More basis functions
- Wavelet
- Zonal Harmonics
- Spherical Gaussian (SG)
- Piecewise Constant
- Wavelet
- 二维小波,2D Haar Wavelet
- 定义在一个图形块上
- 不同小波定义域不同
- 定义任意函数,同样可以投影到各种不同小波的基函数上
- 与SH不同
- SH之所以可以紧凑(压缩)的描述一些函数,因为可以截断选择前 n n n阶的SH,就可以恢复出若干频率的原函数
- 小波则是:给定任意二维函数,都必须投影到小波的所有基函数上,但是原函数大多数投影到基函数的系数(值)接近0。因此,取对应系数前 n n n 大的系数,重构原函数。即 a non-linear approximation (非线性近似)
- 与SH不同
- 支持全频率的表示,既可以表示低频,也可以表示高频
- 因为小波定义在图形块上。因此,可以使用CubeMap表示
- 代价
- 不支持快速旋转
- 旋转光照需重新计算系数
- 二维小波,2D Haar Wavelet
小结
本节主要讲,如何使用基函数计算IBL。几乎都是跟频率相关。基函数的具体定义(略)。毕竟相近研究方向出身。