TECHNICAL NOTE · NEURAL RENDERING

NeRF と 3D Gaussian Splatting
学習と表示のしくみの違い

付属デモ(nerf_nurbs_pointcloud.html/nurbs_3dgs.html)での実測つき / 2026 年 9 月 30 日

要旨

NeRF と 3D Gaussian Splatting(3DGS)は、どちらも多視点画像から 3 次元の見え方を学び、新しい視点の画像を合成する。画素の色を「半透明の層を手前から重ねる」同じ式で決める点は共通だが、空間の表し方と、その式の計算の向きが逆である。NeRF は空間を連続関数として持ち、画素から光線をたどって関数に問い合わせる。3DGS は空間を多数のガウシアン(ぼかした楕円体)として持ち、それらを画面へ投影して重ねる。同じ NURBS 形状・同じ学習画像で比べると、学習に使っていない視点の PSNR は 3DGS が上回り(64 px 学習で 26.9 → 28.5 dB、192 px 学習で 32.2 → 36.2 dB)、192×192 の 1 枚の描画は 746 ms に対して 57.2 ms だった。一方、1 ステップの学習時間は 3DGS の方が長い。

1共通点:同じ合成式

どちらの手法も、画素の色 C を、奥行き方向に並んだ半透明の要素を手前から順に重ねて決める。

C=∑iTiαici+T最後c背景,Ti=∏j<i(1−αj)

αi は i 番目の要素の不透明度、ci はその色、Ti は手前の要素を通り抜けて届く光の割合(透過率)である。この式は微分できるので、どちらの手法も「描いた画像と学習画像の誤差を逆伝播して、中身を少しずつ直す」という同じ枠組みで学習できる。入力も同じで、画像と、それを撮ったカメラの位置・向きの組である。付属の 2 つのデモは、同じ NURBS 形状・同じ点群・同じ学習画像を使っているので、違いは手法だけにある。

違うのは、式に入る「要素」が何か、そしてそれをどう集めるかである。NeRF では光線上の標本点が、3DGS ではその画素に重なるガウシアンが要素になる。

2空間の表し方

NeRF3DGS
表現位置 (x, y, z) を入れると密度 σ と色 c を返す連続関数。ニューラルネットの重みの中に暗黙的に入っている空間に置いた多数のガウシアン(ぼかした半透明の楕円体)の一覧。形が値として明示的に存在する
1 要素が持つ値要素という単位はない。デモではハッシュ格子の特徴と MLP の重みが全体で共有される位置 3・大きさ 3・回転 4・不透明度 1・色 3 の 14 個(本家は視点で変わる色のため色に 48 個を使い計 59 個)
値の数(デモ・標準)788,292162,148(11,582 個 × 14)
値の数(デモ・高精細)8,390,980567,070(40,505 個 × 14)
空いている空間密度が 0 に近い値として、どこでも問い合わせられるガウシアンが無い=何も無い
形の編集難しい(重みと形の対応が分からない)しやすい(ガウシアンを動かす・消すだけ)

3表示(描画)のしくみ

同じ式を計算するのに、NeRF は画素から空間をたどり(後ろ向き)、3DGS は空間から画素へ投影する(前向き)。この向きの違いが、描画速度の差の大部分を生む。

NeRF:画素 → 光線 → 空間に問い合わせる 画面 カメラ 物体(密度の高い領域) MLP → (σ, c) 画素ごとに:標本点(数十)× ネットワーク計算 点どうしの間も連続なので、どの解像度でも同じように描ける 3DGS:ガウシアン → 画面へ投影して重ねる 画面 カメラ 位置・大きさ 回転・不透明度 色 ① 投影 → ② 奥行き順に並べる → ③ 画素ごとに手前から重ねる ネットワーク計算は無く、楕円を貼るだけなので速い
図 1描画の向きの違い。青は画素の色を決めるのに寄与する要素。NeRF は光線上の標本点ごとにネットワークを計算する。3DGS は各ガウシアンを 1 回だけ画面に投影し、重なった画素でその楕円の濃さを足し合わせる。

3.1 NeRF の描画

  1. 画素ごとに、カメラからその画素を通る光線を空間に飛ばす。
  2. 光線上に数十〜数百の標本点を取る(デモでは点群から作った占有グリッドで、空の空間の点を省く)。
  3. 各標本点で、位置をハッシュ格子で符号化し、MLP に通して密度 σ と色 c を得る。
  4. 密度を不透明度 α = 1 − e−σδ に直し、第 1 節の式で手前から重ねる。透過率が十分小さくなったら打ち切る。

3.2 3DGS の描画

  1. 各ガウシアンの 3D 共分散(大きさと回転で決まる楕円体の形)を、カメラの向きと遠近法で画面上の 2D 楕円に変換する。
  2. 全ガウシアンを奥行きの順に並べ替える。
  3. 手前から順に、楕円が覆う画素に「不透明度 × 楕円の中心からの距離に応じた濃さ」を α として重ねる。

3.3 描画の速さ(実測)

同じ条件(64 px の学習画像で 1,000 ステップ学習したモデル、同じ視点)で、1 枚を描く時間を測った。どちらも CPU の JavaScript(1 スレッド)での値である。

描画解像度NeRF3DGS速度比
64×6490 ms13.8 ms7 倍
128×128319 ms31.6 ms10 倍
192×192746 ms57.2 ms13 倍
256×2561,316 ms106.1 ms12 倍

NeRF の描画時間は画素数にほぼ比例し、1 画素あたり数個〜数十個の標本点でネットワークを計算する。3DGS はガウシアンごとに 1 回投影し、あとは足し算なので、7〜13 倍速い。デモでも、NeRF 版は画面を 1 行ずつ描き進めるのに対し、3DGS 版は視点を回すと 1 枚まるごと描き直せる。本家の 3DGS は GPU 上で、画面を小さなタイルに分けて並列に処理し、1080p で毎秒 30 枚以上の実時間描画を実現している。

3.4 学習時と違う解像度で描くとき

NeRF は連続関数なので、学習画像より細かい解像度で描いても、単にぼけた画像になる。3DGS では事情が違う。描画時には各楕円に一定のぼかし(0.3 画素²)を加えるが、この量は画素単位で決まっている。64 px で学習したガウシアンは、このぼかし込みで大きさが合うように調整される。それを 192 px で描くと、ぼかしが物体の上で 1/3 の幅になるので、どのガウシアンも学習時より小さく描かれ、物体の輪郭が内側に縮み、取っ手のような細い部分が痩せる。学習中の解像度と描く解像度の違いで見え方が変わるこの問題は、Mip-Splatting [4] が指摘したものである。デモでは、表示時のぼかしを学習画像の画素幅に合わせて補正した。

補正なしの3DGSを192ピクセルで描いた画像。輪郭が内側に縮んでいる
補正なし(1,000 ステップ)
20.8 dB
補正なしの誤差マップ。輪郭に沿って太い白い帯が出ている
補正なしの誤差 ×4
ぼかしを補正した3DGSを192ピクセルで描いた画像
ぼかしを学習画素幅に補正(1,500 ステップ)
28.0 dB
補正後の誤差マップ。輪郭の誤差が細くなっている
補正後の誤差 ×4
図 264 px で学習した 3DGS を 192 px で描いたものと、その誤差(白いほど大きい)。補正なしでは、物体全体が輪郭に沿って一回り縮み、誤差が輪郭の太い白い帯として現れる。学習が進んでガウシアンが引き締まるほど縮みが目立ち、PSNR は 250 ステップの 24.5 dB から 1,000 ステップで 20.8 dB へ下がった。補正後は、学習とともに PSNR が上がる。

4学習のしくみ

どちらも「描く → 誤差を測る → 誤差を逆伝播 → Adam で値を直す」を繰り返す。違いは、1 回の学習で何を描き、誤差がどこへ流れ、何が直されるかにある。

NeRF 3DGS 全画像からランダムな256 画素(光線) 光線上の標本点1 本あたり 3〜10 点 MLP の重み ハッシュ格子のうち通った場所の値だけ 学習画像 1 枚まるごと(4,096 画素) 画素に重なる画面上の楕円 各ガウシアンの 14 値位置・形・不透明度・色 密度制御(100 回ごと)複製・分割・削除 誤差を逆伝播 → 誤差を逆伝播 → 勾配の大きさで 1 回で見る画素は少ないが、全画像にまたがる。構造(格子の大きさ・MLP の形)は固定。 1 回で 1 枚を丸ごと見る。足りない所にガウシアンを増やし、要らないものを消すので、構造が学習中に変わる。
図 31 ステップの学習で誤差が流れる先。枠が青いのが、その手法で直される主な値である。
項目NeRF(デモの設定)3DGS(デモの設定)
初期値乱数。点群は不要点群の点を初期位置にする(色・法線も使える)。本家は写真から推定した点群を使う
1 ステップで描くもの全学習画像からランダムに選んだ 256 画素(高精細 1,024)学習画像 1 枚をまるごと
損失色の二乗誤差+深度の誤差(重み 0.05)色の絶対誤差(L1)。本家はこれに構造類似度(SSIM)を加える
直す値MLP の全重み+ハッシュ格子の通過した場所画像に写ったガウシアンの 14 値
学習率全体で 1×10⁻²、3 万ステップで 1/10 へ値の種類ごとに別(位置 1.6×10⁻⁴、大きさ 5×10⁻³、回転 10⁻³、不透明度 2.5×10⁻² など)。位置だけ 1/100 へ下げる
構造の変化無し密度制御で個数が増減(標準設定で 8,000 → 約 11,600 個)
点群の使い方補助のみ:空の空間を飛ばす占有グリッド、深度の確認ガウシアンの初期位置そのもの
1 ステップの時間(64 px)17.1 ms26.1 ms
1 ステップの時間(192 px)105.8 ms187.1 ms

1 ステップの時間は 3DGS の方が長い。これは 1 回で画像を丸ごと描くためで、1 ステップで見る画素数は NeRF の 16 倍(64 px)〜36 倍(192 px)ある。その分、少ないステップで画質が上がる(第 5 節)。本家の 3DGS は GPU 上で 3 万ステップを数十分で学習し、画質で並ぶ Mip-NeRF 360(学習に丸 1 日以上かかる)より大幅に短い時間で済むと報告されている。

もう一つの違いは、構造が変わるかどうかである。NeRF は最初に決めた格子とネットワークの大きさのまま、中身の値だけを直す。3DGS は、画面上の位置の勾配が大きいガウシアンを「表現が足りない場所」とみなし、小さければ複製、大きければ 2 つに分割する。ほぼ透明になったものは削除する。

5実測による比較

マグカップ形状で、学習に使っていない同じ視点を 192×192 で描き、点群を面として描いた正解画像と比べた。3DGS は表示時のぼかしを学習画素幅に補正している。

正解画像
正解(点群の描画)
64ピクセルで学習したNeRF
NeRF・64 px 学習
26.9 dB
192ピクセルで学習したNeRF
NeRF・192 px 学習
32.2 dB
64ピクセルの学習画像の1枚
64 px 学習画像の 1 枚(拡大)
64ピクセルで学習した3DGS
3DGS・64 px 学習
28.5 dB
192ピクセルで学習した3DGS
3DGS・192 px 学習
36.2 dB
図 43,000 ステップ後の比較。中央の列が 64 px 学習、右の列が 192 px 学習で、上段が NeRF、下段が 3DGS。192 px 学習では、NeRF に残る縁の半透明なにじみが 3DGS ではほぼ消えている。
24 26 28 30 32 34 36 38 0 500 1,000 1,500 2,000 2,500 3,000 学習ステップ PSNR(dB) 3DGS・192 px 36.2 NeRF・192 px 32.2 3DGS・64 px 28.5 NeRF・64 px 26.9
図 5学習ステップ数と、学習に使っていない視点の PSNR(250 ステップごと)。実線が 192 px 学習、破線が 64 px 学習。どちらの解像度でも 3DGS の方が早く立ち上がり、高い値で落ち着く。
学習画像NeRF の 3,000 ステップ3DGS が同じ画質に届くまで3DGS の 3,000 ステップ
64 px26.9 dB ・ 51 秒750 ステップ ・ 20 秒28.5 dB ・ 78 秒
192 px32.2 dB ・ 317 秒500 ステップ ・ 94 秒36.2 dB ・ 561 秒

時間は、それぞれの 1 ステップの時間 × ステップ数で求めた(Node.js、1 スレッド、評価の時間を除く)。1 ステップは重いが、NeRF が 3,000 ステップかけて届く画質に、3DGS は NeRF の 3〜4 割の時間で届く。

6使い分け

こういうとき向いている手法理由
視点を動かしながら実時間で見たい3DGSネットワーク計算が無く、投影して重ねるだけで描ける
正確な点群がある(NURBS・CAD・レーザー計測)3DGS点をそのまま初期位置に使え、学習の立ち上がりが速い
点群が無い、または粗いNeRF画像だけから学習でき、初期値に頼らない
学習時と違う解像度・距離で描くNeRF(3DGS なら Mip-Splatting 等の対策が必要)連続関数なので、ぼけるだけで形は縮まない
保存容量を小さくしたいNeRF本家 3DGS は数百万個 × 59 値で数百 MB になりやすい
形を編集・合成したい3DGSガウシアンを直接動かせる
面の位置を正確に求めたいどちらも不向き。NeuS [5] や 2DGS [6]NeRF は密度の薄い層、3DGS は重なった楕円体で面を表すため

NURBS から標本化した点群を入力にする今回の課題では、点群が正確で雑音も無いので、3DGS の「点群から始める」性質が素直に活きる。実測でも、同じ学習画像・同じステップ数で 3DGS が NeRF を上回った。ただし、どちらも見た目を再現する手法であり、元の NURBS 曲面との形状誤差を小さくすることは直接の目的にしていない。形状の一致まで評価したい場合は、面を明示的に扱う手法と組み合わせる必要がある。

参考文献

  1. B. Mildenhall ほか. NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis. ECCV 2020. arXiv:2003.08934
  2. T. Müller, A. Evans, C. Schied, A. Keller. Instant Neural Graphics Primitives with a Multiresolution Hash Encoding. ACM TOG 41(4), 2022. arXiv:2201.05989
  3. B. Kerbl, G. Kopanas, T. Leimkühler, G. Drettakis. 3D Gaussian Splatting for Real-Time Radiance Field Rendering. ACM TOG 42(4), 2023. arXiv:2308.04079
  4. Z. Yu, A. Chen, B. Huang, T. Sattler, A. Geiger. Mip-Splatting: Alias-free 3D Gaussian Splatting. CVPR 2024. arXiv:2311.16493
  5. P. Wang ほか. NeuS: Learning Neural Implicit Surfaces by Volume Rendering for Multi-view Reconstruction. NeurIPS 2021. arXiv:2106.10689
  6. B. Huang ほか. 2D Gaussian Splatting for Geometrically Accurate Radiance Fields. SIGGRAPH 2024. arXiv:2403.17888