Inverse Rendering
逆向渲染从照片反推出生成照片的形状、材质、光照和相机参数,从而实现重新打光和材质编辑。
逆向渲染是从一张或多张图像中还原其背后物理场景的过程,包括物体的三维形状、表面材质、照明以及拍摄图像的相机。计算机图形学中的渲染是正向过程,会将场景描述转换为像素。逆向渲染则沿着相同的物理过程反向运行,寻找能够重现观测照片的场景参数。它位于计算机视觉与图形学的交汇处,也称为逆向图形学。Stephen Marschner 在康奈尔大学完成的 1998 年博士论文《计算机图形学中的逆向渲染》,将从照片中还原照明和表面反射率表述为这类逆问题。
通过合成进行分析#
大多数逆向渲染方法都遵循一种称为“通过合成进行分析”的循环:先猜测场景,渲染场景,将结果与真实照片比较,再调整猜测以缩小差异。可微渲染能让每次调整都更高效。渲染器会报告每个像素相对于每个场景参数的变化情况,因此梯度下降可以一次更新数千个参数,方式与训练神经网络时的反向传播相同。像 Mitsuba 3 这样的基于物理的可微渲染器,还能将这一方法扩展到阴影、反射以及表面之间的光线反弹。
对于最简单的场景——由一个远处光源照亮的哑光球体——只需几行 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。生产系统保留相同的循环,但会将单行着色模型替换为完整的光传输模型,待求参数也会扩展到网格、纹理贴图和环境光照。
问题为何存在歧义#
许多不同的场景都能生成相同的图像。暗斑可能是颜色较深的涂层、阴影,也可能是背离光源倾斜的表面;亮斑则可能来自光泽材质,也可能是灯具恰好放在某个位置。亮度本身也存在歧义:光照增强一倍、反照率减半,像素结果仍然相同。这就是代码片段要对光照方向归一化,并让反照率承载全部亮度的原因。方法主要通过以下三种方式缩小答案范围:
- 更多观测:从多个视角拍摄物体,或像光度立体法那样在几种已知光源下拍摄,比只拍一张照片更能约束形状和材质。
- 学习到的先验:在大量渲染场景上训练的网络,可以根据单张图像预测可能的法线、材质或照明,为优化器提供良好的初始值。
- 已知几何:如果形状来自深度传感器或深度模型,剩下的未知量就只有材质和照明。
单张图像的深度估计可以为普通照片提供这种几何信息。Ultralytics YOLO26 深度模型能从单张 RGB 图像预测以米为单位的逐像素深度图;根据深度图梯度计算出的表面法线,就是球体示例中已知的明暗几何信息。
逆向渲染与重建、神经渲染的区别#
三维重建会还原几何信息,通常使用运动恢复结构和多视图立体视觉,并且通常会将拍摄时的照明烘焙进表面颜色。神经辐射场和高斯泼溅也使用相同的渲染并比较循环进行拟合,但它们会建模场景从各个方向看起来的样子,而不将表面与光源分离,因此其新视角会保留原始照明。逆向渲染的目标正是实现这种分离,从而支持重新布光、编辑材质以及逼真地插入虚拟物体。近期许多方法会结合深度学习,在辐射场中加入反射率和照明模型,拓展更广泛的神经渲染领域。
资产采集、AR 与视觉特效#
- 3D 资产采集:零售商和游戏工作室会扫描真实产品并生成 3D 资产,为颜色、粗糙度和表面法向量分别生成贴图,让同一个模型在商品页面或游戏引擎中都能适应任意光照正确渲染。
- 增强现实:Google ARCore 等 AR 框架会根据摄像头画面估计房间照明,让虚拟物体呈现匹配的着色、阴影和反射。
- 视觉特效:Paul Debevec 及其同事于 2000 年推出的光照舞台装置,会在密集分布的多个照明方向下拍摄表演者的脸部,以还原其反射率,让工作室能够重新照亮数字人脸,使其与任意镜头匹配。










