当前位置: 首页 > article >正文

[图形学]在半球面上按照微表面模型采样

一、简介

本文介绍了如何根据 pbr 中的法向分布函数(Normal Distribution Function, NDF)在半球上进行采样。

二、微表面模型

在微表面模型理论中,任何宏观上的表面都由无数法向不同的微表面组成。宏观表面的粗糙度越大,各微表面的法向与宏观表面的法向差异越大。宏观表面的粗糙度越小,那么各微表面的法向与宏观表面的法向越一致。如下图所示(左边粗糙度大,右边粗糙度小):
粗糙度示意图
体现在渲染结果中即粗糙度越大,镜面反射越扩散,渲染结果越粗糙如下图所示:
粗糙度从0.1到1.0变化
在 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)=Adω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,α)=π((nh)2(α21)+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) cdf1(θ),cdf1(ϕ)
(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)) (θ=cdf1(ϵ1),ϕ=cdf1(ϵ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)=ΩdAhdAh=ΩD(h)AdωhD(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)Adω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)Adωh 即可。
可是问题是,求解积分 A m = ∫ Ω D ( h ′ ) ∗ A ∗ d ω h ′ A_m = \int_{\Omega} D(h')*A*d\omega_{h'} Am=ΩD(h)Adω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)DGF)L(p,ωi)(nωi) dωi=kdπcL(p,ωi)(nωi) dωi + 4(nωi)(nωo)DGFL(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)DGFL(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)N1pdf(h)4(nωi)(nωo)DGFL(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 nh即为对微表面进行投影):
∫ ( n ⋅ h )   d A h = A \int (n·h)\ dA_h = A (nh) dAh=A
即:
∫ D ( h ) ∗ A ∗ ( n ⋅ h ) d ω h = A \int D(h) * A * (n·h) d\omega_h = A D(h)A(nh)dωh=A
那么:
∫ D ( h ) ∗ ( n ⋅ h )   d ω h = 1 \int D(h)* (n·h)\ d\omega_h = 1 D(h)(nh) dωh=1
假如我们令 p d f ′ ( h ) = D ( h ) ∗ ( n ⋅ h ) pdf'(h) = D(h)*(n·h) pdf(h)=D(h)(nh),就正好满足刚刚我们提到的两个条件:

  • ✅积分值为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)(nh) 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)(nh)。因为在半球上采样方向 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)(nh) 采样 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(θ)(α21)+1)2α2cos(θ)sin(θ)dϕ=(cos2(θ)(α21)+1)22α2cos(θ)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(θ)(α21)+1)2α2cos(θ)sin(θ)dθ=2πα2π/20(cos2(θ)(α21)+1)2d(cos2(θ))=2πα201((α21)t+1)2dt=2π(α21)α21α2x2dx=2π(α21)α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)(α21)+1)22α2cos(t)sin(t)dt=α2θ0((α21)cos2t+1)2dcos2t
x = ( α 2 − 1 ) c o s 2 t + 1 x=(\alpha^2-1)cos^2t+1 x=(α21)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((α21)cos2t+1)2dcos2t=(α21)α2(α21)cos2θ+1α2x2dx=(α21)α2(x1)α2(α21)cos2θ+1=(α21)2cos2θ+(α21)α2α211
计算 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) cdf1(θ),cdf1(ϕ)

计算 c d f − 1 ( θ ) cdf^{-1}(\theta) cdf1(θ)
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}} cdf1(θ)=arccosθ(α21)+11θ
计算 c d f − 1 ( ϕ ) cdf^{-1}(\phi) cdf1(ϕ)
c d f − 1 ( ϕ ) = 2 π ϕ cdf^{-1}(\phi) = 2\pi\phi cdf1(ϕ)=2πϕ

6. 采样均匀随机变量 ϵ 1 , ϵ 2 \epsilon_1, \epsilon_2 ϵ1,ϵ2 得到目标方向 ( θ , ϕ ) (\theta, \phi) (θ,ϕ)

根据 c d f − 1 ( θ ) cdf^{-1}(\theta) cdf1(θ) c d f − 1 ( ϕ ) cdf^{-1}(\phi) cdf1(ϕ),我们可以在 [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)) (θ=cdf1(ϵ1),ϕ=cdf1(ϵ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)(nh)

7. 实现代码

在 UE 中对GGX 法向分布根据 p d f ( h ) = D ( h ) ∗ ( n ⋅ h ) pdf(h)=D(h)*(n·h) pdf(h)=D(h)(nh) 的重要性采样实现如下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


http://www.kler.cn/a/601139.html

相关文章:

  • 个人博客系统系统~测试报告
  • 【机器学习】什么是随机森林?
  • PCL 点云多平面探测
  • Vue项目的 Sass 全局基础样式格式化方案,包含常见元素的样式重置
  • zynq7020 最小ps环境速通
  • 数据库三级填空+应用题(1)
  • S32K144外设实验(七):FTM输出多路互补带死区PWM
  • 简洁、实用、无插件和更安全为特点的WordPress主题
  • PDF与Markdown的量子纠缠:一场由VLM导演的文档界奇幻秀
  • Android设计模式之工厂方法模式
  • 西门子 CPU 1513-1 PN TCP Server 接收字符串前多了一个问号
  • Chrome(Google) 浏览器安装Vue2、Vue3 Devtools插件方法
  • 前端解决方案:实现网页截图并导出PDF功能
  • STC32单片机驱动UC1705X点阵屏调试VLCD没升压显示拖影
  • [7-01-03].SpringBoot3集成MinIo
  • Pytorch使用手册—计算机视觉领域的量化迁移学习教程(专题六十三)
  • 【大模型】数字人 EchoMimicV2 的环境配置和使用
  • 哈希表简单例子
  • Node.js 模块加载机制--详解
  • Javaweb后端登录会话技术jwt令牌