-
NeRF对光线有着强定义,即将其作为纯几何光学来看待:
- 处于稳态;
- 不考虑光的粒子性;
- 表面可以吸收与发射,但是无散射;
- 发射光的表述与观察方向无关。
-
光线由射线r(t)=o+td表示,其中o表示光线光源的位置,即光的出发点;d表示光线的方向(角度),一般来说是单位向量。如此定义r(t)即可表示光线在t的度量下(如果表示时间,那就是t时刻)光的位置。
-
假设光在空间中直线传播,所到达的位置处粒子的密度可以考虑为撞击到粒子的概率,即在很微小的一段距离内撞击到粒子的概率为σ(x),也称其为密度场。x是空间的坐标,在此可表示为光此时处于x的位置,根据前面对光的描述可知,在给定(o,d)的前提下,光线r的位置与t有关,因此可以将密度场改写为标量形式σ(t)。
-
在同样的光线表示下,设透射率为T(t),即在0至t这个范围内,光线没有撞到粒子的概率。
-
假设光在t的基础上多走了很小很小的一段dt(参考微积分),此时可以定义T(t+dt)为:
T(t+dt)=T(t)⋅(1−dt⋅σ(t))
根据概率的乘法法则,T(t)为到t未撞击的概率,假设在微小的dt内密度相同,那么在t到差分dt内撞击的概率即为dt⋅σ(t),因此在0到t+dt未撞击的概率即上述式子。
应用乘法分配律与移项:
dtT(t+dt)−T(t)≡T′(t)=−T(t)⋅σ(t)
-
解上述微分方程得到:
T(a→b)≡T(a)T(b)=exp(−∫abσ(t)dt)
假设积分区间为a→b,即从a到b未撞击的概率,在我们对T(t)的定义下,此时a=0,b=t。
-
根据前述的公式T′(t)=−T(t)⋅σ(t),我们可以推到一个很显然的道理,我们知道T(t)为透明度,那么1−T(t)即为不透明度,对不透明度求导即得到了−T(t)⋅σ(t),我们称其为不透明度的概率密度函数。
-
有了这些基础,我们可以进一步推导任意空间位置(假设为D)的粒子所反射得到的颜色,根据不透明度的概率密度函数,我们可以得到在0到D处的颜色的期望,即:
EC=C=∫0DT(t)⋅σ(t)⋅c(t)dt+T(D)⋅cbg
在此我们只考虑合成的物体而不考虑背景,因此省略背景色cbg。
-
由于计算机无法计算连续积分,要把公式离散化。假设在微小的一段表面,颜色与体密度不发生变化(即颜色的变化是离散的),假设这一段为[a,b],这一段的颜色与体密度用左边界定义σa,ca,然后对这一小段进行积分。
C(a→b)=∫abT(a→t)⋅σ(t)⋅c(t)dt
-
由于在这一小段的积分σ(t),c(t)是不变量,替换为常数σa,ca,再根据T(a→b)=exp(−∫abσ(t)dt),代入到上式。
C(a→b)=σa⋅ca∫abexp(−∫atσ(u)du)dt
-
对于T的表达式,σ仍然为常数σa,替换后积分可得。
C(a→b)=ca⋅(1−exp(−σa(b−a)))
-
从上述积分式可能很容易得到:
T(a→c)=exp(−[∫abσ(t)dt+∫bcσ(t)dt])=exp(−∫abσ(t)dt)exp(−∫bcσ(t)dt)
即T(a→c)=T(a→b)⋅T(b→c)。
-
经过上述的准备工作,我们可以对[0,t]内的每一小段进行积分,假设我们分成{[tn,tn+1]}N,令t1=0,则透射率:
Tn=T(tn)=T(0→tn)=exp(−∫0tnσ(t)dt)=exp(k=1∑n−1−σkδk)
其中δn=tn+1−tn。
-
然后离散化体积渲染:
C(tN+1)=n=1∑N∫tntn+1T(t)⋅σn⋅cndt
将透射率拆解为T(0→t)=T(0→tn)⋅T(tn→t),积分只对T(tn→t)有影响,因此原积分可写为:
C(tN+1)=n=1∑NT(0→tn)⋅(1−exp(−σn(tn+1−tn)))⋅cn
此时我们将符号进行替换,即可得到:
C(tN+1)=n=1∑NTn⋅(1−exp(−σnδn))⋅cn
其中,Tn=exp(∑k=1n−1−σkδk)。
-
如果用α合成权重αn≡1−exp(−σnδn)来表示,由于∏iexpxi=exp(∑ixi),因此上式也可以写为:
C(tN+1)=n=1∑NTn⋅αn⋅cn
其中Tn=∏n=1N−1(1−αn)。
-
至此完成了NeRF的推导,这些是作者介绍的推导过程,作者原意为这里的推导并不是严格的数学与物理意义的严谨,需要我们了解大致的过程与思想即可。严谨的推导等学完基础再试试🥱🥱