景深
Depth of Field
相机在给定设置下只有一段深度范围清晰,范围外的物体越远离越模糊。实时渲染默认是完美对焦的针孔相机,所以"景深"指对近景和远景做模糊。实用算法从单张图像出发,按深度算出每像素的弥散圆半径,分离近景与其余部分分别模糊再合成;"边收集边散布"和对高亮像素单独溅射散景是游戏中的常见做法(RTR4 12.4 节)。
物理背景与控制
- 模糊程度与光圈大小和焦距有关:缩小光圈加大景深但进光减少。白天户外光足、光圈小,景深大;昏暗室内景深明显变窄。因此可以把景深与色调映射挂钩(光线越暗失焦越模糊),也可由美术手动控制焦点以营造戏剧效果。
- 累积缓冲:在镜头上移动视点、保持焦点不变,多次渲染求平均,会收敛到正确的参考结果(适合测试);光线追踪在光圈上变化眼睛光线位置也能物理正确。交互应用里太贵,但它给出了"每个像素应该记录什么"的思考框架。
- 三个区域:焦点附近的对焦区(中景,失焦不到半个像素,即摄影所说的景深)、更远的远景、更近的近景。
早期方法
- 2.5D 分层:通过调整近/远裁剪面分别渲染近景、对焦、远景三层,模糊近、远层后从后往前合成。物体跨层时会从模糊突然变清晰,且每层内模糊程度一致,不随距离变化。
- 弥散圆 (circle of confusion):表面上一个小点失焦后在像素网格上扩散为实心圆。
- 散景 (bokeh):失焦区域的美学质量。透过光圈的光多为均匀分布而非高斯;形状取决于光圈叶片数量和形状:廉价相机呈五边形,多数新相机七片,高端九片以上,圆角叶片使散景更圆;夜景光圈大更接近圆形。游戏有时故意渲染六边形散景暗示真实相机,而六边形恰好容易用可分离两遍模糊实现。
散布 vs 收集
| 方式 | 做法 | 取舍 |
|---|---|---|
| 散布(前向映射) | 每个近/远景像素渲染一个大小等于弥散圆的精灵,分层累加平均后逐层合成 | 不符合像素着色器并行模式;即使降采样也慢,且耗时随焦深变化,难以管理帧预算 |
| 收集(反向映射) | 假设像素邻域深度相近,按深度决定弥散圆,即采样范围,对每个像素模糊 | 符合 GPU 纹理采样;需处理近景边缘等问题 |
单视点图像本来就缺失其他视点能看到的表面,只能尽量利用已有的可见样本 (Pesce)。
Bukowski 等的收集方法
- 由深度为每个像素生成有符号弥散圆半径(可由相机参数推导,也可由美术指定近/对焦/远范围);符号表示近景或远景, 视为对焦(半像素模糊算清晰)。
- 按半径把图像分成"近景"和"其余"两张,各自降采样并用可分离滤波两遍模糊。分开是为了让近景物体边缘也模糊:若按半径模糊并输出到单张图,跨过前景轮廓进入对焦区时采样半径突降为 0,前景对周围像素的影响突然截断,形成锐利边缘。近景图每像素还带一个同样被模糊的 alpha 混合因子。分离时使用联合双边滤波等测试,例如远景模糊时丢弃明显更远的邻居。
- 合成:按弥散圆半径在原始清晰图和远景模糊图间线性插值(半径越大越多用模糊结果),再用近景 alpha 覆盖混合到上面,使近景模糊内容自然扩散到后方场景。
只需颜色和深度、三个后处理 pass,简单稳健;粒子和透明(每像素多个深度)会有问题。"按弥散圆采样 + 近远场分离"是许多景深算法的共同主题。
边收集边散布 (scatter as you gather)
- 理想模型:把每个像素变成强度与面积成反比的弥散圆,按深度排序混合覆盖当前像素的所有圆。利用场景最大弥散圆半径,检查该半径内每个邻居的圆是否覆盖当前像素,再排序混合——但 GPU 上排序太贵。
- 做法:找出会散布到本像素的邻居;深度最小的覆盖邻居代表较近图像,与其深度相近的邻居的 alpha 贡献累加平均,存入"前景层"(无需排序);其余覆盖邻居同样平均存入"背景层"。前景/背景层并不对应近/远景,而是每个像素区域各自找到的内容;最后前景合成到背景上。配合各种采样与滤波技巧可以很高效(Jimenez、Sousa、Sterna、Courrèges 等的实现)。
其他方法
- 热扩散:把图像视为向外扩散的热分布,弥散圆代表导热率,对焦区是完美绝热体。一维热扩散可写成三对角矩阵,每样本常数时间求解,适合计算着色器按轴分解;但仍需按深度分层处理可见性,且几乎无法处理弥散圆的不连续,如今基本只是历史。
- 高亮散景:灯光或镜面反射的弥散圆即使被摊开仍明显亮于周围,高对比度更清楚地暴露光圈形状;其余像素形状不重要("bokeh"一词有时被误用来专指这些亮斑)。检测高对比度区域,只把这些少数亮像素渲染为精灵,其余用收集方法,兼顾散景形状与效率。计算着色器还可构建高质量求和面积表用于收集景深,并高效溅射散景。
- 其他探索:随机光栅化、光场处理等。
GEA 的视角(卷 II 12.7.2)
GEA 只用一句话描述景深:用深度缓冲的内容调整每个像素的模糊程度,作为全屏后期效果实现(卷 II 12.7.2)。这对应本页按深度计算弥散圆大小的基本思路;散景形状、散布与收集等细节 GEA 没有讨论。
PBRT 的视角:薄透镜模型与弥散圆公式(PBRT 4e 5.2.3)
上文 RTR4 从后处理出发,弥散圆半径"可由相机参数推导"但没给公式;PBRT 给出离线渲染器里物理正确的做法,正好补上这一推导。
薄透镜与高斯透镜公式
针孔不可实现,而且孔越小进光越少、曝光越长,又会带来运动模糊;真实镜头用有限光圈把光聚到胶片上,代价是只有对焦平面上的点清晰。薄透镜近似把光学系统看作一片球面透镜,厚度远小于曲率半径:平行于光轴的光线汇聚到焦点,透镜到焦点的距离即焦距 。采用透镜坐标约定:透镜在 ,场景在 一侧(注意与 pbrt 相机空间看 不同),胶片一侧的距离加撇号。高斯透镜公式:
时 。对焦就是调节透镜到胶片的距离。
弥散圆直径
对焦在 (胶片在 )时,深度 的点成像于 ,在胶片上形成直径 的弥散圆。由相似三角形 ,再代入高斯公式:
与透镜直径 成正比; 常用 f 数 表示:。弥散圆小于像素间距的深度范围看起来都清晰,即景深。本页按书中图 5.13 的参数( mm、光圈 25 mm、对焦 1 m)用上式计算:
| 物距 | 0.25 m | 0.5 m | 0.8 m | 1.25 m | 2 m | ∞ |
|---|---|---|---|---|---|---|
| (mm) | 3.95 | 1.32 | 0.33 | 0.26 | 0.66 | 1.32 |
可见模糊相对对焦面不对称:焦前增长得比焦后快得多(0.5 m 处已与无穷远处一样模糊),这正是书中图 5.13 想说明的。后处理景深若把弥散圆写成深度差的线性函数,就会丢掉这种不对称。
光线追踪中的实现
在半径为光圈半径的圆盘上采一点(SampleUniformDiskConcentric(),附录 A.5.1)作为光线原点;穿过透镜中心的光线方向不变,所以先求针孔光线与对焦平面的交点 ,再让新光线从透镜采样点指向该交点。对焦平面上的物体无论采到透镜哪一点都汇聚到同一点,因而清晰。代价是需要大量样本:书中风景场景用 2048 spp 才平滑,4 spp 时颗粒感明显。这与上文"累积缓冲 / 在光圈上变化眼睛光线位置能物理正确"的说法一致。透镜光线微分也按同样方法处理偏移一个像素的光线。
GPU Gems 的视角:实用后处理景深(GPU Gems 3 第 28 章,Infinity Ward)
来源:Earl Hammon Jr.《Practical Post-Process Depth of Field》(Call of Duty 4);摘录 Chapter 28. Practical Post-Process Depth of Field — Earl Hammon Jr. (Infinity Ward)。与上文 RTR4 收集/散布、PBRT 薄透镜并列:这是游戏向、强调近景弥散圆连续的工程方案。
物理上近景 CoC 无上界、增长更快,所以近景轮廓必须糊出剪影。纯 Poisson 收集(Scheuermann)背景好看但近景轮廓仍锐;「把散射倒成收集」又贵又有振铃。IW 的做法:把近景 CoC 本身高斯模糊并降到 1/4 分辨率,再用 在边界取较大直径,最后再小模糊抹平拐角——等于强行用模糊消灭近景/焦点之间的不连续。
可变模糊不是海量泊松点,而是在「未模糊 / 17-tap 小模糊 / 中模糊 / 大模糊」之间分段线性插值;艺术上用分段线性「深度→模糊半径」曲线,并可关掉近或远段。第一人称武器与世界用两套近景参数(负深度标记武器像素)。代价约每像素 9.6 次纹理读取,1024×768 上约 1–1.5 ms(X1900/7900)。已知折中:焦点物体会渗到失焦背景;近景半径过大时整屏像被抹糊;半透明大致忽略,多数情况可接受。
出处
- realtime_rendering_4ed.pdf 第 12 章 Image-Space Effects
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 12 章 12.7.2 节
- PBRT 4e source excerpt: chapter 05 (Cameras and Film)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 5 章 5.2.3 节,pbr-book.org/4ed/Cameras_and_Film
- Chapter 28. Practical Post-Process Depth of Field — Earl Hammon Jr. (Infinity Ward)
- developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-28-practical-post-process-depth-field