Skip to main content

Volume Rendering and Splatting

NeRF と 3D Gaussian Splatting は、どちらも multi-view image から scene を再構成し、新しい view を rendering するための表現です。両者は見た目には似た結果を出しますが、rendering の計算の仕方が大きく違います。NeRF は ray 上の連続的な volume density を積分し、3DGS は明示的な Gaussian primitive を画像平面へ splat して alpha compositing します。

NeRF の volume rendering

Camera ray を次のように書きます。

r(t)=o+td\mathbf{r}(t)=\mathbf{o}+t\mathbf{d}

ここで、o\mathbf{o} は camera center、d\mathbf{d} は ray direction、tt は ray 上の距離です。NeRF は位置と方向から density σ\sigma と color c\mathbf{c} を出します。

(σ(t),c(t))=Fθ(r(t),d)(\sigma(t),\mathbf{c}(t))=F_\theta(\mathbf{r}(t),\mathbf{d})

Ray の色は volume rendering equation で表されます。

C(r)=tntfT(t)σ(r(t))c(r(t),d)dt\mathbf{C}(\mathbf{r})= \int_{t_n}^{t_f}T(t)\sigma(\mathbf{r}(t))\mathbf{c}(\mathbf{r}(t),\mathbf{d})\,dt T(t)=exp(tntσ(r(s))ds)T(t)=\exp\left(-\int_{t_n}^{t}\sigma(\mathbf{r}(s))\,ds\right)

各項の意味は次の通りです。

  • σ\sigma はその位置で ray がどれくらい吸収・散乱されるかを表す density です。
  • c\mathbf{c} はその位置から見える色です。
  • T(t)T(t) は ray が距離 tt まで遮られずに届く透過率です。

この式の気持ちは、「camera から ray を飛ばし、手前から奥へ進みながら、まだ透過している分だけ各位置の色を積分する」というものです。

実装では、連続積分を sample 点の和で近似します。

C^(r)=iTiαici,αi=1exp(σiΔi)\hat{\mathbf{C}}(\mathbf{r})= \sum_i T_i\alpha_i\mathbf{c}_i, \qquad \alpha_i=1-\exp(-\sigma_i\Delta_i) Ti=j<i(1αj)T_i=\prod_{j<i}(1-\alpha_j)

3D Gaussian Splatting の alpha compositing

3DGS では、scene を Gaussian primitive の集合として持ちます。Gaussian ii は中心 μi\boldsymbol{\mu}_i、共分散 Σi\boldsymbol{\Sigma}_i、opacity αi\alpha_i、色 ci\mathbf{c}_i を持ちます。

Gi(x)=exp(12(xμi)Σi1(xμi))G_i(\mathbf{x})=\exp\left(-\frac{1}{2}(\mathbf{x}-\boldsymbol{\mu}_i)^\top\boldsymbol{\Sigma}_i^{-1}(\mathbf{x}-\boldsymbol{\mu}_i)\right)

Rendering では、Gaussian を画像平面に projection し、pixel に対する寄与を計算します。Depth 順に並べた Gaussian の色は、NeRF と同じ形の alpha compositing で書けます。

C(p)=iTiαi(p)ci,Ti=j<i(1αj(p))\mathbf{C}(\mathbf{p})= \sum_i T_i\alpha_i(\mathbf{p})\mathbf{c}_i, \qquad T_i=\prod_{j<i}(1-\alpha_j(\mathbf{p}))

ここで、αi(p)\alpha_i(\mathbf{p}) は pixel p\mathbf{p} における Gaussian ii の不透明度です。この式の気持ちは、「ray 上を細かく sample する代わりに、画像平面に投影された楕円 Gaussian を手前から順に重ねる」というものです。

両者の比較

観点NeRF volume renderingGaussian splatting
表現暗黙 neural field明示 Gaussian primitive
renderingray marching / samplingrasterization / splatting
色の合成volume rendering integralalpha compositing
trainingscene ごとの neural optimizationscene ごとの primitive optimization
強み滑らかな連続表現高速 rendering、編集しやすい
弱みrendering が遅いprimitive 管理、aliasing、surface 抽出

重要なのは、どちらも最終的な色合成は iTiαici\sum_i T_i\alpha_i\mathbf{c}_i という形に近いことです。ただし、NeRF では ii が ray 上の sample 点であり、3DGS では ii が投影された Gaussian primitive です。この違いが速度、memory、編集性、surface extraction の違いにつながります。

関連ページ

主なソース