Light Field Rendering — 把场景拍成 4D 数组,新视角靠查表
是什么
Light Field Rendering(光场渲染)是一种不重建任何 3D 几何,只把”从一片区域看出去会看到什么颜色”全部预先采集起来的方法。日常类比:你不画一座山的立体模型,而是先在山前一个网格里每一格都拍一张照片,几千张照片摞在一起就是一个4 维数组;以后想从任意新视角看这座山,不算几何,只在数组里查值。
它把一束光线编码为 4 个数 (u, v, s, t):u, v 是这条光线穿过”相机平面”的位置,s, t 是它穿过”焦平面”的位置。任何一条从相机射出的光线,对应数组里一个格子;新视角合成就变成了几百万次查表 + 插值。
为什么重要
不理解 Light Field Rendering,下面这些事都没法解释:
- 为什么 nerf-2020 输入要写成 5D 函数(3D 位置 + 2D 方向)——它继承的是 1991 年的 plenoptic function,Levoy-Hanrahan 把它精简成 4D
- 为什么 Lytro 那种”先拍照后对焦”的相机能存在——它的传感器就是一个微型 4D 光场采集器,发明人 Ren Ng 是 Levoy 在 Stanford 的博士生
- 为什么 3d-gaussian-splatting 在论文里反复对比 NeRF 而不重提光场——3DGS 把”显式存储 + 查值合成”这条线接回了 1996,本质是把 4D 光场换成了几百万个高斯椭球
- 为什么 image-based rendering(基于图像的渲染)这一整支研究在 1990s 中后期突然爆发——这篇论文给了它一个 4 维的数学骨架
核心要点
光场渲染这条路能跑通靠 三件事:
-
从 7D 砍到 4D:Adelson 和 Bergen 1991 提出 plenoptic function——空间任一点 (x, y, z)、任意方向 (θ, φ)、任意时间 t、任意波长 λ 看出去的辐射,是个 7D 函数。Levoy-Hanrahan 假设场景静态、单色、且观察者在自由空间(光线沿途辐射不变),于是 (x, y, z) 退化成”在某条光线上”——任意一条光线整条上的辐射相同,只需要编码”是哪条光线”。4D 就够了。
-
两平面参数化:怎么用 4 个数指代一条光线?方法是布两个平行平面。光线从 uv 平面某点出发,穿过 st 平面某点,(u, v, s, t) 唯一确定它。类比:你站在 uv 平面拍照,st 平面就是你正前方的”取景器”。一个 (u, v) 对应一台相机的位置,固定 (u, v) 让 (s, t) 跑遍就是这台相机拍下的整张照片。
-
采集 = 拍很多照片,渲染 = 查 4D 数组:相机装在机械臂上,沿 uv 平面走 32×32 网格,每个网格点拍一张分辨率 256×256 的照片,得到 32×32×256×256 ≈ 6700 万个样本——这就是 4D 光场。新视角合成时,给定虚拟相机的每个像素射出一条光线,算出它的 (u, v, s, t),在数组里四线性插值取出颜色。整个过程不解任何方程、不做任何几何重建。
为什么是 4D 而不是 5D?关键是”自由空间假设”——一条光线一旦进入空气,沿它走任意距离辐射不变。所以”在空间哪一点”是冗余信息,只剩”是哪条光线”。3D 空间里光线集合是 4 维(4 个数确定一条直线),这就是 4D 的物理来源,不是凑出来的。
数据巨大是头号工程问题——单物体原始 1.6 GB。论文用两级矢量量化(vector quantization)+ entropy coding 压到约 24:1,运行时只解码当前用到的 tile。这是 1996 年的内存现实——主流工作站才 64-256 MB,1.6 GB 是必须分块流式访问的规模。
实践案例
案例 1:拍一个光场要多少张照片
论文的实验装置:
机械臂沿 uv 平面走 32 × 32 = 1024 个位置每个位置相机拍一张 256 × 256 像素总样本数 32 × 32 × 256 × 256 ≈ 6.7 × 10^7每张照片就是 4D 数组里一个 (u_i, v_j) 切片。1024 张照片摞在一起就是这个物体的”全部视角的全部像素”。
直观理解:把 1024 张照片想象成一个 32×32 的”照片墙”,墙上每个位置贴一张 256×256 的照片。光场就是这面墙作为整体——你想从某个新视角看物体,就从墙上不同位置各取一小块拼出新照片。“取哪一块”由两平面参数化的几何算出来。
案例 2:渲染一个新视角的伪代码
def render_new_view(virtual_cam, light_field_4D): image = empty(H, W) for px in pixels(H, W): ray = virtual_cam.ray_through(px) # 算出这条光线 u, v = ray.intersect(uv_plane) # 它穿 uv 平面在哪 s, t = ray.intersect(st_plane) # 它穿 st 平面在哪 image[px] = quadlinear_interp( light_field_4D, u, v, s, t # 4 维插值查表 ) return image核心是 quadlinear_interp 这一行——没有 3D mesh、没有光线追踪、没有材质模型,只有查 4D 数组。
案例 3:为什么走出包络就糊
光场只在采集网格的 (u, v) 范围内有数据。你把虚拟相机推到机械臂走过的区域之外,那个 (u, v) 在 4D 数组里没有样本,只能外推——立刻糊掉。这就是为什么 Lytro 相机能”重对焦”但不能”绕到背面看”——它的微透镜阵列等价于一个很小的采集网格,重对焦在数学上只是”换一组 (u, v, s, t) 切片”,绕到背面则要求采集网格延伸到物体另一面,根本没有数据。
案例 4:重对焦怎么从 4D 数组里”算”出来
把光线方向倾斜一点重新求和,等价于把虚拟焦平面挪了——这就是 Lytro 那种”先拍照后对焦”的数学原理。具体说:固定一组 (s, t)、对所有 (u, v) 求平均,得到的就是”在 st 平面对焦的图像”;如果先把 s, t 沿 u, v 偏移再求和,焦点会落到不同深度。整个过程还是查 4D 数组 + 加权求和,没有相机机械结构在动。
def refocus(light_field, focal_offset): image = zeros(H, W) for u, v in uv_grid(): # 焦平面挪一点 = (s, t) 也按 (u, v) 偏移 shifted = shift(light_field[u, v], focal_offset * (u, v)) image += shifted return image / num_uv这就是为什么 Lytro 营销时反复说”先拍后对焦”——它们的相机里的微透镜阵列实际上就是一个超小型的 4D 光场采集器,对焦只是后处理时换一组 (s, t) 偏移参数。
踩过的坑
-
两平面参数化对垂直光线很差:如果一条光线几乎平行于 uv 平面,它在 uv 平面上的投影坐标会跳到无穷远——参数化失效。论文承认这点,建议给同一物体布多组两平面(例如六面立方体每面一组)联合采样。
-
混叠(aliasing)严重:4D 离散采样,重建时不做合适滤波就会出现条纹和重影。论文专门有一节讲在 4D 上做”prefilter”——本质是把每个样本拍成的不是一个点而是一个 4D 锥。
-
没几何信息 → 插值会”鬼影”:相邻两张照片对应的同一物体表面像素差异较大时,简单四线性插值会让物体表面”裂开”。1996 SIGGRAPH 的姐妹论文 Lumigraph(Gortler 等人)就是在这点上改进——它额外存一个粗糙的几何代理(geometric proxy)做修正。
-
数据量随分辨率四次方爆炸:把每维分辨率翻倍,4D 数组涨 16 倍。这是后来 NeRF 之所以诱人的原因——一个 1 MB 的 MLP 顶替几个 GB 的 4D 数组。
-
采集设备贵且笨:机械臂走 32×32 网格慢得要命,单物体要采几小时,现场环境光必须严格不变。这条工程门槛使得光场在 1996-2010 年间一直停留在学术 demo,直到 Lytro 把网格集成到一颗微透镜阵列里才走出实验室。
适用 vs 不适用场景
适用:
- 静态场景的高质量新视角合成(Lytro 光场相机、博物馆文物数字化)
- 不想做任何几何重建、只想”拍多了再说”的快速管线
- 教学:理解 plenoptic function 与 image-based rendering 的入口
不适用:
- 大场景、走动距离大——光场只覆盖采集包络
- 动态场景——4D 假设静态;要扩到 5D(加时间)数据量再翻几个量级
- 需要编辑(换材质、改光照)——光场是”果”不是”因”,编辑必须回到几何模型
- 内存紧的部署(手机、AR 眼镜)——4D 数组天生大
历史小故事(可跳过)
- 1991 年:Adelson 和 Bergen 在视觉研究里提出 plenoptic function,是个 7D 概念工具,没人想着拿它做渲染
- 1993 年:Chen-Williams 提出 view interpolation——给两张照片插中间帧,是 IBR 的早期试探
- 1996 年 SIGGRAPH:Levoy & Hanrahan 这篇 + Gortler 等 Lumigraph 同一会议几乎同时落地 4D 光场。两组互不知情,结果撞车,是图形学史上著名的”双发现”
- 2005 年:Levoy 的博士生 Ren Ng 把光场塞进单台相机的微透镜阵列里,做出 Lytro plenoptic camera
- 2020 年:nerf-2020 把 4D 光场升回 5D 但用 MLP 隐式表示,把存储从 GB 级压到 MB 级。3 年后 3d-gaussian-splatting 又把它显式化回到”几百万个基元 + 查表合成”——精神上是 1996 年的回归
- 30 年回看:Levoy 本人 2024 年仍在 Adobe 推动 light field 相关技术;这篇论文的 ISI 引用累计已破万,是图形学被引最多的几篇之一。一篇 1996 年的论文今天还在被 NeRF / 3DGS 论文当背景引——这是少见的”思想活过算力代际”的例子
学到什么
- 维度压缩是建模的第一步:7D → 4D 不是技巧,是对”自由空间里光线辐射不变”这条物理事实的硬约束。建模前先想”哪些维度其实是冗余的”——这是任何工程问题都该先问的
- 存储 vs 计算的钟摆:1996 砸内存换简单(查 4D 表);2020 NeRF 砸算力换内存(查 MLP);2023 3DGS 又把钟摆推回偏存储。每一代选哪头取决于硬件性价比,不是哪个方法本质更好
- 几何不是必需品:传统图形学先有 3D 模型再渲染;光场证明只要采样足够密,可以完全跳过 3D,直接从图像到图像。这条 image-based 路线后来变成 IBR 整支研究
- 同时代两组撞车不是偶然:Levoy-Hanrahan 和 Lumigraph 同届撞车,说明那一刻”用 4D 张量代替几何”在领域里是悬而未决的明确空气;学新领域时关注”同期撞车”是辨识方向风口的好信号
- 采样定理是图形学也是图形学的事:4D 数组天然引入混叠和带宽问题,光场把信号处理那一套(prefiltering、aliasing、reconstruction)正式带进了渲染管线,这件事直接催生了后续 frequency analysis of light transport 一整支理论
- 理论 → 实验 demo → 消费品 隔了 10 年:1996 论文 → 2005 Lytro → 2010s 才进消费市场。一个想法从能跑到能用之间的工程鸿沟通常被低估
延伸阅读
- 论文 PDF:Light Field Rendering(修正版)(12 页,几何 + 工程都讲透)
- Stanford Light Field Archive:lightfield.stanford.edu(Levoy 组公开的实拍光场数据集,可下载下来自己渲染)
- 姐妹论文:Gortler, Grzeszczuk, Szeliski, Cohen, “The Lumigraph”, SIGGRAPH 1996
- Ren Ng 博士论文:Digital Light Field Photography(Lytro 的理论奠基,把光场写进单台相机)
- nerf-2020 —— 2020 年把 4D 光场升回 5D + MLP 隐式表示
- 3d-gaussian-splatting —— 2023 年又把它显式化回到”基元 + 查值合成”
关联
- nerf-2020 —— 直系后裔;NeRF 的 5D 输入就是把 plenoptic function 砍到 plenoptic + view direction
- 3d-gaussian-splatting —— 精神回归;显式存储几百万基元 + 快速合成,对应 1996 的”显式 4D 数组 + 查表”
- curless-levoy-1996-tsdf —— Levoy 同年的另一篇 SIGGRAPH,走的是另一条路:从扫描重建出真正的 3D 几何。光场 vs TSDF 的对照很经典——同一个人同一年发了”完全跳过几何”和”用体素显式重建几何”两篇,把 IBR 与传统建模的张力摆在台面上
- colmap-2016 —— 现代位姿估计;NeRF / 3DGS 的标准前置环节,但 1996 光场用机械臂直接绕过了这一步