模块一 · 核心原理 预计阅读 15 分钟

NeRF 原理:隐式神经表示与体积渲染

传统三维重建(如点云、网格、体素)在表达复杂场景时往往显得笨拙:存储开销大、细节受限、编辑困难。NeRF(Neural Radiance Fields) 提出了一种全新的思路——不再显式存储几何,而是让一个神经网络“学会”描述整个场景。本章将用直觉和示意图拆解它的核心机制,不涉及繁琐的数学推导。

术语速查

本课涉及多个专业术语。如需随时查阅定义,请打开 L1 词汇表(可打印,适合边学边查)。

1. NeRF 的本质:用函数替代几何

想象你要向朋友描述一间房间。传统做法是在纸上画出每个家具的形状和位置(显式表示)。而 NeRF 的做法更像是训练一位“向导”:你告诉向导任意一个坐标,他立刻告诉你那里有多“实在”(密度)以及是什么颜色(颜色)。

NeRF 不存储几何,而是“现场计算”几何。具体来说,它用一个多层感知机(MLP)作为隐式函数,输入是五维坐标:三维空间位置 (x, y, z) 加上二维观察方向 (θ, φ)。输出则是该位置处的体积密度 σ(表示此处物质有多“实在”,可理解为不透明度)和RGB 颜色 c

5D 坐标 (x,y,z,θ,φ) MLP 多层感知机 ~8层全连接 密度 σ + 颜色 c (可穿透程度 + RGB) 体积渲染 沿光线积分 累计颜色与密度 像素颜色
NeRF 的完整推理管线。输入是一个五维坐标,输出是该观察方向上的像素颜色。

2. 密度与观察方向的解耦

NeRF 的输出中,密度 σ 和颜色 c 对输入的依赖关系是不对称的。这个设计非常精妙:

这种解耦让网络能自然地学习到视角相关效果,而不需要人为地设计反射模型。

3. 体积渲染:沿光线“边走边看”

知道了每个点的密度和颜色,如何得到屏幕上单个像素的颜色?NeRF 采用体积渲染(Volume Rendering)的策略,可以形象地理解为:从相机出发,向场景中发射一条光线,沿着这条光线“边走边看”,把沿途收集到的颜色按可见度加权累加起来。

相机 光线 场景物体 采样点 1 采样点 2 采样点 3 远处背景
体积渲染的直觉:沿光线均匀采样若干点,查询每个点的密度和颜色,按“累积可见度”加权求和,得到最终像素值。

这个过程有一个精妙的直觉:密度高的区域会“遮挡”后面的内容。就像雾天开车,近处的浓雾让你看不清远处的景物。NeRF 沿光线上的每个采样点计算它对最终颜色的“贡献权重”——如果前面的点已经很密了,后面的点贡献就会很小。

体积渲染的另一个关键性质是连续性:传统图形学中射线追踪找到表面交点后计算光照,NeRF 的体积渲染把这个过程“柔化”了——不再有硬表面,而是沿着整条光线做一个概率加权积分。这使得整个 pipeline 可微分,从而可以用梯度下降优化。因此,体积渲染实际上是“可微分的射线追踪”

类比

体积渲染类似于 X 光成像:X 射线穿过人体,不同组织对射线的吸收率不同(相当于密度 σ),最终在底片上形成灰度影像。NeRF 做的事本质上是“可微分的 X 光成像”——通过比较渲染图像与真实照片的差异,反向调整场景表示。

4. 位置编码:让神经网络看见高频细节

MLP 有一个众所周知的偏好:它喜欢输出“光滑”的结果。如果你直接把原始坐标 (x, y, z) 喂给网络,它会倾向于预测变化缓慢的场,导致重建结果像打了马赛克一样模糊。

NeRF 的解决方案是位置编码(Positional Encoding):在进入 MLP 之前,把每个坐标映射到一组高频正弦函数上。直观地说,这就像给坐标加上了“放大镜”——网络不再只看见 0.5 和 0.6 之间的平滑过渡,还能感知到 0.51、0.52、0.53 等更精细的差异。

无位置编码:低频模糊 缺少细节,边缘模糊 有位置编码:高频清晰 保留细节,边缘锐利
位置编码的效果类比。高频信号的引入使神经网络能够表达场景中的精细纹理和锐利边缘。

在实践中,位置编码使用不同频率的正弦和余弦函数组合。你不需要记住公式,只需要理解它的目的:告诉网络“这里变化很快”,从而激活网络的高频表达能力。实验表明,去掉位置编码后 NeRF 的 PSNR 会大幅下降——这说明 MLP 的偏置(偏好低频)必须通过输入端的频率提升来补偿,位置编码不是锦上添花,而是必要组件

后续的改进工作(如 Instant-NGP、NeRFstudio 中的实现)用哈希编码或傅里叶特征替代了手工设计的正弦编码,但核心动机一致。

5. 训练:让渲染结果“看起来像”真实照片

NeRF 的训练出奇地简单:给定一个场景的多视角照片(通常几十到几百张,环绕拍摄),对每张图片的每个像素,执行上述的“发射光线 → 采样 → 体积渲染”流程,得到预测的 RGB 值。然后计算预测图像与真实图像之间的光度误差(Photometric Loss),通常是均方误差(MSE)。

通过反向传播,这个误差信号一路回传到 MLP 的权重,调整每个空间位置的密度和颜色预测,直到渲染出的新视角图像与真实照片难以区分。

注意

原始 NeRF 需要每张图像的相机位姿(位置和朝向)作为已知输入。这些位姿通常通过 COLMAP 等 Structure-from-Motion 工具预先估计。这是工程实践中常见的“鸡生蛋”问题:没有位姿无法训练 NeRF,而位姿本身也需要从图像中恢复。现代框架如 nerfstudio 已经内置了这一流程,用户只需提供图像序列即可。

6. 关键洞察

在理解了 NeRF 的基本 pipeline 后,以下三点是从学习记录中提炼出的、非显而易见的深层认识:

6.1 隐式表示的优势不在精度,而在「连续性」

因为没有离散的网格或体素限制,隐式表示可以表达任意分辨率的几何细节。理论上无限细分都不会失真。这与显式表示(点云有采样密度限制、网格有面片数量限制)形成鲜明对比。

6.2 体积渲染是「可微分的射线追踪」

传统图形学中,射线追踪找到表面交点后计算光照,这是一个“硬”的离散决策(交点存在或不存在)。NeRF 的体积渲染把这个过程“柔化”为概率加权积分,整个 pipeline 处处可导,因此可以用梯度下降优化场景表示。

6.3 位置编码是必要组件,而非锦上添花

实验表明去掉位置编码后 NeRF 的 PSNR 会大幅下降。这说明 MLP 的偏置(偏好低频)必须通过输入端的频率提升来补偿。后续的 Instant-NGP 用哈希编码、NeRFstudio 用傅里叶特征,本质上都是同一动机的不同实现。

7. 核心公式速查(直觉版)

概念 直觉含义
F_Θ(x, y, z, θ, φ) → (σ, c) MLP 是一个函数,输入坐标和方向,输出密度与颜色
σ(x, y, z) 体积密度,值越大表示该位置越“实心”,光线越难穿透
c(x, y, z, θ, φ) 发射颜色,依赖于位置和观察方向(捕捉视角相关效果)
体积渲染积分 沿光线累加各采样点颜色,前面高密度区域遮挡后面的贡献
位置编码 将低频坐标映射到高频空间,使网络能表达精细细节

8. 快速检验

Q1. 在 NeRF 中,体积密度 σ 取决于哪些输入?
Q2. 位置编码(Positional Encoding)的主要作用是什么?
Q3. 体积渲染中,如果光线前半段遇到了高密度区域,后半段的贡献会怎样?

9. 本节小结

与后续课程的关联

理解「隐式表示 + 体积渲染 + 位置编码」的三位一体结构后,才能理解:

10. 延伸阅读

如果你想更深入地理解 NeRF 的设计动机和数学细节,推荐以下资源:

下一步

下一节课(L2)将介绍 3D Gaussian Splatting,一种与 NeRF 截然不同但同样强大的方法。它用显式的 3D 高斯点云替代隐式 MLP,实现了实时渲染。你会看到两种方法在表示方式和渲染效率上的核心差异。

如有任何概念不清楚,随时向我提问。NeRF 的体积渲染和位置编码是后续所有内容的基础,确保理解后再进入下一课。