Inverse Rendering
逆レンダリングでは、写真から、それを生成した形状、素材、照明、カメラを逆算します。これにより、再照明や素材の編集が可能になります。
逆レンダリングとは、1枚以上の画像から、その背後にある物理的なシーンを復元する処理です。復元対象には、物体の3D形状、表面の材質、照明、撮影に使われたカメラが含まれます。コンピューターグラフィックスのレンダリングは、シーンの記述をピクセルに変換する順方向の処理です。逆レンダリングでは、同じ物理法則を逆向きにたどり、観測された写真を再現できるシーンパラメーターを探索します。コンピュータービジョンとグラフィックスが交わる領域に位置し、逆グラフィックスとも呼ばれます。Stephen Marschner氏の1998年のコーネル大学博士論文Inverse Rendering for Computer Graphicsでは、写真から照明と表面反射率を復元する問題を、この種の逆問題として位置づけています。
合成による解析#
多くの逆レンダリング手法は、解析合成と呼ばれるループに従います。シーンを推定し、レンダリングし、実際の写真と結果を比較して、差が小さくなるよう推定を調整します。微分可能レンダリングを使うと、各調整を効率的に行えます。レンダラーは、各シーンパラメーターに対して各ピクセルがどのように変化するかを出力するため、勾配降下法で何千ものパラメーターを一度に更新できます。これはニューラルネットワークを誤差逆伝播で学習させるのと同じ仕組みです。Mitsuba 3などの物理ベースの微分可能レンダラーは、この手法を影、反射、表面間の光の反射にも適用します。
最も単純なシーン、つまり遠方にある1つの光源で照らされたつや消しの球体なら、PyTorchでこのループを数行で実装できます。このコード例では、オプティマイザーには見えない光の方向と表面の明るさ(アルベド)を使って目標写真をレンダリングし、その後、ピクセルだけから両方を復元します。使用するのはAdamオプティマイザーです。
import torch
import torch.nn.functional as F
# Unit normals of a sphere seen head-on, on a 64 x 64 pixel grid
y, x = torch.meshgrid(torch.linspace(-1, 1, 64), torch.linspace(-1, 1, 64), indexing="ij")
z = (1 - x**2 - y**2).clamp(min=0).sqrt()
normals = torch.stack([x, y, z], dim=-1)[z > 0]
# Lambertian "photo" lit from a direction the optimizer never sees, with albedo 0.8
photo = 0.8 * (normals @ F.normalize(torch.tensor([0.6, -0.4, 0.7]), dim=0)).clamp(min=0)
# Fit light direction and albedo: render, compare with the photo, follow the gradients
light = torch.tensor([0.0, 0.0, 1.0], requires_grad=True)
albedo = torch.tensor(0.3, requires_grad=True)
optimizer = torch.optim.Adam([light, albedo], lr=0.02)
for _ in range(500):
render = albedo * (normals @ F.normalize(light, dim=0)).clamp(min=0)
loss = (render - photo).pow(2).mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"Light direction: {F.normalize(light.detach(), dim=0).numpy().round(3)}, albedo: {albedo.item():.3f}")このコードは、隠された値を正確に示すLight direction: [ 0.597 -0.398 0.697], albedo: 0.800を出力します。本番システムでも同じループを使いますが、1行のシェーディングモデルを完全な光輸送モデルに置き換え、未知の対象もメッシュ、テクスチャマップ、環境光へと拡張します。
問題が曖昧である理由#
多くの異なるシーンが同じ画像を生成します。暗い領域は、塗装が暗い場合、影の場合、あるいは光から遠ざかるように表面が傾いている場合があります。明るい斑点も、光沢のある素材か、ちょうどよい位置に置かれたランプのどちらかかもしれません。明るさだけを見ても曖昧さは残ります。光を2倍にしてアルベドを半分にすると、同じピクセル値になるため、このスニペットでは光の方向を正規化し、明るさのすべてをアルベドに担わせます。手法は次の3つの方法で解を絞り込みます。
- 観測を増やす: 対象物を多くの視点から撮影したり、フォトメトリックステレオのように複数の既知の光源の下で撮影したりすると、1枚の写真よりも形状と素材を大幅に制約できます。
- 学習済み事前分布: 大規模なレンダリングシーンの集合で学習したネットワークは、1枚の画像から、もっともらしい法線、材質、照明を予測し、オプティマイザーに有力な初期値を与えます。
- 既知のジオメトリ: 深度センサーや深度モデルから形状が得られる場合、残る未知の要素は材質と照明に絞られます。
単一画像の深度推定は、一般的な写真からこの幾何情報を得ます。Ultralytics YOLO26の深度モデルは、1枚のRGB画像からピクセルごとの深度マップをメートル単位で予測します。また、その勾配から計算される表面法線は、球体の例で既知の値として扱われる陰影の幾何情報です。
逆レンダリング、再構成、ニューラルレンダリングの違い#
3D再構築では、視覚的オドメトリやマルチビューステレオなどを使ってジオメトリを復元します。通常、撮影時の照明は表面の色に焼き込まれます。ニューラルラディアンスフィールドとガウシアンスプラッティングも、同じレンダリングと比較のループで最適化されます。しかし、表面と照明を分離せずに各方向から見たシーンをモデル化するため、新規視点にも元の照明が残ります。逆レンダリングの目的はこの分離にあり、再照明、材質編集、仮想物体のリアルな挿入を可能にします。近年の多くの手法は深層学習を組み合わせ、より広いニューラルレンダリングの分野で、ラディアンスフィールドに反射率や照明のモデルを加えています。
アセットのキャプチャ、AR、視覚効果#
- 3Dアセットのキャプチャ: 小売業者やゲームスタジオは、実際の商品をスキャンして3Dアセット化し、色、粗さ、表面法線のマップを個別に用意します。これにより、ストアページやゲームエンジンで、どのような照明の下でもモデルを正しくレンダリングできます。
- 拡張現実: GoogleのARCoreなどのARフレームワークは、カメラ映像から室内の照明を推定し、仮想物体に周囲と合ったシェーディング、影、反射を与えます。
- 視覚効果: Paul Debevec氏らが2000年に導入したライトステージ装置は、多数の方向から照明を当てて演者の顔を撮影し、その反射率を復元します。これにより、スタジオはデジタルの顔を任意のショットに合うよう再照明できます。










