函数 f(x) 在区间 [a,b] 上的定积分
∫
a
b
f
(
x
)
d
x
\int_{a}^{b}f(x)dx
∫abf(x)dx
随机变量
X
i
∼
p
(
x
)
X_{i} \sim p(x)
Xi∼p(x)
得到蒙特卡洛积分为
F
N
=
1
N
∑
i
=
1
N
f
(
X
i
)
p
(
X
i
)
F_{N} = \frac{1}{N} \sum_{i=1}^{N} \frac{f(X_{i})}{p(X_{i})}
FN=N1∑i=1Np(Xi)f(Xi)
二、路径追踪 Path tracing
1.Whitted-Style Ray Tracing’s Problems
只处理镜面或者透明物体的反射和折射,在漫反射时就停止了,忽略了物体之间的反射
在glossy金属材质时,不应该全部都反射
但是 渲染方程是对的
L
r
(
p
,
ω
r
)
L_{r}(p, ω_{r})
Lr(p,ωr) =
L
e
(
p
,
ω
o
)
L_{e}( p, ω_{o})
Le(p,ωo) +
∫
Ω
+
L
r
(
p
,
−
ω
i
)
f
r
(
p
,
ω
i
,
ω
r
)
(
n
⋅
ω
i
)
d
w
i
\int_{Ω^+}^{} L_{r}( p , -ω_{i}) f_{r}( p , ω_{i} ,ω_{r}) ( n \cdot ω_{i})dw_{i}
∫Ω+Lr(p,−ωi)fr(p,ωi,ωr)(n⋅ωi)dwi
2.只考虑直接光照时
L
o
(
p
,
ω
o
)
L_{o}(p, ω_{o})
Lo(p,ωo) =
∫
Ω
+
L
i
(
p
,
ω
i
)
f
r
(
p
,
ω
i
,
ω
o
)
(
n
⋅
ω
i
)
d
w
i
\int_{Ω^+}^{} L_{i}( p , ω_{i}) f_{r}( p , ω_{i} ,ω_{o}) (n\cdotω_{i})dw_{i}
∫Ω+Li(p,ωi)fr(p,ωi,ωo)(n⋅ωi)dwi 用蒙特卡罗积分求解
F
N
=
1
N
∑
i
=
1
N
f
(
X
i
)
p
(
X
i
)
F_{N} = \frac{1}{N} \sum_{i=1}^{N} \frac{f(X_{i})}{p(X_{i})}
FN=N1∑i=1Np(Xi)f(Xi)
f(x) 是
L
i
(
p
,
ω
i
)
f
r
(
p
,
ω
i
,
ω
o
)
(
n
⋅
ω
i
)
L_{i}(p,ω_{i})f_{r}(p,ω_{i},ω_{o})(n\cdotω_{i})
Li(p,ωi)fr(p,ωi,ωo)(n⋅ωi)
pdf(概率密度函数)是 “对半球进行采样”
p
(
ω
i
)
=
1
2
Π
p(ω_{i}) = \frac{1}{2Π}
p(ωi)=2Π1
得到式子
L
o
(
p
,
ω
o
)
L_{o}(p, ω_{o})
Lo(p,ωo) =
1
N
∑
i
=
1
N
L
i
(
p
,
ω
i
)
f
r
(
p
,
ω
i
,
ω
o
)
(
n
⋅
ω
i
)
p
(
ω
i
)
\frac{1}{N} \sum_{i=1}^{N} \frac{L_{i}(p,ω_{i})f_{r}(p,ω_{i},ω_{o})(n\cdotω_{i})}{p(ω_{i})}
N1∑i=1Np(ωi)Li(p,ωi)fr(p,ωi,ωo)(n⋅ωi) 是正确的直接光照公式
3.考虑全局光照
①考虑物体的反射光
Q同样也反射光线到P上(方向上也相当于P到Q点的光)
Q 的直接光照 = Q 到 P 的反射
但是这样做光线会有 指数级增长
假设只有一根光线时(只选择一个方向
ω
i
ω_{i}
ωi )
但递归需要停止,不然计算量无限增加(但又想保证质量)—— 俄罗斯轮盘赌 RR
②俄罗斯轮盘赌 RR (得到正确shade函数)
通过随机概率选择是否继续追踪光线,可以有效地控制光线数量,并避免能量损失过多
实现步骤
设置一个概率 P
以概率 P 发射光线:若随机数< P,则发射并计算光线亮度 Lo
以概率 1-P 不发射光线:若随机数 ≥ P,不发射光线,认为亮度为0
能量补偿:由于第三步会导致能量损失,为了弥补损失,需要将得到的光线亮度 Lo 除以 P,即 Lo/P,可以保证期望值不变
渲染方程在立体角上的积分 Lo =
∫
L
i
⋅
f
r
⋅
c
o
s
d
ω
\int Li\cdot fr\cdot cos dω
∫Li⋅fr⋅cosdω —— 这个积分代表场景中一点的亮度Lo 是半球上 所有方向的光线亮度和反射率的积分
为了使用蒙特卡洛积分来估计场景中一点的亮度Lo,我们需要将渲染方程转化为对光源的积分
数学的转化,需要找到 立体角 dω 和光源表面积 dA 之间的关系 —— 光源面积立体角方向在球面上的投影
立体角的求法:球面面积法
ω
=
S
/
r
2
ω = S/r^2
ω=S/r2 ——
d
ω
=
d
A
c
o
s
θ
′
∣
x
′
−
x
∣
2
dω = \frac{dA cosθ'}{|x'-x|^2}
dω=∣x′−x∣2dAcosθ′
此时重写渲染方程 Lo =
∫
A
L
i
(
x
,
ω
i
)
f
r
(
x
,
ω
i
,
ω
o
)
c
o
s
θ
c
o
s
θ
′
∣
x
′
−
x
∣
2
d
A
\int_{A}^{} L_{i}( x, ω_{i}) f_{r}( x, ω_{i} ,ω_{o})\frac{cosθcosθ'}{|x'-x|^2}dA
∫ALi(x,ωi)fr(x,ωi,ωo)∣x′−x∣2cosθcosθ′dA
可以写出蒙特卡洛积分 f(x) =
L
i
(
x
,
ω
i
)
f
r
(
x
,
ω
i
,
ω
o
)
c
o
s
θ
c
o
s
θ
′
∣
x
′
−
x
∣
2
L_{i}( x, ω_{i}) f_{r}( x, ω_{i} ,ω_{o})\frac{cosθcosθ'}{|x'-x|^2}
Li(x,ωi)fr(x,ωi,ωo)∣x′−x∣2cosθcosθ′,pdf = 1/A
官方文档:https://pytorch.org/docs/stable/generated/torch.Tensor.contiguous.html 其描述contiguous为: Returns a contiguous in memory tensor containing the same data as self tensor. If self tensor is already in the specified memory forma…