[图形学]在半球面上按照微表面模型采样
一、简介
本文介绍了如何根据 pbr 中的法向分布函数(Normal Distribution Function, NDF)在半球上进行采样。
二、微表面模型
在微表面模型理论中,任何宏观上的表面都由无数法向不同的微表面组成。宏观表面的粗糙度越大,各微表面的法向与宏观表面的法向差异越大。宏观表面的粗糙度越小,那么各微表面的法向与宏观表面的法向越一致。如下图所示(左边粗糙度大,右边粗糙度小):
体现在渲染结果中即粗糙度越大,镜面反射越扩散,渲染结果越粗糙如下图所示:
在 pbr 中常使用 法向分布函数(Normal Distribution Function, NDF)描述微表面与宏观表面法向的一致性。NDF函数定义为:单位立体角内,法向为 $h$ 的微表面面积与 宏观表面面积 A 的比
,公式如下:
D
(
h
)
=
d
A
h
A
∗
d
ω
h
D(h) = \frac{dA_h}{A*d\omega_h}
D(h)=A∗dωhdAh
其中,
h
h
h 为半程向量,
h
=
l
+
v
∣
∣
l
+
v
∣
∣
h=\frac{l+v}{||l+v||}
h=∣∣l+v∣∣l+v,
A
A
A为宏观表面的面积,
d
A
h
dA_h
dAh为宏观表面上法向在立体角
ω
h
\omega_h
ωh 内的微表面的面积,函数
D
(
h
)
D(h)
D(h)的单位为
1
s
r
\frac{1}{sr}
sr1。
常用的GGXTR NDF 公式如下:
D
(
h
,
n
,
α
)
=
α
2
π
(
(
n
⋅
h
)
2
(
α
2
−
1
)
+
1
)
2
D(h, n, \alpha) = \frac{\alpha^2}{\pi((n·h)^2(\alpha^2-1)+1)^2}
D(h,n,α)=π((n⋅h)2(α2−1)+1)2α2
其中,
h
h
h 为半程向量,
n
n
n 为宏观表面的法向,
α
\alpha
α为粗糙度。
三、在半球上根据微表面模型采样
在半球上根据微表面模型采样
h
h
h,我们需要按照以下步骤进行:
(1). 确定采样方向
h
h
h 的 pdf 函数,
p
d
f
(
h
)
pdf(h)
pdf(h);
(2). 将半球面上微分
d
ω
h
d\omega_{h}
dωh 变换到微分
d
θ
,
d
ϕ
d\theta, d\phi
dθ,dϕ;
(3). 计算得到关于
θ
\theta
θ 和
ϕ
\phi
ϕ的 pdf 函数,
p
d
f
(
θ
)
,
p
d
f
(
ϕ
)
pdf(\theta), pdf(\phi)
pdf(θ),pdf(ϕ);
(4). 计算对应的 cdf 函数,
c
d
f
(
θ
)
,
c
d
f
(
ϕ
)
cdf(\theta), cdf(\phi)
cdf(θ),cdf(ϕ);
(5). 计算 cdf 函数的逆函数,
c
d
f
−
1
(
θ
)
,
c
d
f
−
1
(
ϕ
)
cdf^{-1}(\theta), cdf^{-1}(\phi)
cdf−1(θ),cdf−1(ϕ);
(6). 采样 [0,1] 范围内部的均匀分布变量
ϵ
1
,
ϵ
2
\epsilon_1,\epsilon_2
ϵ1,ϵ2,那么方向
(
θ
=
c
d
f
−
1
(
ϵ
1
)
,
ϕ
=
c
d
f
−
1
(
ϵ
2
)
)
(\theta=cdf^{-1}(\epsilon_1), \phi=cdf^{-1}(\epsilon_2))
(θ=cdf−1(ϵ1),ϕ=cdf−1(ϵ2)) 即为满足微表面模型的方向。
1. 确定 p d f ( h ) pdf(h) pdf(h)
(1). 为什么 D(h) 不是 pdf(h)
一个需要强调的事情是,函数
D
(
h
)
D(h)
D(h) 并不是
p
d
f
(
h
)
pdf(h)
pdf(h)!!!
这是因为
D
(
h
)
D(h)
D(h) 描述的是,单位立体角内,法向为 $h$ 的微表面面积与 宏观表面面积 A 的比
。
而
p
d
f
(
h
)
pdf(h)
pdf(h) 应该为,单位立体角内,法向为 $h$ 的微表面面积与 总微表面面积 Am 的比
。
如下图所示,很明显 宏观表面面积A 要小于 总微表面面积Am。
我们通过在半球上积分
D
(
h
)
D(h)
D(h) 也可以得到:
∫
Ω
D
(
h
)
d
ω
h
=
∫
Ω
d
A
h
A
∗
d
ω
h
d
ω
h
=
∫
Ω
d
A
h
A
=
A
m
A
\int_{\Omega} D(h) \ d\omega_h = \int_{\Omega} \frac{dA_h}{A*\ d\omega_h}\ d\omega_h = \frac{\int_{\Omega}\ dA_h}{A} = \frac{A_{m}}{A}
∫ΩD(h) dωh=∫ΩA∗ dωhdAh dωh=A∫Ω dAh=AAm
但是
A
A
A 小于
A
m
Am
Am。这说明
D
(
h
)
D(h)
D(h) 不能满足$pdf(h)$ 在定义域上积分等于 1
的要求。
(2). pdf(h) 公式是什么
根据
p
d
f
(
h
)
pdf(h)
pdf(h) 的定义,pdf(h)是:单位立体角内,法向为 $h$ 的微表面面积与 总微表面面积 Am 的比
。
可以得到:
p
d
f
(
h
)
=
d
A
h
∫
Ω
d
A
h
′
=
D
(
h
)
∗
A
∗
d
ω
h
∫
Ω
D
(
h
′
)
∗
A
∗
d
ω
h
′
=
D
(
h
)
∗
A
A
m
=
D
(
h
)
(
A
m
/
A
)
pdf(h) = \frac{dA_{h}}{\int_{\Omega}dA_{h'}} = \frac{D(h)*A*\ d\omega_h}{\int_{\Omega} D(h')*A*d\omega_{h'}} = \frac{D(h)*A}{A_{m}} = \frac{D(h)}{(A_{m}/A)}
pdf(h)=∫ΩdAh′dAh=∫ΩD(h′)∗A∗dωh′D(h)∗A∗ dωh=AmD(h)∗A=(Am/A)D(h)
因此,一个直接的方案是,根据
D
(
h
)
D(h)
D(h),使用数值积分或者计算积分的方法求得
A
m
=
∫
Ω
D
(
h
′
)
∗
A
∗
d
ω
h
′
A_m = \int_{\Omega} D(h')*A*d\omega_{h'}
Am=∫ΩD(h′)∗A∗dωh′,那么理想的
p
d
f
(
h
)
pdf(h)
pdf(h) 即为:
p
d
f
(
h
)
=
D
(
h
)
(
A
m
/
A
)
pdf(h) = \frac{D(h)}{(A_m/A)}
pdf(h)=(Am/A)D(h)
现在我们已经知道应该如根据给定的
D
(
h
)
D(h)
D(h)计算理想的
p
d
f
(
h
)
pdf(h)
pdf(h) 了,只要简单的求解一个数值积分
A
m
=
∫
Ω
D
(
h
′
)
∗
A
∗
d
ω
h
′
A_m = \int_{\Omega} D(h')*A*d\omega_{h'}
Am=∫ΩD(h′)∗A∗dωh′ 即可。
可是问题是,求解积分
A
m
=
∫
Ω
D
(
h
′
)
∗
A
∗
d
ω
h
′
A_m = \int_{\Omega} D(h')*A*d\omega_{h'}
Am=∫ΩD(h′)∗A∗dωh′ 有时候并不是一个简单的问题,尤其是
D
(
h
)
D(h)
D(h) 还跟粗糙度
α
\alpha
α相关。
(3). 一个近似的 pdf’(h)
根据前面的分析,根据 D ( h ) D(h) D(h) 求理想的 p d f ( h ) pdf(h) pdf(h) 似乎并不是一个可行的方案,我们得重新思考下为什么需要 p d f ( h ) pdf(h) pdf(h)。
这是因为在 重要性采样 中,我们需要根据蒙特卡洛采样方法,利用数值积分方法求解渲染方程:
L
(
p
,
w
o
)
=
∫
(
k
d
c
π
+
D
∗
G
∗
F
4
(
n
⋅
ω
i
)
(
n
⋅
ω
o
)
)
∗
L
(
p
,
ω
i
)
∗
(
n
⋅
ω
i
)
d
ω
i
=
∫
k
d
c
π
∗
L
(
p
,
ω
i
)
∗
(
n
⋅
ω
i
)
d
ω
i
+
∫
D
∗
G
∗
F
4
(
n
⋅
ω
i
)
(
n
⋅
ω
o
)
∗
L
(
p
,
ω
i
)
∗
(
n
⋅
ω
i
)
d
ω
i
L(p,wo) = \int (kd\frac{c}{\pi} + \frac{D*G*F}{4(n·\omega i)(n·\omega o)})* L(p,\omega i)*(n·\omega i)\ d\omega i \\ = \int kd\frac{c}{\pi} * L(p,\omega i)*(n·\omega i)\ d\omega i\ +\ \int \frac{D*G*F}{4(n·\omega i)(n·\omega o)} * L(p,\omega i)*(n·\omega i)\ d\omega i
L(p,wo)=∫(kdπc+4(n⋅ωi)(n⋅ωo)D∗G∗F)∗L(p,ωi)∗(n⋅ωi) dωi=∫kdπc∗L(p,ωi)∗(n⋅ωi) dωi + ∫4(n⋅ωi)(n⋅ωo)D∗G∗F∗L(p,ωi)∗(n⋅ωi) dωi
我们主要关注的是镜面反射部分,即:
L
s
(
p
,
w
o
)
=
∫
D
∗
G
∗
F
4
(
n
⋅
ω
i
)
(
n
⋅
ω
o
)
∗
L
(
p
,
ω
i
)
∗
(
n
⋅
ω
i
)
d
ω
i
Ls(p,wo) = \int \frac{D*G*F}{4(n·\omega i)(n·\omega o)} * L(p,\omega i)*(n·\omega i)\ d\omega i
Ls(p,wo)=∫4(n⋅ωi)(n⋅ωo)D∗G∗F∗L(p,ωi)∗(n⋅ωi) dωi
我们想要根据一定的
p
d
f
′
(
h
)
pdf'(h)
pdf′(h),对
h
h
h 进行采样,再利用蒙特卡洛积分方法可以得到上述积分公式的值:
L
s
(
p
,
w
o
)
≈
1
N
∑
D
∗
G
∗
F
4
(
n
⋅
ω
i
)
(
n
⋅
ω
o
)
∗
L
(
p
,
ω
i
)
∗
(
n
⋅
ω
i
)
p
d
f
′
(
h
)
Ls(p,wo) \approx \frac{1}{N} \sum \frac{\frac{D*G*F}{4(n·\omega i)(n·\omega o)} * L(p,\omega i)*(n·\omega i)}{pdf'(h)}
Ls(p,wo)≈N1∑pdf′(h)4(n⋅ωi)(n⋅ωo)D∗G∗F∗L(p,ωi)∗(n⋅ωi)
其中
ω
i
\omega i
ωi 可以根据采样得到的
h
h
h 和
ω
o
\omega o
ωo 计算得到。
该
p
d
f
′
(
h
)
pdf'(h)
pdf′(h) 需要满足以下条件:
- 🎯积分为1,即 ∫ p d f ′ ( h ) d ω h = 1 \int pdf'(h)\ d\omega_h = 1 ∫pdf′(h) dωh=1;
- 🎯 p d f ′ ( h ) pdf'(h) pdf′(h) 最好等于 D ( h ) ∗ f ′ ( h ) D(h)*f'(h) D(h)∗f′(h)。其中 f ′ ( h ) f'(h) f′(h) 是一个简单的函数形式或者定值 C C C,这样可以消去蒙特卡洛积分中分子里的 D D D 项;
回到我们之间讲的微表面理论中,我们将微表面
d
A
h
dA_h
dAh 从
−
n
-n
−n 方向投影到 宏观表面 上可以得到(乘以
n
⋅
h
n·h
n⋅h即为对微表面进行投影):
∫
(
n
⋅
h
)
d
A
h
=
A
\int (n·h)\ dA_h = A
∫(n⋅h) dAh=A
即:
∫
D
(
h
)
∗
A
∗
(
n
⋅
h
)
d
ω
h
=
A
\int D(h) * A * (n·h) d\omega_h = A
∫D(h)∗A∗(n⋅h)dωh=A
那么:
∫
D
(
h
)
∗
(
n
⋅
h
)
d
ω
h
=
1
\int D(h)* (n·h)\ d\omega_h = 1
∫D(h)∗(n⋅h) dωh=1
假如我们令
p
d
f
′
(
h
)
=
D
(
h
)
∗
(
n
⋅
h
)
pdf'(h) = D(h)*(n·h)
pdf′(h)=D(h)∗(n⋅h),就正好满足刚刚我们提到的两个条件:
- ✅积分值为1;
- ✅是 D ( h ) ∗ f ( h ) D(h)*f(h) D(h)∗f(h)的形式。
因此我们可以按照 p d f ′ ( h ) = D ( h ) ∗ ( n ⋅ h ) pdf'(h)= D(h)*(n·h) pdf′(h)=D(h)∗(n⋅h) 对 h h h 进行采样(以下为了方便,将 p d f ′ ( h ) pdf'(h) pdf′(h)写作 p d f ( h ) pdf(h) pdf(h)),这样得到的半程向量 h h h 既能保证在半球上积分值为1,又能便于在蒙特卡洛积分中根据 D D D 分布进行重要性采样,降低方差,加快收敛速度。
2. 微分 d ω h d\omega_{h} dωh 变换到 d θ , d ϕ d\theta, d\phi dθ,dϕ
根据上面的介绍我们已经确定,采样
h
h
h 的
p
d
f
(
h
)
=
D
(
h
)
∗
(
n
⋅
h
)
pdf(h) = D(h)*(n·h)
pdf(h)=D(h)∗(n⋅h)。因为在半球上采样方向
h
h
h 是通过采样角度球面坐标上的
θ
,
ϕ
\theta,\phi
θ,ϕ 得到的,因此在采样时我们需要将半球上的方向向量
h
h
h 转为球面坐标系上的坐标
(
θ
,
ϕ
)
(\theta,\phi)
(θ,ϕ)。
因为:
d
ω
h
=
s
i
n
(
θ
)
d
θ
d
ϕ
d\omega_{h} = sin(\theta)\ d\theta d\phi
dωh=sin(θ) dθdϕ
因此:
∫
Ω
+
p
d
f
(
h
)
d
ω
h
=
∫
0
2
π
∫
0
π
/
2
p
d
f
(
θ
,
ϕ
)
∗
s
i
n
(
θ
)
d
θ
d
ϕ
\int_{\Omega^+} pdf(h) d\omega_h = \int_{0}^{2\pi} \int_{0}^{\pi/2} pdf(\theta,\phi)*sin(\theta)\ d\theta d\phi
∫Ω+pdf(h)dωh=∫02π∫0π/2pdf(θ,ϕ)∗sin(θ) dθdϕ
根据
p
d
f
(
h
)
=
D
(
h
)
∗
(
n
⋅
h
)
pdf(h)=D(h)*(n·h)
pdf(h)=D(h)∗(n⋅h) 采样
h
h
h,可以通过根据
p
d
f
(
θ
,
ϕ
)
∗
s
i
n
(
θ
)
=
D
(
θ
,
ϕ
)
∗
c
o
s
(
θ
)
∗
s
i
n
(
θ
)
pdf(\theta, \phi)*sin(\theta)=D(\theta,\phi)*cos(\theta)*sin(\theta)
pdf(θ,ϕ)∗sin(θ)=D(θ,ϕ)∗cos(θ)∗sin(θ) 采样 (
θ
,
ϕ
\theta, \phi
θ,ϕ) 得到。
3. 计算边缘概率密度 p d f ( θ ) , p d f ( ϕ ) pdf(\theta), pdf(\phi) pdf(θ),pdf(ϕ)
边缘概率密度
p
d
f
(
θ
)
pdf(\theta)
pdf(θ):
p
d
f
(
θ
)
=
∫
0
2
π
p
d
f
(
θ
,
ϕ
)
∗
s
i
n
(
θ
)
d
ϕ
=
∫
0
2
π
D
(
θ
,
ϕ
)
∗
c
o
s
(
θ
)
∗
s
i
n
(
θ
)
d
ϕ
=
∫
0
2
π
α
2
π
(
c
o
s
2
(
θ
)
(
α
2
−
1
)
+
1
)
2
∗
c
o
s
(
θ
)
∗
s
i
n
(
θ
)
d
ϕ
=
2
α
2
∗
c
o
s
(
θ
)
∗
s
i
n
(
θ
)
(
c
o
s
2
(
θ
)
(
α
2
−
1
)
+
1
)
2
pdf(\theta) = \int_{0}^{2\pi}pdf(\theta,\phi)*sin(\theta)d\phi \\ =\int_{0}^{2\pi} D(\theta,\phi)*cos(\theta)*sin(\theta) d\phi \\ = \int_{0}^{2\pi} \frac{\alpha^2}{\pi(cos^2(\theta)(\alpha^2-1)+1)^2} * cos(\theta) * sin(\theta) d\phi \\ = \frac{2\alpha^2*cos(\theta)*sin(\theta)}{(cos^2(\theta)(\alpha^2-1)+1)^2}
pdf(θ)=∫02πpdf(θ,ϕ)∗sin(θ)dϕ=∫02πD(θ,ϕ)∗cos(θ)∗sin(θ)dϕ=∫02ππ(cos2(θ)(α2−1)+1)2α2∗cos(θ)∗sin(θ)dϕ=(cos2(θ)(α2−1)+1)22α2∗cos(θ)∗sin(θ)
边缘概率密度
p
d
f
(
ϕ
)
pdf(\phi)
pdf(ϕ):
p
d
f
(
ϕ
)
=
∫
0
π
/
2
p
d
f
(
θ
,
ϕ
)
∗
s
i
n
(
θ
)
d
θ
=
∫
0
π
/
2
D
(
θ
,
ϕ
)
∗
c
o
s
(
θ
)
∗
s
i
n
(
θ
)
d
θ
=
∫
0
π
/
2
α
2
π
(
c
o
s
2
(
θ
)
(
α
2
−
1
)
+
1
)
2
∗
c
o
s
(
θ
)
∗
s
i
n
(
θ
)
d
θ
=
α
2
2
π
∫
π
/
2
0
d
(
c
o
s
2
(
θ
)
)
(
c
o
s
2
(
θ
)
(
α
2
−
1
)
+
1
)
2
=
α
2
2
π
∫
0
1
d
t
(
(
α
2
−
1
)
t
+
1
)
2
=
α
2
2
π
(
α
2
−
1
)
∫
1
α
2
d
x
x
2
=
α
2
2
π
(
α
2
−
1
)
∗
(
1
x
)
∣
α
2
1
=
1
2
π
pdf(\phi) = \int_{0}^{\pi/2} pdf(\theta,\phi) * sin(\theta)\ d\theta \\ =\int_{0}^{\pi/2} D(\theta,\phi)*cos(\theta)*sin(\theta) d\theta \\ = \int_{0}^{\pi/2} \frac{\alpha^2}{\pi(cos^2(\theta)(\alpha^2-1)+1)^2} * cos(\theta) * sin(\theta) d\theta \\ = \frac{\alpha^2}{2\pi}\int_{\pi/2}^{0}\frac{d(cos^2(\theta))}{(cos^2(\theta)(\alpha^2-1)+1)^2} \\ =\frac{\alpha^2}{2\pi}\int_{0}^{1}\frac{dt}{((\alpha^2-1)t+1)^2} \\ =\frac{\alpha^2}{2\pi(\alpha^2-1)}\int_{1}^{\alpha^2}\frac{dx}{x^2} \\ = \frac{\alpha^2}{2\pi(\alpha^2-1)} * (\frac{1}{x})|^{1}_{\alpha^2} \\ = \frac{1}{2\pi}
pdf(ϕ)=∫0π/2pdf(θ,ϕ)∗sin(θ) dθ=∫0π/2D(θ,ϕ)∗cos(θ)∗sin(θ)dθ=∫0π/2π(cos2(θ)(α2−1)+1)2α2∗cos(θ)∗sin(θ)dθ=2πα2∫π/20(cos2(θ)(α2−1)+1)2d(cos2(θ))=2πα2∫01((α2−1)t+1)2dt=2π(α2−1)α2∫1α2x2dx=2π(α2−1)α2∗(x1)∣α21=2π1
4. 计算 c d f ( θ ) , p d f ( ϕ ) cdf(\theta), pdf(\phi) cdf(θ),pdf(ϕ)
计算
c
d
f
(
θ
)
cdf(\theta)
cdf(θ):
c
d
f
(
θ
)
=
∫
0
θ
p
d
f
(
t
)
d
t
=
∫
0
t
2
α
2
∗
c
o
s
(
t
)
∗
s
i
n
(
t
)
(
c
o
s
2
(
t
)
(
α
2
−
1
)
+
1
)
2
d
t
=
α
2
∫
θ
0
d
c
o
s
2
t
(
(
α
2
−
1
)
c
o
s
2
t
+
1
)
2
cdf(\theta) = \int_{0}^{\theta} pdf(t) dt \\ =\int_{0}^{t} \frac{2\alpha^2*cos(t)*sin(t)}{(cos^2(t)(\alpha^2-1)+1)^2} dt \\ =\alpha^2 \int_{\theta}^{0} \frac{dcos^2t}{((\alpha^2-1)cos^2t+1)^2}
cdf(θ)=∫0θpdf(t)dt=∫0t(cos2(t)(α2−1)+1)22α2∗cos(t)∗sin(t)dt=α2∫θ0((α2−1)cos2t+1)2dcos2t
令
x
=
(
α
2
−
1
)
c
o
s
2
t
+
1
x=(\alpha^2-1)cos^2t+1
x=(α2−1)cos2t+1,那么:
c
d
f
(
θ
)
=
α
2
∫
θ
0
d
c
o
s
2
t
(
(
α
2
−
1
)
c
o
s
2
t
+
1
)
2
=
α
2
(
α
2
−
1
)
∫
(
α
2
−
1
)
c
o
s
2
θ
+
1
α
2
d
x
x
2
=
α
2
(
α
2
−
1
)
∗
(
1
x
)
∣
α
2
(
α
2
−
1
)
c
o
s
2
θ
+
1
=
α
2
(
α
2
−
1
)
2
c
o
s
2
θ
+
(
α
2
−
1
)
−
1
α
2
−
1
cdf(\theta) = \alpha^2 \int_{\theta}^{0} \frac{dcos^2t}{((\alpha^2-1)cos^2t+1)^2} \\ =\frac{\alpha^2}{(\alpha^2-1)} \int_{(\alpha^2-1)cos^2\theta+1}^{\alpha^2}\frac{dx}{x^2} \\ =\frac{\alpha^2}{(\alpha^2-1)}*(\frac{1}{x})|^{(\alpha^2-1)cos^2\theta+1}_{\alpha^2} \\ = \frac{\alpha^2}{(\alpha^2-1)^2cos^2\theta+(\alpha^2-1)} - \frac{1}{\alpha^2-1}
cdf(θ)=α2∫θ0((α2−1)cos2t+1)2dcos2t=(α2−1)α2∫(α2−1)cos2θ+1α2x2dx=(α2−1)α2∗(x1)∣α2(α2−1)cos2θ+1=(α2−1)2cos2θ+(α2−1)α2−α2−11
计算
c
d
f
(
ϕ
)
cdf(\phi)
cdf(ϕ):
c
d
f
(
ϕ
)
=
∫
0
ϕ
p
d
f
(
ϕ
)
d
ϕ
=
∫
0
ϕ
1
2
π
d
ϕ
=
ϕ
2
π
cdf(\phi) = \int_{0}^{\phi}pdf(\phi)d\phi \\ =\int_{0}^{\phi}\frac{1}{2\pi}d\phi\\ =\frac{\phi}{2\pi}
cdf(ϕ)=∫0ϕpdf(ϕ)dϕ=∫0ϕ2π1dϕ=2πϕ
5. 计算 c d f − 1 ( θ ) , c d f − 1 ( ϕ ) cdf^{-1}(\theta), cdf^{-1}(\phi) cdf−1(θ),cdf−1(ϕ)
计算
c
d
f
−
1
(
θ
)
cdf^{-1}(\theta)
cdf−1(θ):
c
d
f
−
1
(
θ
)
=
a
r
c
c
o
s
1
−
θ
θ
(
α
2
−
1
)
+
1
cdf^{-1}(\theta) = arccos\sqrt{\frac{1-\theta}{\theta(\alpha^2-1)+1}}
cdf−1(θ)=arccosθ(α2−1)+11−θ
计算
c
d
f
−
1
(
ϕ
)
cdf^{-1}(\phi)
cdf−1(ϕ):
c
d
f
−
1
(
ϕ
)
=
2
π
ϕ
cdf^{-1}(\phi) = 2\pi\phi
cdf−1(ϕ)=2πϕ
6. 采样均匀随机变量 ϵ 1 , ϵ 2 \epsilon_1, \epsilon_2 ϵ1,ϵ2 得到目标方向 ( θ , ϕ ) (\theta, \phi) (θ,ϕ)
根据
c
d
f
−
1
(
θ
)
cdf^{-1}(\theta)
cdf−1(θ) 和
c
d
f
−
1
(
ϕ
)
cdf^{-1}(\phi)
cdf−1(ϕ),我们可以在 [0,1] 范围内随机采样得到随机变量
ϵ
1
,
ϵ
2
\epsilon_1, \epsilon_2
ϵ1,ϵ2。
那么,
(
θ
=
c
d
f
−
1
(
ϵ
1
)
,
ϕ
=
c
d
f
−
1
(
ϵ
2
)
)
(\theta=cdf^{-1}(\epsilon_1), \phi=cdf^{-1}(\epsilon_2))
(θ=cdf−1(ϵ1),ϕ=cdf−1(ϵ2))
即为满足概率分布
p
d
f
(
θ
,
ϕ
)
∗
s
i
n
(
θ
)
=
D
(
θ
,
ϕ
)
∗
c
o
s
(
θ
)
∗
s
i
n
(
θ
)
pdf(\theta, \phi)*sin(\theta)=D(\theta,\phi)*cos(\theta)*sin(\theta)
pdf(θ,ϕ)∗sin(θ)=D(θ,ϕ)∗cos(θ)∗sin(θ) 的 (
θ
,
ϕ
\theta, \phi
θ,ϕ),那么对应的
h
h
h 也满足我们的目标概率密度分布
p
d
f
(
h
)
=
D
(
h
)
∗
(
n
⋅
h
)
pdf(h)=D(h)*(n·h)
pdf(h)=D(h)∗(n⋅h)。
7. 实现代码
在 UE 中对GGX 法向分布根据 p d f ( h ) = D ( h ) ∗ ( n ⋅ h ) pdf(h)=D(h)*(n·h) pdf(h)=D(h)∗(n⋅h) 的重要性采样实现如下Github-EpicGames-UnrealEngine:
// PDF = D * NoH / (4 * VoH)
float4 ImportanceSampleGGX( float2 E, float a2 )
{
float Phi = 2 * PI * E.x;
float CosTheta = sqrt( (1 - E.y) / ( 1 + (a2 - 1) * E.y ) );
float SinTheta = sqrt( 1 - CosTheta * CosTheta );
float3 H;
H.x = SinTheta * cos( Phi );
H.y = SinTheta * sin( Phi );
H.z = CosTheta;
float d = ( CosTheta * a2 - CosTheta ) * CosTheta + 1;
float D = a2 / ( PI*d*d );
float PDF = D * CosTheta;
return float4( H, PDF );
}
四、参考引用
[1].GGX重要性采样-博客园
[2].How Is The NDF Really Defined?
[3].Sampling Microfacet BRDF