Skip to content

相机与透镜

前面的章节主要讨论场景本身:几何、光照、材质和光线传播。但最终画面不是“场景的客观复制”,而是通过相机形成的一张图像。同一个场景,换一个焦距、光圈、曝光或对焦距离,画面会完全不同。

图形学里的相机不是一个简单的观察点。它决定从哪里看、看多宽、哪些东西清晰、哪些东西模糊、亮度如何映射到图像,以及时间上是否产生运动模糊。

相机模型要回答三个基本问题:

  • 从哪里发出光线? 这由相机位置和朝向决定。
  • 光线往哪里发? 这由成像平面、焦距、视场和像素位置决定。
  • 每条光线如何被记录? 这由光圈、快门、曝光和传感器响应决定。

最简单的渲染相机是针孔相机。它假设所有光线都从一个无大小的点出发,穿过成像平面上的像素位置进入场景。针孔相机模型非常适合理解透视投影,但它不会产生景深,也不能表现真实镜头的很多现象。

相机成像链路

针孔相机可以理解成一个极小的小孔,场景中每个方向的光只能通过这个点到达成像平面。因为入口没有面积,所以每个像素对应一条明确的方向,画面中所有深度的物体都同样清晰。

在图形学里,针孔相机常用于:

  • 实时渲染中的标准透视投影。
  • 光线追踪中的主光线生成。
  • 理解相机空间、裁剪空间和屏幕空间之间的关系。

它的优点是简单稳定,缺点是过于理想化。真实相机会有镜头孔径、对焦距离、曝光时间、畸变和传感器响应。

焦距描述镜头的成像尺度。焦距越短,视场越宽,能看到更大的范围;焦距越长,视场越窄,画面更像被“拉近”。

在渲染器中,我们经常直接使用视场角,也就是 FOV。它和焦距是同一件事情的不同表达方式:

焦距短 → 视场宽 → 透视感强
焦距长 → 视场窄 → 透视压缩

需要注意,“长焦把远处拉近”不是物体真的变近了,而是视场变窄后,同样尺寸的屏幕区域容纳了更小的角度范围。远近物体在画面中的比例关系也会因此改变。

透视感主要由相机位置决定,焦距则决定你从这个位置截取多宽的画面。广角镜头常常需要相机靠近主体才能让主体足够大,于是近处物体显得更夸张,远处物体退得更快。

长焦镜头通常让相机离主体更远,远近物体在画面里的大小差距减小,看起来像空间被压缩。很多“焦距改变透视”的说法,实际混合了焦距变化和相机位置变化。

在图形学调镜头时,可以记住:

  • 想表现空间纵深,常用较宽视场并靠近主体。
  • 想压缩背景、突出人物或物体轮廓,常用较窄视场并后退。
  • 过宽的视场容易让画面边缘变形,尤其是人物脸部和建筑边缘。

真实镜头不是一个点,而是有面积的孔径。光圈越大,能进入的光越多,同时景深越浅。景深表示画面中前后仍然显得清晰的距离范围。

在薄透镜模型里,相机光线不再都从同一个点出发,而是从镜头孔径上的随机位置出发,并汇聚到对焦平面上的某一点。

针孔相机:所有光线从同一点出发
薄透镜相机:光线从光圈面积上随机出发,并对焦到指定距离

对焦平面上的物体会清晰;比它更近或更远的物体会形成模糊圈。这个模糊圈常叫弥散圆。

下面的小程序把镜头参数变成可观察的画面。左侧是相机和场景深度示意,右侧是简化后的画面预览。它不是真实摄影模拟,但能帮助理解三件事:视场、景深和离焦模糊。

左侧显示相机视场与对焦平面,右侧显示简化画面。焦距越长视场越窄;光圈越大,离焦物体越模糊;对焦距离决定哪一层最清晰。

可以尝试:

  • 增大焦距,观察视场变窄,画面更像被拉近。
  • 增大光圈,观察非对焦距离的物体模糊更明显。
  • 改变对焦距离,观察清晰区域如何在前景、中景和背景之间移动。

曝光决定传感器记录多少光。真实相机里,它主要由三件事控制:

  • 光圈。 孔径越大,进光越多。
  • 快门时间。 暴露时间越长,累计光越多。
  • 感光度。 传感器或后处理对信号的放大程度。

在渲染中,路径追踪计算出来的辐射亮度可能远超显示器能直接表现的范围。因此还需要曝光和色调映射,把物理亮度转换成可显示图像。

曝光过低会丢失暗部细节,曝光过高会让高光大片变白。好的曝光不是让所有地方都“看得见”,而是服务于画面重点。

如果相机或物体在曝光时间内移动,传感器记录到的不是某一瞬间,而是一段时间内的平均结果。这就是运动模糊。

图形学中可以通过时间采样模拟运动模糊:

每条相机光线随机选择一个时间
在该时间点计算物体位置和相机位置
多条样本平均后形成运动模糊

运动模糊能让动画更自然,因为真实相机不会把高速运动冻结成完全锐利的形状。但如果使用过度,也会让画面失去可读性。

真实镜头通常不是完美针孔。广角镜头可能有桶形畸变,长焦或某些镜头可能有枕形畸变。画面边缘还可能因为入射光减少出现暗角。

这些效果在物理相机模型中可以模拟,也可以作为后处理加入。它们不一定总是“错误”,有时反而是影像风格的一部分。

常见镜头效果包括:

  • 桶形畸变。 画面边缘向外鼓,常见于广角。
  • 枕形畸变。 画面边缘向内收。
  • 暗角。 画面边缘比中心更暗。
  • 色差。 不同波长折射程度不同,边缘出现彩色偏移。
  • 眩光和光晕。 强光在镜头内部反射或散射形成可见痕迹。

路径追踪器中的相机通常负责生成主光线。针孔相机只需要根据像素位置和视场构造方向;薄透镜相机还需要在光圈上随机采样一个点。

  1. 把像素坐标转换到成像平面。
    加入随机抖动可以做抗锯齿采样。

  2. 根据焦距或视场得到主方向。
    方向从相机位置指向成像平面上的采样点。

  3. 如果使用针孔相机,直接发射光线。
    光线起点是相机中心,方向是主方向。

  4. 如果使用薄透镜相机,在光圈上采样。
    光线起点变为孔径上的随机点。

  5. 计算对焦平面上的目标点。
    所有孔径样本都朝向这个目标点,形成景深效果。

  6. 如果使用运动模糊,再采样时间。
    用该时间更新场景和相机状态。

概念代码可以写成:

const filmPoint = sampleFilm(pixel);
const focusPoint = projectToFocusPlane(filmPoint, focusDistance);
const lensPoint = sampleDisk(apertureRadius);
const rayOrigin = cameraPosition + lensPoint;
const rayDirection = normalize(focusPoint - rayOrigin);
const rayTime = random shutter time;

这个流程把抗锯齿、景深和运动模糊都统一成“对相机维度进行采样”。

调相机时,常见问题往往不是渲染算法错了,而是相机参数不合适:

  • 画面像手机广角拉伸。 FOV 过大,或者相机离主体太近。
  • 空间显得很平。 FOV 过窄且相机太远,远近层次被压缩。
  • 景深像贴了模糊滤镜。 光圈太大,或者对焦距离没有落在主体上。
  • 亮部全白。 曝光或色调映射没有保留高光层次。
  • 运动模糊过脏。 快门时间太长,或采样数不足。
  • 镜头效果太抢戏。 畸变、暗角、色差和眩光超过了画面需要。

相机参数不是后期装饰,而是画面表达的一部分。图形学越接近真实影像,越需要把相机当作渲染系统的一环。

本章把渲染结果放进相机模型中理解:

  1. 针孔相机提供最基础的透视投影和主光线生成方式。
  2. 焦距和视场决定画面截取范围,相机位置决定主要透视关系。
  3. 光圈和对焦距离共同决定景深与离焦模糊。
  4. 曝光、快门和感光度控制记录多少光,并影响最终亮度表达。
  5. 运动模糊可以看作时间维度上的采样平均。
  6. 镜头畸变、暗角、色差和眩光既可能是缺陷,也可能是风格。

下一章会进入光场、颜色与感知:即使物理光线已经被相机记录下来,人眼和显示设备如何感知颜色,仍然会深刻影响最终画面。