NeRF

  • NeRF对光线有着强定义,即将其作为纯几何光学来看待:

    • 处于稳态;
    • 不考虑光的粒子性;
    • 表面可以吸收与发射,但是无散射;
    • 发射光的表述与观察方向无关。
  • 光线由射线r(t)=o+tdr(t) = \mathbf{o} + t\mathbf{d}表示,其中o\mathbf{o}表示光线光源的位置,即光的出发点;d\mathbf{d}表示光线的方向(角度),一般来说是单位向量。如此定义r(t)r(t)即可表示光线在t的度量下(如果表示时间,那就是t时刻)光的位置。

  • 假设光在空间中直线传播,所到达的位置处粒子的密度可以考虑为撞击到粒子的概率,即在很微小的一段距离内撞击到粒子的概率为σ(x)\sigma(\mathbf{x}),也称其为密度场。x\mathbf{x}是空间的坐标,在此可表示为光此时处于x\mathbf{x}的位置,根据前面对光的描述可知,在给定(o,d)(\mathbf{o},\mathbf{d})的前提下,光线rr的位置与tt有关,因此可以将密度场改写为标量形式σ(t)\sigma(t)

  • 在同样的光线表示下,设透射率为T(t)\mathcal{T}(t),即在0至t这个范围内,光线没有撞到粒子的概率。

  • 假设光在tt的基础上多走了很小很小的一段dtdt(参考微积分),此时可以定义T(t+dt)\mathcal{T}(t+dt)为:

    T(t+dt)=T(t)(1dtσ(t))\mathcal{T}(t+d t) =\mathcal{T}(t) \cdot(1-d t \cdot \sigma(t))

    根据概率的乘法法则,T(t)\mathcal{T}(t)为到t未撞击的概率,假设在微小的dtdt内密度相同,那么在tt到差分dtdt内撞击的概率即为dtσ(t)d t \cdot \sigma(t),因此在0到t+dtt + dt未撞击的概率即上述式子。

    应用乘法分配律与移项:

    T(t+dt)T(t)dtT(t)=T(t)σ(t)\frac{\mathcal{T}(t+d t)-\mathcal{T}(t)}{d t} \equiv \mathcal{T}^{\prime}(t)=-\mathcal{T}(t) \cdot \sigma(t)

  • 解上述微分方程得到:

    T(ab)T(b)T(a)=exp(abσ(t)dt)\mathcal{T}(a \rightarrow b) \equiv \frac{\mathcal{T}(b)}{\mathcal{T}(a)}=\exp \left(-\int_{a}^{b} \sigma(t) d t\right)

    假设积分区间为aba \rightarrow b,即从aabb未撞击的概率,在我们对T(t)\mathcal{T}(t)的定义下,此时a=0,b=ta=0, b=t

  • 根据前述的公式T(t)=T(t)σ(t)\mathcal{T}^{\prime}(t)=-\mathcal{T}(t) \cdot \sigma(t),我们可以推到一个很显然的道理,我们知道T(t)\mathcal{T}(t)为透明度,那么1T(t)1 - \mathcal{T}(t)即为不透明度,对不透明度求导即得到了T(t)σ(t)-\mathcal{T}(t) \cdot \sigma(t),我们称其为不透明度的概率密度函数。

  • 有了这些基础,我们可以进一步推导任意空间位置(假设为D)的粒子所反射得到的颜色,根据不透明度的概率密度函数,我们可以得到在0到D处的颜色的期望,即:

    EC=C=0DT(t)σ(t)c(t)dt+T(D)cbgE_{C}=\boldsymbol{C}=\int_{0}^{D} \mathcal{T}(t) \cdot \sigma(t) \cdot \mathbf{c}(t) dt+\mathcal{T}(D) \cdot \mathbf{c_{\mathrm{bg}}}

    在此我们只考虑合成的物体而不考虑背景,因此省略背景色cbg\mathbf{c_{\mathrm{bg}}}

  • 由于计算机无法计算连续积分,要把公式离散化。假设在微小的一段表面,颜色与体密度不发生变化(即颜色的变化是离散的),假设这一段为[a,b][a,b],这一段的颜色与体密度用左边界定义σa,ca\sigma_{a} ,\mathbf{c_{a}},然后对这一小段进行积分。

    C(ab)=abT(at)σ(t)c(t)dt\boldsymbol{C}(a \rightarrow b)=\int_{a}^{b} \mathcal{T}(a \rightarrow t) \cdot \sigma(t) \cdot \mathbf{c}(t) d t

  • 由于在这一小段的积分σ(t),c(t)\sigma(t) ,\mathbf{c}(t)是不变量,替换为常数σa,ca\sigma_{a} ,\mathbf{c_{a}},再根据T(ab)=exp(abσ(t)dt)\mathcal{T}(a \rightarrow b) =\exp (-\int_{a}^{b} \sigma(t) d t),代入到上式。

    C(ab)=σacaabexp(atσ(u)du)dt\boldsymbol{C}(a \rightarrow b)= \sigma_{a} \cdot \mathbf{c_{a}} \int_{a}^{b} \exp \left(-\int_{a}^{t} \sigma(u) d u\right) d t

  • 对于T\mathcal{T}的表达式,σ\sigma仍然为常数σa\sigma_{a},替换后积分可得。

    C(ab)=ca(1exp(σa(ba)))\boldsymbol{C}(a \rightarrow b)=\mathbf{c_{a}} \cdot\left(1-\exp \left(-\sigma_{a}(b-a)\right)\right)

  • 从上述积分式可能很容易得到:

    T(ac)=exp([abσ(t)dt+bcσ(t)dt])=exp(abσ(t)dt)exp(bcσ(t)dt)\mathcal{T}(a \rightarrow c)=\exp \left(-\left[\int_{a}^{b} \sigma(t) d t+\int_{b}^{c} \sigma(t) d t\right]\right)=\exp \left(-\int_{a}^{b} \sigma(t) d t\right) \exp \left(-\int_{b}^{c} \sigma(t) d t\right)

    T(ac)=T(ab)T(bc)\mathcal{T}(a \rightarrow c)=\mathcal{T}(a \rightarrow b) \cdot \mathcal{T}(b \rightarrow c)

  • 经过上述的准备工作,我们可以对[0,t][0,t]内的每一小段进行积分,假设我们分成{[tn,tn+1]}N\{[t_{n}, t_{n+1}]\}^{N},令t1=0t_{1} = 0,则透射率:

    Tn=T(tn)=T(0tn)=exp(0tnσ(t)dt)=exp(k=1n1σkδk)\mathcal{T_{n}}=\mathcal{T}(t_{n}) = \mathcal{T}(0 \rightarrow t_{n})=\exp(-\int_{0}^{t_{n}} \sigma(t) d t)=\exp (\sum_{k=1}^{n-1}-\sigma_{k} \delta_{k})

    其中δn=tn+1tn\delta_{n} = t_{n+1} - t_n

  • 然后离散化体积渲染:

    C(tN+1)=n=1Ntntn+1T(t)σncndt\boldsymbol{C}(t_{N+1}) = \sum_{n=1}^{N} \int_{t_{n}}^{t_{n+1}} \mathcal{T}(t) \cdot \sigma_{n} \cdot \mathbf{c_{n}} dt

    将透射率拆解为T(0t)=T(0tn)T(tnt)\mathcal{T}(0 \rightarrow t)=\mathcal{T}(0 \rightarrow t_n) \cdot \mathcal{T}(t_n \rightarrow t),积分只对T(tnt)\mathcal{T}(t_n \rightarrow t)有影响,因此原积分可写为:

    C(tN+1)=n=1NT(0tn)(1exp(σn(tn+1tn)))cn\boldsymbol{C}\left(t_{N+1}\right)=\sum_{n=1}^{N} \mathcal{T}\left(0 \rightarrow t_{n}\right) \cdot\left(1-\exp \left(-\sigma_{n}\left(t_{n+1}-t_{n}\right)\right)\right) \cdot \mathbf{c_{n}}

    此时我们将符号进行替换,即可得到:

    C(tN+1)=n=1NTn(1exp(σnδn))cn\boldsymbol{C}\left(t_{N+1}\right)=\sum_{n=1}^{N} \mathcal{T_{n}} \cdot\left(1-\exp \left(-\sigma_{n} \delta_{n}\right)\right) \cdot \mathbf{c_{n}}

    其中,Tn=exp(k=1n1σkδk)\mathcal{T_{n}}=\exp \left(\sum_{k=1}^{n-1}-\sigma_{k} \delta_{k}\right)

  • 如果用α\alpha合成权重αn1exp(σnδn)\alpha_{n} \equiv 1-\exp \left(-\sigma_{n} \delta_{n}\right)来表示,由于iexpxi=exp(ixi)\prod_{i} \exp x_{i}=\exp \left(\sum_{i} x_{i}\right),因此上式也可以写为:

    C(tN+1)=n=1NTnαncn\boldsymbol{C}\left(t_{N+1}\right)=\sum_{n=1}^{N} \mathcal{T_{n}} \cdot \alpha_{n} \cdot \mathbf{c_{n}}

    其中Tn=n=1N1(1αn)\mathcal{T_{n}}=\prod_{n=1}^{N-1}\left(1-\alpha_{n}\right)

  • 至此完成了NeRF的推导,这些是作者介绍的推导过程,作者原意为这里的推导并不是严格的数学与物理意义的严谨,需要我们了解大致的过程与思想即可。严谨的推导等学完基础再试试🥱🥱