Differentiable Rendering
微分可能レンダリングは、シーンの形状、素材、カメラを変えたときに各レンダリングピクセルがどのように変化するかを計算するため、3Dシーンを写真に合わせて最適化できます。
微分可能レンダリングとは、3Dシーンの形状、マテリアル、照明、カメラの記述を画像に変換するレンダリングを、シーンパラメーターに対する各出力ピクセルの微分を計算できるように実装したものです。レンダリング画像と写真を比較する損失関数は、バックプロパゲーションをレンダラーから3Dシーンまで伝播させながら、勾配降下法で最小化できます。これにより、画像からシーンを復元するコンピュータービジョンのタスクである逆レンダリングや、ニューラルレンダリングの基盤となります。後者には、シーンモデルをレンダリングして学習するニューラル放射場(NeRF)やガウシアンスプラッティングなどの手法があります。
レンダリングに特別な処理が必要な理由#
一般的なラスタライザーは、重要な箇所で微分可能ではありません。ピクセルが三角形で覆われるかどうかは頂点位置のステップ関数であり、頂点を少し動かしてもエッジがピクセル中心を横切るまではどのピクセルにも変化がないため、ジオメトリに対する勾配はほとんど至る所でゼロになります。オクルージョンも、ある面が別の面を隠す位置に不連続性を生みます。微分可能レンダラーは、こうしたエッジをさまざまな方法で処理します。
- 勾配の近似: OpenDR(2014年)とNeural 3D Mesh Renderer(2018年)は、順方向パスでは標準的なラスタライザーを使用し、逆方向パスでは勾配を近似します。
- ソフトラスタライゼーション: SoftRas(2019年)は、各ピクセルのハードな被覆判定を、三角形のエッジからの距離に応じて滑らかに変化する確率に置き換え、重なり合う面をブレンドします。そのため、エッジ付近のすべてのピクセルからジオメトリへ勾配が伝わります。
- 物理ベースの微分可能レンダリング: redner(2018年)やMitsuba 3(2022年)などのレイトレーサーは、シルエットのエッジをサンプリングするか、レンダリング積分を再パラメーター化して、影、反射、間接光の勾配を得ます。
- ボリュームレンダリングとスプラットレンダリング: NeRFの各レイに沿った密度のアルファ合成と、ガウシアンスプラッティングのラスタライズされた3Dガウス分布は、構造上、パラメーターに対して滑らかな関数です。
単一の円盤を対象とするソフトラスタライザーで、PyTorchを使ってこの考え方を示します。被覆率は円盤のエッジからの符号付き距離に対するsigmoidで表されるため、境界付近のすべてのピクセルから中心と半径に勾配が伝わります。
import torch
# Pixel coordinates of a 64x64 image
ys, xs = torch.meshgrid(torch.arange(64.0), torch.arange(64.0), indexing="ij")
def render(center, radius):
"""Soft-rasterize a disk: pixel coverage is a sigmoid of the signed distance to its edge."""
distance = torch.sqrt((xs - center[0]) ** 2 + (ys - center[1]) ** 2 + 1e-6)
return torch.sigmoid(radius - distance)
# Target image: a disk at (40, 24) with radius 12
target = render(torch.tensor([40.0, 24.0]), torch.tensor(12.0))
# Recover the scene from a wrong guess by backpropagating the pixel loss
center = torch.tensor([20.0, 40.0], requires_grad=True)
radius = torch.tensor(6.0, requires_grad=True)
optimizer = torch.optim.Adam([center, radius], lr=0.5)
for _ in range(300):
loss = ((render(center, radius) - target) ** 2).mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"center {center.detach().round(decimals=1).tolist()}, radius {radius.item():.1f}")出力はcenter [40.0, 24.0], radius 12.0です。半径の半分ほどの距離から開始しても、Adamオプティマイザーはピクセル差分だけから円盤を復元します。ハードな被覆率を使う(distance < radius).float()では、損失からどちらのパラメーターにも勾配が伝わりません。
実際のアプリケーション#
コード内のもののようなシルエット損失は、レンダリングした物体マスクを観測されたマスクと比較します。アノテーションのない写真では、YOLO26(yolo26n-seg.pt)などのインスタンスセグメンテーションモデルが、画像内のすべての物体のマスクを生成します。
- 3D再構成: NeRF(2020年)と3D Gaussian splatting(2023年)は、カメラポーズが分かっている数十枚の写真にシーンをフィッティングします。ガウシアンスプラッティングは、その後、新しい視点をリアルタイムでレンダリングし、1080pで毎秒30フレーム以上を実現します。
- 人体フィッティング: ボディモデルを使う手法では、レンダリングされたシルエットと投影された関節を人物のマスクおよびキーポイントに合わせることで、SMPLなどのパラメトリックメッシュを画像にフィッティングします。
- テキストからの3D生成: DreamFusion(2022年)は、ランダムな視点からのレンダリングがテキスト画像拡散モデルで高いスコアを得るようにNeRFを最適化し、3D学習データを使わずに3Dオブジェクトを生成します。










