传统三维重建(如点云、网格、体素)在表达复杂场景时往往显得笨拙:存储开销大、细节受限、编辑困难。NeRF(Neural Radiance Fields) 提出了一种全新的思路——不再显式存储几何,而是让一个神经网络“学会”描述整个场景。本章将用直觉和示意图拆解它的核心机制,不涉及繁琐的数学推导。
本课涉及多个专业术语。如需随时查阅定义,请打开 L1 词汇表(可打印,适合边学边查)。
想象你要向朋友描述一间房间。传统做法是在纸上画出每个家具的形状和位置(显式表示)。而 NeRF 的做法更像是训练一位“向导”:你告诉向导任意一个坐标,他立刻告诉你那里有多“实在”(密度)以及是什么颜色(颜色)。
NeRF 不存储几何,而是“现场计算”几何。具体来说,它用一个多层感知机(MLP)作为隐式函数,输入是五维坐标:三维空间位置 (x, y, z) 加上二维观察方向 (θ, φ)。输出则是该位置处的体积密度 σ(表示此处物质有多“实在”,可理解为不透明度)和RGB 颜色 c。
NeRF 的输出中,密度 σ 和颜色 c 对输入的依赖关系是不对称的。这个设计非常精妙:
这种解耦让网络能自然地学习到视角相关效果,而不需要人为地设计反射模型。
知道了每个点的密度和颜色,如何得到屏幕上单个像素的颜色?NeRF 采用体积渲染(Volume Rendering)的策略,可以形象地理解为:从相机出发,向场景中发射一条光线,沿着这条光线“边走边看”,把沿途收集到的颜色按可见度加权累加起来。
这个过程有一个精妙的直觉:密度高的区域会“遮挡”后面的内容。就像雾天开车,近处的浓雾让你看不清远处的景物。NeRF 沿光线上的每个采样点计算它对最终颜色的“贡献权重”——如果前面的点已经很密了,后面的点贡献就会很小。
体积渲染的另一个关键性质是连续性:传统图形学中射线追踪找到表面交点后计算光照,NeRF 的体积渲染把这个过程“柔化”了——不再有硬表面,而是沿着整条光线做一个概率加权积分。这使得整个 pipeline 可微分,从而可以用梯度下降优化。因此,体积渲染实际上是“可微分的射线追踪”。
体积渲染类似于 X 光成像:X 射线穿过人体,不同组织对射线的吸收率不同(相当于密度 σ),最终在底片上形成灰度影像。NeRF 做的事本质上是“可微分的 X 光成像”——通过比较渲染图像与真实照片的差异,反向调整场景表示。
MLP 有一个众所周知的偏好:它喜欢输出“光滑”的结果。如果你直接把原始坐标 (x, y, z) 喂给网络,它会倾向于预测变化缓慢的场,导致重建结果像打了马赛克一样模糊。
NeRF 的解决方案是位置编码(Positional Encoding):在进入 MLP 之前,把每个坐标映射到一组高频正弦函数上。直观地说,这就像给坐标加上了“放大镜”——网络不再只看见 0.5 和 0.6 之间的平滑过渡,还能感知到 0.51、0.52、0.53 等更精细的差异。
在实践中,位置编码使用不同频率的正弦和余弦函数组合。你不需要记住公式,只需要理解它的目的:告诉网络“这里变化很快”,从而激活网络的高频表达能力。实验表明,去掉位置编码后 NeRF 的 PSNR 会大幅下降——这说明 MLP 的偏置(偏好低频)必须通过输入端的频率提升来补偿,位置编码不是锦上添花,而是必要组件。
后续的改进工作(如 Instant-NGP、NeRFstudio 中的实现)用哈希编码或傅里叶特征替代了手工设计的正弦编码,但核心动机一致。
NeRF 的训练出奇地简单:给定一个场景的多视角照片(通常几十到几百张,环绕拍摄),对每张图片的每个像素,执行上述的“发射光线 → 采样 → 体积渲染”流程,得到预测的 RGB 值。然后计算预测图像与真实图像之间的光度误差(Photometric Loss),通常是均方误差(MSE)。
通过反向传播,这个误差信号一路回传到 MLP 的权重,调整每个空间位置的密度和颜色预测,直到渲染出的新视角图像与真实照片难以区分。
原始 NeRF 需要每张图像的相机位姿(位置和朝向)作为已知输入。这些位姿通常通过 COLMAP 等 Structure-from-Motion 工具预先估计。这是工程实践中常见的“鸡生蛋”问题:没有位姿无法训练 NeRF,而位姿本身也需要从图像中恢复。现代框架如 nerfstudio 已经内置了这一流程,用户只需提供图像序列即可。
在理解了 NeRF 的基本 pipeline 后,以下三点是从学习记录中提炼出的、非显而易见的深层认识:
因为没有离散的网格或体素限制,隐式表示可以表达任意分辨率的几何细节。理论上无限细分都不会失真。这与显式表示(点云有采样密度限制、网格有面片数量限制)形成鲜明对比。
传统图形学中,射线追踪找到表面交点后计算光照,这是一个“硬”的离散决策(交点存在或不存在)。NeRF 的体积渲染把这个过程“柔化”为概率加权积分,整个 pipeline 处处可导,因此可以用梯度下降优化场景表示。
实验表明去掉位置编码后 NeRF 的 PSNR 会大幅下降。这说明 MLP 的偏置(偏好低频)必须通过输入端的频率提升来补偿。后续的 Instant-NGP 用哈希编码、NeRFstudio 用傅里叶特征,本质上都是同一动机的不同实现。
| 概念 | 直觉含义 |
|---|---|
F_Θ(x, y, z, θ, φ) → (σ, c) |
MLP 是一个函数,输入坐标和方向,输出密度与颜色 |
σ(x, y, z) |
体积密度,值越大表示该位置越“实心”,光线越难穿透 |
c(x, y, z, θ, φ) |
发射颜色,依赖于位置和观察方向(捕捉视角相关效果) |
| 体积渲染积分 | 沿光线累加各采样点颜色,前面高密度区域遮挡后面的贡献 |
| 位置编码 | 将低频坐标映射到高频空间,使网络能表达精细细节 |
理解「隐式表示 + 体积渲染 + 位置编码」的三位一体结构后,才能理解:
如果你想更深入地理解 NeRF 的设计动机和数学细节,推荐以下资源:
下一节课(L2)将介绍 3D Gaussian Splatting,一种与 NeRF 截然不同但同样强大的方法。它用显式的 3D 高斯点云替代隐式 MLP,实现了实时渲染。你会看到两种方法在表示方式和渲染效率上的核心差异。
如有任何概念不清楚,随时向我提问。NeRF 的体积渲染和位置编码是后续所有内容的基础,确保理解后再进入下一课。