UE中皮肤渲染采用的是Separable Subsurface Scattering和Burley Normalize SSS,本节我们先从理论上了解一下BSSRDF,接着分析以下Separable Subsurface Scattering和Burley Normalize SSS算法,并对UE中的实现进行分析。
渲染方程
BRDF
先从最熟悉的BRDF开始,假设表面上有一个点
p
p
p,来自
w
i
w_i
wi方向的radiance是
L
i
L_i
Li,那么
d
L
=
d
Φ
d
A
T
d
w
=
d
E
c
o
s
θ
d
A
dL=\frac{d\Phi}{dA^Tdw}=\frac{dE}{cos\theta dA}
dL=dATdwdΦ=cosθdAdE
=>
d
E
(
p
,
w
i
)
=
L
i
(
p
,
w
i
)
c
o
s
θ
i
d
w
i
dE(p,w_i)=L_i(p,w_i)cos\theta_idw_i
dE(p,wi)=Li(p,wi)cosθidwi
假设出射的radiacne L o L_o Lo符合下面的式子: d L ( p , w o ) ∝ d E ( p , w i ) dL(p,w_o)\propto dE(p,w_i) dL(p,wo)∝dE(p,wi)。这样就得到了 f r = d L ( p , w o ) d E ( p , w i ) = d L ( p , w o ) L i ( p , w i ) c o s θ i d w i f_r=\frac{dL(p,w_o)}{dE(p,w_i)}=\frac{dL(p,w_o)}{L_i(p,w_i)cos\theta_idw_i} fr=dE(p,wi)dL(p,wo)=Li(p,wi)cosθidwidL(p,wo),从这几个式子可以看出 f r f_r fr位置上只与p点有关,p点接受入射光并反射到对应方向。
L
o
=
=
∫
S
2
f
r
(
p
,
w
i
,
w
o
)
L
i
(
p
,
w
i
)
∣
c
o
s
θ
i
∣
d
w
i
L_o==\int_{S^2}f_r(p,w_i,w_o)L_i(p,w_i)|cos\theta_i|dw_i
Lo==∫S2fr(p,wi,wo)Li(p,wi)∣cosθi∣dwi
它的积分区域在整个球面上,是一个二维的积分
BSSRDF
BSSRDF与BRDF不同的是,在BSSRDF,光线在材质内部进行多次散射并最终离开材质内部,所以它的入射点和初始点不同。光线在内部的过程我们先不考虑,只考虑进出这两个关键点。
S
(
p
i
,
p
o
,
w
i
,
w
o
)
=
d
L
(
p
o
,
w
o
)
d
E
(
p
i
,
w
i
)
S(p_i,p_o,w_i,w_o)=\frac{dL(p_o,w_o)}{dE(p_i,w_i)}
S(pi,po,wi,wo)=dE(pi,wi)dL(po,wo)
先朴素地思考如何计算一个点
p
o
p_o
po的次表面散射,首先在整个表面上采样一点
p
i
p_i
pi,对
p
i
p_i
pi上半球方向采样,根据出入点和出入方向计算S,并累加到最终结果上。之后再将整个表面的的样本累加。也就是对整个表面上的点采样,在对采样点的整个半球采样,这样维度就从原来整个半球的两维变成四维。
L
o
=
∫
A
∫
H
2
(
n
)
S
(
p
i
,
p
o
,
w
i
,
w
o
)
L
i
(
p
,
w
i
)
∣
c
o
s
θ
i
∣
d
w
i
d
A
L_o=\int_A\int_{H^2(n)}S(p_i,p_o,w_i,w_o)L_i(p,w_i)|cos\theta_i|dw_idA
Lo=∫A∫H2(n)S(pi,po,wi,wo)Li(p,wi)∣cosθi∣dwidA
Separable BSSRDFs
光线在材质内部的传播是一个很复杂的过程,我们把这个过程分为三个部分,第一部分是光线从p进入此表面内部,进入到表面内部的能量是
1
−
F
1-F
1−F,这里的F是菲涅尔项,在加一个缩放系数就得到:
S
w
(
w
i
)
=
1
−
F
r
(
c
o
s
θ
i
)
c
π
S_{w}(w_i)=\frac{1-F_r(cos\theta_i)}{c\pi}
Sw(wi)=cπ1−Fr(cosθi)
归一化系数逆推得到:
∫
H
2
S
w
(
w
)
c
o
s
θ
d
w
=
1
\int_{H^2} S_{w}(w)cos\theta dw=1
∫H2Sw(w)cosθdw=1
=>
c
=
∫
0
2
π
∫
0
π
2
1
−
F
r
(
c
o
s
θ
)
π
s
i
n
θ
c
o
s
θ
d
θ
d
ϕ
c=\int_0^{2\pi}\int_0^{\frac{\pi}{2}}\frac{1-F_r(cos\theta)}{\pi}sin\theta cos\theta d\theta d\phi
c=∫02π∫02ππ1−Fr(cosθ)sinθcosθdθdϕ
=>
1
−
2
∫
0
π
2
1
−
F
r
(
c
o
s
θ
)
s
i
n
θ
c
o
s
θ
d
θ
d
ϕ
1-2\int_0^{\frac{\pi}{2}}1-F_r(cos\theta)sin\theta cos\theta d\theta d\phi
1−2∫02π1−Fr(cosθ)sinθcosθdθdϕ
光线进入到材质内部之后会进行多次散射,这一部分的过程非常难建模,其实在后面会提到的几种实时渲染算法都是在对这部分过程进行建模,我们先忽略掉这一过程,把这一过程剩下能量的比率记为:
S
p
(
p
o
,
p
i
)
S_p(p_o,p_i)
Sp(po,pi)
接着进一步假设这个表面是个平面,并且这个比率只与两者的距离有关。
S
p
(
p
o
,
p
i
)
≈
S
r
(
∣
∣
p
o
−
p
i
∣
∣
)
S_p(p_o,p_i)\approx S_r(||p_o-p_i||)
Sp(po,pi)≈Sr(∣∣po−pi∣∣)
第三个过程是光线从材质内部出来,这一部分和第一个过程类似,即:
1
−
F
r
(
c
o
s
θ
o
)
1-F_r(cos\theta_o)
1−Fr(cosθo)
这样整个方程就变成下面的样子
L
o
=
∫
A
∫
H
2
(
n
)
S
(
p
i
,
p
o
,
w
i
,
w
o
)
L
i
(
p
,
w
i
)
∣
c
o
s
θ
i
∣
d
w
i
d
A
L_o=\int_A\int_{H^2(n)}S(p_i,p_o,w_i,w_o)L_i(p,w_i)|cos\theta_i|dw_idA
Lo=∫A∫H2(n)S(pi,po,wi,wo)Li(p,wi)∣cosθi∣dwidA
=
∫
A
∫
H
2
(
n
)
(
1
−
F
r
(
c
o
s
θ
o
)
)
(
S
r
(
∣
∣
p
o
−
p
i
∣
∣
)
)
(
1
−
F
r
(
c
o
s
θ
)
π
)
L
i
(
p
,
w
i
)
∣
c
o
s
θ
i
∣
d
w
i
d
A
=\int_A\int_{H^2(n)}(1-F_r(cos\theta_o))(S_r(||p_o-p_i||))(\frac{1-F_r(cos\theta)}{\pi})L_i(p,w_i)|cos\theta_i|dw_idA
=∫A∫H2(n)(1−Fr(cosθo))(Sr(∣∣po−pi∣∣))(π1−Fr(cosθ))Li(p,wi)∣cosθi∣dwidA
=
(
1
−
F
r
(
c
o
s
θ
o
)
)
∫
A
(
S
r
(
∣
∣
p
o
−
p
i
∣
∣
)
)
∫
H
2
(
n
)
(
1
−
F
r
(
c
o
s
θ
)
π
)
L
i
(
p
,
w
i
)
∣
c
o
s
θ
i
∣
d
w
i
d
A
=(1-F_r(cos\theta_o))\int_A(S_r(||p_o-p_i||))\int_{H^2(n)}(\frac{1-F_r(cos\theta)}{\pi})L_i(p,w_i)|cos\theta_i|dw_idA
=(1−Fr(cosθo))∫A(Sr(∣∣po−pi∣∣))∫H2(n)(π1−Fr(cosθ))Li(p,wi)∣cosθi∣dwidA
可以发现这里面最难处理的就是 S r S_r Sr,它的参数很多 S r ( η , g , ρ , σ t , r ) S_r(\eta,g,\rho,\sigma_t,r) Sr(η,g,ρ,σt,r),这是一个高维函数,我们需要移除或固定某些参数来降低维度。首先是当给定 σ t \sigma_t σt后,r和 σ t \sigma_t σt存在一个对应关系,unitless optical radius即 r o p t i c a l = σ t r r_{optical}=\sigma_t r roptical=σtr。由于 S r S_r Sr是在一个2D的极坐标系上定义的, S r S_r Sr可以简化为 S r ( η , g , ρ , σ t , r ) = σ t 2 S r ( η , g , ρ , 1 , r o p t i c a l ) S_r(\eta,g,\rho,\sigma_t,r)=\sigma_t^2S_r(\eta,g,\rho,1,r_{optical}) Sr(η,g,ρ,σt,r)=σt2Sr(η,g,ρ,1,roptical)
接着在固定 η , g \eta,g η,g,那么参数只剩下 ρ , r o p t i c a l \rho,r_{optical} ρ,roptical,也就是给定 ρ , r o p t i c a l \rho,r_{optical} ρ,roptical,我们要求出一个 S r S_r Sr。
注意这里的
ρ
\rho
ρ描述的是单次散射之后的能量减少,而材质整体的
ρ
\rho
ρ则需要考虑任意次数的散射,这里我们定义单次散射的albedo为
ρ
\rho
ρ,整体的albedo为
ρ
e
f
f
\rho_{eff}
ρeff,它们符合如下公式:
ρ
e
f
f
=
∫
0
2
π
∫
0
∞
r
S
r
(
r
)
d
r
d
ϕ
=
2
π
∫
0
∞
r
S
r
(
r
)
d
r
\rho_{eff}=\int_0^{2\pi}\int_0^{\infty}rS_r(r)drd\phi=2\pi\int_0^{\infty}rS_r(r)dr
ρeff=∫02π∫0∞rSr(r)drdϕ=2π∫0∞rSr(r)dr
如何求 S r S_r Sr呢?Tabulated BSSRDF采用查表的方式,下面是如何生成这个表d 的步骤。
首先生成一系列半径r,生成方式是首先指定前两个样本的r,后续的样本成指数递增。接着生成一系列的 ρ \rho ρ
r
0
=
0
r_0=0
r0=0
r
1
=
2.5
e
−
3
f
r_1=2.5e-3f
r1=2.5e−3f
r
i
=
1.2
r
i
−
1
r_i=1.2r_{i-1}
ri=1.2ri−1
ρ = 1 − 8 e − 8 i / ( N − 1 ) ( 1 − e − 8 ) \rho=\frac{1-8e^{-8i/(N-1)}}{(1-e^{-8})} ρ=(1−e−8)1−8e−8i/(N−1)
然后对每对 ρ \rho ρ和r,计算对应的 S r S_r Sr,这个表的大小是 N ρ × N r N_{\rho}\times N_{r} Nρ×Nr。这个 S r S_r Sr又如何计算呢?将 S r S_r Sr看作单次散射和多次散射的相加,即 S r ( r ) = S s s ( r ) + S m s ( r ) S_r(r)=S_{ss}(r)+S_{ms}(r) Sr(r)=Sss(r)+Sms(r)。接下来就是计算 S s s ( r ) S_{ss}(r) Sss(r)和 S m s ( r ) S_{ms}(r) Sms(r),计算的方法来自这篇论文,下面是计算流程,只放MS的部分
输入 σ a σ s g η r \sigma_a\space\sigma_s\space g\space \eta \space r σa σs g η r
计算所需参数(步骤一)
(1)
σ
s
′
=
σ
s
(
1
−
g
)
\sigma_s^{'}=\sigma_s(1-g)
σs′=σs(1−g)
σ
t
′
=
σ
a
+
σ
s
′
\sigma_t^{'}=\sigma_a+\sigma_s^{'}
σt′=σa+σs′
ρ
′
=
σ
s
′
σ
t
′
\rho^{'}=\frac{\sigma_s^{'}}{\sigma_t^{'}}
ρ′=σt′σs′
(2)
D
g
=
2
σ
a
+
σ
s
′
3
(
σ
a
+
σ
s
′
)
2
D_g=\frac{2\sigma_a+\sigma_s^{'}}{3(\sigma_a+\sigma_s^{'})^2}
Dg=3(σa+σs′)22σa+σs′
(3)
σ
t
r
′
=
σ
a
σ
g
\sigma_{tr}^{'}=\sqrt{\frac{\sigma_a}{\sigma_g}}
σtr′=σgσa
(4)
Z
e
=
−
2
D
g
1
+
3
F
r
,
2
(
η
)
1
−
2
F
r
,
1
(
η
)
Z_e=-2D_g\frac{1+3F_{r,2}(\eta)}{1-2F_{r,1}(\eta)}
Ze=−2Dg1−2Fr,1(η)1+3Fr,2(η)
(5)
C
ϕ
=
1
4
(
1
−
2
F
r
,
1
(
η
)
)
C_{\phi}=\frac{1}{4}(1-2F_{r,1}(\eta))
Cϕ=41(1−2Fr,1(η))
C
d
=
1
2
(
1
−
3
F
r
,
2
(
η
)
)
C_{d}=\frac{1}{2}(1-3F_{r,2}(\eta))
Cd=21(1−3Fr,2(η))
采样nSample和点(步骤二)
for(i=1->nSample):
(1)
Z
r
=
−
l
o
g
(
1
−
i
+
0.5
n
S
a
m
p
l
e
s
)
σ
t
′
Z_r=-\frac{log(1-\frac{i+0.5}{nSamples})}{\sigma_t^{'}}
Zr=−σt′log(1−nSamplesi+0.5)
Z
v
=
−
Z
r
+
2
Z
e
Z_v=-Z_r+2Z_e
Zv=−Zr+2Ze
(2)
d
r
=
r
2
+
Z
r
2
d_r=\sqrt{r^2+Z_r^2}
dr=r2+Zr2
d
v
v
2
+
Z
v
2
d_v\sqrt{v^2+Z_v^2}
dvv2+Zv2
(3)
Φ
D
=
1
4
π
D
g
(
e
−
σ
t
r
d
r
−
e
−
σ
t
v
d
v
)
\Phi_D=\frac{1}{4\pi D_g}(e^{-\frac{\sigma_{tr}}{d_r}}-e^{-\frac{\sigma_{tv}}{d_v}})
ΦD=4πDg1(e−drσtr−e−dvσtv)
n
E
D
=
1
4
π
(
Z
r
(
1
+
d
r
σ
t
r
)
d
r
3
e
σ
t
r
d
r
−
Z
v
(
1
+
d
v
σ
t
v
)
d
v
3
e
σ
t
v
d
v
)
nE_D=\frac{1}{4\pi}(\frac{Z_r(1+d_r\sigma_{tr})}{d_r^3}e^{\sigma_{tr}d_r}-\frac{Z_v(1+d_v\sigma_{tv})}{d_v^3}e^{\sigma_{tv}d_v})
nED=4π1(dr3Zr(1+drσtr)eσtrdr−dv3Zv(1+dvσtv)eσtvdv)
(4)
E
d
+
=
Φ
D
C
ϕ
+
n
E
D
C
d
Ed+=\Phi_DC_{\phi}+nE_DC_{d}
Ed+=ΦDCϕ+nEDCd
返回结果
E d / n S a m p l e s Ed/nSamples Ed/nSamples
上面的方法是离线渲染中采用的,下面的两篇paper是用在实时渲染的
Separable Subsurface Scattering
M
(
x
,
y
)
=
∫
∫
E
(
x
,
y
)
R
(
r
)
d
x
d
y
M(x,y)=\int\int E(x,y)R(r)dxdy
M(x,y)=∫∫E(x,y)R(r)dxdy这里的M(x,y)是p点出射的radiance,E(x,y)是p点周围的irradiance。这个方程可以写成2D卷积的形式。
M
(
x
,
y
)
=
E
(
x
,
y
)
∗
R
(
r
)
M(x,y) =E(x,y) ∗R(r)
M(x,y)=E(x,y)∗R(r)
2维的卷积对于实时来说性能消耗太大,我们使用高斯卷积来将它分成水平垂直两个分离的部分。
R
(
r
)
=
Σ
i
=
1
k
w
i
G
(
v
i
,
r
)
R(r)=\Sigma_{i=1}^{k}w_iG(v_i,r)
R(r)=Σi=1kwiG(vi,r)
单个高斯很难模拟diffuse profile,我们采用多个高斯来拟合。但是多个高斯合起来的函数是不可分离的,所以必须用多个Pass对不同的高斯函数进行处理。多个Pass就带来了性能上的消耗。
Separable Subsurface Scattering是动视在2015年发布的一个Paper,这个Paper的主页有点迷惑,这个主页上放了2012年一个Github实现代码,我看了一下代码和这篇论文并没有很大的关系,但是UE种是按Github实现代码做的。
return // 0.233f * gaussian(0.0064f, r) + /* We consider this one to be directly bounced light, accounted by the strength parameter (see @STRENGTH) */
0.100f * gaussian(0.0484f, r) +
0.118f * gaussian( 0.187f, r) +
0.113f * gaussian( 0.567f, r) +
0.358f * gaussian( 1.99f, r) +
0.078f * gaussian( 7.41f, r);
Separable Subsurface Scattering将多个高斯函数的累积作为一个新的函数,在水平和竖直方向进行累积,整个算法就是这些内容,之前是这6个高斯函数分到6*2个Pass中或者是在一个Pass上进行2D的Sample,现在是直接分开,就是水平和竖直两个部分。这里我比较困惑的一点就是这个新的函数为什么是可分离的。
2015年的论文就比较清晰,直接将 R ( r ) R(r) R(r)做SVD分解,只取1-rank,那么不论是不是可分离的都可以用两个水平或竖直的Pass处理。
Burley Normalize SSS
选择高斯函数去拟合diffusion profile有以下几个好处:
1.高斯的卷积可以分离,降低了复杂度
2.不断地用一个”小“的高斯进行卷积相当于用一个大的高斯进行卷积。
使用高斯的Separable Subsurface Scattering也有几个问题:
1.不同高斯核的混合不能分离
2.SSSS的参数过多,并且其物理意义不明,难以调整。
3.至少需要4个Pass,消耗较大。
Burley Normalize SSS使用下面的diffusion profile:
R
(
r
)
=
A
s
e
−
s
r
+
e
−
s
r
/
3
8
π
r
R(r)=As\frac{e^{-sr}+e^{-sr/3}}{8\pi r}
R(r)=As8πre−sr+e−sr/3
完整的公式为:
R
(
r
)
=
A
s
e
−
s
r
/
l
+
e
−
s
r
/
3
l
8
π
r
R(r)=As\frac{e^{-sr/l}+e^{-sr/3l}}{8\pi r}
R(r)=As8πre−sr/l+e−sr/3l
l是mean free pass,作者认为要去用s拟合曲线将l取为1就足够了
Burley Normalize SSS的累积分布函数CDF很容易计算:
c
d
f
(
r
)
=
∫
0
r
R
(
t
)
2
π
t
d
t
∫
0
∞
R
(
t
)
2
π
t
d
t
cdf(r)=\frac{\int_0^rR(t)2\pi tdt}{\int_0^{\infty}R(t)2\pi tdt}
cdf(r)=∫0∞R(t)2πtdt∫0rR(t)2πtdt
=
A
/
4
(
4
−
e
−
r
/
d
−
3
e
−
r
/
(
3
d
)
)
A
=\frac{A/4(4-e^{-r/d}-3e^{-r/(3d)})}{A}
=AA/4(4−e−r/d−3e−r/(3d))
=
(
1
−
1
4
e
−
r
/
d
−
3
4
e
−
r
/
(
3
d
)
)
=(1-\frac{1}{4}e^{-r/d}-\frac{3}{4}e^{-r/(3d)})
=(1−41e−r/d−43e−r/(3d))
r采样
cdf属于
[
0
,
1
]
[0,1]
[0,1],给定一个0-1的随机数,可以得到其对应的半径为
c
d
f
(
r
,
d
)
=
r
a
n
d
o
m
cdf(r,d)=random
cdf(r,d)=random
r
=
c
d
f
−
1
(
r
a
n
d
o
m
,
d
)
r=cdf^{-1}(random,d)
r=cdf−1(random,d)
UE中给出了3中方法:
第一种是近似方法,
c
d
f
−
1
cdf^{-1}
cdf−1近似为以下函数:
c
d
f
−
1
(
d
,
r
a
n
d
o
m
)
=
d
(
(
2
−
2.6
)
r
a
n
d
o
m
−
2
)
l
o
g
(
1
−
r
a
n
d
o
m
)
cdf^{-1}(d,random)=d((2-2.6)random-2)log(1-random)
cdf−1(d,random)=d((2−2.6)random−2)log(1−random)
第二种采用数值计算方法(Halley)进行求解:
x
n
+
1
=
x
n
−
2
f
(
x
)
f
′
(
x
)
2
f
′
(
x
)
f
′
(
x
)
−
f
(
x
)
f
′
′
(
x
)
x_{n+1}=x_n-\frac{2f(x)f^{'}(x)}{2f^{'}(x)f^{'}(x)-f(x)f^{''}(x)}
xn+1=xn−2f′(x)f′(x)−f(x)f′′(x)2f(x)f′(x)
第三种计算解析解:
令
F
(
X
)
=
1
4
e
−
X
+
3
4
e
−
X
/
3
F(X)=\frac{1}{4}e^{-X}+\frac{3}{4}e^{-X/3}
F(X)=41e−X+43e−X/3
c
d
f
(
X
)
=
1
−
F
(
X
/
D
)
cdf(X)=1-F(X/D)
cdf(X)=1−F(X/D)
也就是计算
c
d
f
(
r
,
D
)
=
r
a
n
d
o
m
cdf(r,D)=random
cdf(r,D)=random
=>
F
(
X
/
D
)
=
1
−
r
a
n
d
o
m
F(X/D)=1-random
F(X/D)=1−random
=>
X
=
D
∗
F
−
1
(
1
−
r
a
n
d
o
m
)
X=D*F^{-1}(1-random)
X=D∗F−1(1−random)
F
−
1
F^{-1}
F−1可直接计算
令
U
=
1
−
r
a
n
d
o
m
U=1-random
U=1−random
G
=
1
+
4
U
(
2
U
+
1
+
4
U
2
)
G=1+4U(2U+\sqrt{1+4U^2})
G=1+4U(2U+1+4U2)
F
−
1
(
1
−
r
a
n
d
o
m
)
=
F
−
1
(
U
)
=
3
l
o
g
(
1
+
G
−
1
/
3
+
G
1
/
3
4
U
)
F^{-1}(1-random)=F^{-1}(U)=3log(\frac{1+G^{-1/3}+G^{1/3}}{4U})
F−1(1−random)=F−1(U)=3log(4U1+G−1/3+G1/3)
原始方法的样本点大多集中在中心,UE中做了改进,首先计算出center sample在世界空间中的半径R,然后计算出R对应的CDF®=T,之后把中心的Smple和其他区域分开。
不在中心的样本在
[
T
,
1
]
[T,1]
[T,1]中取,并将计算结果呈上缩放系数1-T。
s拟合
zai知道r后接下来就是计算 R ( r ) R(r) R(r)了,在R( r)中还有一个参数没有计算,原始论文中给出了三种拟合s的公式:
第一种假设的情况是光线垂直进入表面,它对MC的平均相对误差为5.5%
s
=
1.85
−
A
+
7
∣
A
−
0.8
∣
3
s=1.85-A+7|A-0.8|^3
s=1.85−A+7∣A−0.8∣3
第二种情况假设光线是任意方向的,它对MC的平均相对误差为3.9%
s
=
1.9
−
A
+
3.5
(
A
−
0.8
)
2
s = 1.9 − A + 3.5 (A − 0.8)^2
s=1.9−A+3.5(A−0.8)2
第二种方法用diffuse mean free path (dmfp)
l
d
l_d
ld代替mean free path (dmfp)
l
l
l拟合s,它对MC的平均相对误差为7.7%
s
=
3.5
+
100
(
A
−
0.33
)
4
s = 3.5 + 100 (A − 0.33)^4
s=3.5+100(A−0.33)4
Bilateral Filtering
基本的工作已经完成了,不过这个模型还有一个很大的缺陷就是之前假设表面是平面,并且在平面上进行采样,这显然错误,现在需要把深度信息考虑进去。
I ≈ 2 π n Σ i = 1 n R ( r i , d i ) p ( r i , d i ) L = 2 π n Σ i = 1 n R ( r i 2 + d i 2 ) p ( r i , d i ) L I\approx\frac{2\pi}{n}\Sigma_{i=1}^n\frac{R(r_i,d_i)}{p(r_i,d_i)}L=\frac{2\pi}{n}\Sigma_{i=1}^n\frac{R(\sqrt{r_i^2+d_i^2})}{p(r_i,d_i)}L I≈n2πΣi=1np(ri,di)R(ri,di)L=n2πΣi=1np(ri,di)R(ri2+di2)L
接下来就碰到困难了,KaTeX parse error: Expected 'EOF', got '}' at position 11: p(r_i,d_i)}̲怎么算,之前的pdf是按平面计算的,它们的对应关系很难求。Unity在报告中采用强制能量守恒,添加一个归一化常数。
I = Σ i = 1 n R ( r i 2 + d i 2 ) p ( r i , d i ) L Σ i = 1 n R ( r i 2 + d i 2 ) p ( r i , d i ) I=\frac{\Sigma_{i=1}^n\frac{R(\sqrt{r_i^2+d_i^2})}{p(r_i,d_i)}L}{\Sigma_{i=1}^n\frac{R(\sqrt{r_i^2+d_i^2})}{p(r_i,d_i)}} I=Σi=1np(ri,di)R(ri2+di2)Σi=1np(ri,di)R(ri2+di2)L
UE中Bilateral Filtering相关代码如下:
float3 WeightingFactor = 0.0f;
LOOP for (int i = 0; i < NumOfSamples; ++i)
{
``````
float DeltaDepth = (SampledRadianceAndDepth.w - DepthAtDiscCenter)*BURLEY_CM_2_MM;
float RadiusSampledInMM = sqrt(BurleySampleInfo.RadiusInMM * BurleySampleInfo.RadiusInMM + DeltaDepth * DeltaDepth);
``````
float3 DiffusionProfile = GetDiffuseReflectProfileWithDiffuseMeanFreePath(BurleyParameter.DiffuseMeanFreePath.xyz, S3D.xyz, RadiusSampledInMM);
float3 SampleWeight = (DiffusionProfile / BurleySampleInfo.Pdf) * Mask * NormalWeight;
RadianceAccumulated.xyz += SampleWeight * (SampledRadianceAndDepth.xyz*TintColor);
WeightingFactor += SampleWeight;
``````
}
// 0.99995f is a compensitation to make it energe conservation.
const float EnergyNormalization = 1.0f / 0.99995f;
RadianceAccumulated.xyz *= (WeightingFactor == 0)? 0:(1.0f /WeightingFactor*EnergyNormalization);
Reference:
PBRT11-4BSSRDF
PBRT15-5Subsurface Scattering Using the Diffusion Equation
Separable Subsurface Scattering
Approximate Reflectance Profiles for Efficient Subsurface Scattering
Efficient screen space subsurface scattering Siggraph 2018