跳转到内容
← 返回核心概念
计算机科学应用计算机科学 · 图形学15 分钟阅读

计算机图形学

Computer Graphics

1995 年,《玩具总动员》(Toy Story)上映,这是第一部完全由计算机生成的长篇动画电影。导演约翰·拉塞特(John Lasseter)和皮克斯团队用了约四年完成制作,全片 11.4 万帧画面由一个 117 台 Sun 工作站组成的"渲染农场"算出,累计耗费约 80 万机时(machine-hour)——平均每…

图形学渲染GPU光线追踪光栅化

1995 年,《玩具总动员》(Toy Story)上映,这是第一部完全由计算机生成的长篇动画电影。导演约翰·拉塞特(John Lasseter)和皮克斯团队用了约四年完成制作,全片 11.4 万帧画面由一个 117 台 Sun 工作站组成的"渲染农场"算出,累计耗费约 80 万机时(machine-hour)——平均每帧要算上数小时。

今天,一部电影里的单帧画面可能包含数百亿条光线路径的模拟,而你的手机 GPU 每秒能渲染数十亿个像素。

这背后是计算机图形学(Computer Graphics)半个世纪的发展。

这门学科的起点,比游戏早得多

人们常把计算机图形学和电子游戏、好莱坞特效划等号,以为它是 1980 年代之后才有的东西。它的真正源头要早得多。

1963 年,麻省理工学院的伊万·萨瑟兰(Ivan Sutherland)在 TX-2 计算机上完成博士论文 Sketchpad:用户拿光笔直接在 CRT 屏幕上画线、施加几何约束、复制图元。这是第一个真正交互式的图形程序,被公认为现代 CAD 软件与图形界面的共同祖先,萨瑟兰也因此获得 1988 年图灵奖。

十余年后,犹他大学成了这门学科的孵化器。爱德温·卡特穆尔(Edwin Catmull)在 1974 年的博士论文里同时发明了纹理映射(Texture Mapping)Z 缓冲(Z-buffer,深度缓冲,几乎同期由 Wolfgang Straßer 独立提出)——前者把二维图案贴到三维表面,后者用一张"深度图"逐像素记录最近的物体、解决"谁挡住谁"的可见性难题。今天几乎每一块 GPU 都内置 Z 缓冲。卡特穆尔后来联合创办皮克斯,并在 2019 年与帕特·汉拉恩(Pat Hanrahan)共获图灵奖。开篇那部《玩具总动员》,正是这条犹他血脉结出的果实。

破除误解:图形学不只是"画图"

计算机图形学常被误解为只是让画面"好看"的技术。实际上,图形学解决的是一组严格的数学和物理问题:

如何将三维世界投影到二维屏幕?(几何变换、投影)

如何确定哪些物体在哪些物体的前面?(可见性、深度测试)

光在物体表面如何反射?(光照模型、着色)

如何高效地处理数百万个几何体?(GPU 并行计算)

这些问题的解答涉及线性代数、微积分、物理光学、信号处理和并行算法。

渲染管线:从三维到像素

现代实时图形(游戏、CAD、VR)的核心是渲染管线(Rendering Pipeline)——一套把三维场景转换为二维像素的固定流程:

顶点数据
  ↓ 顶点着色器(Vertex Shader)
  ↓   变换每个顶点的位置(模型→世界→相机→裁剪空间)
  ↓ 图元装配(Primitive Assembly)
  ↓   把顶点连接成三角形
  ↓ 光栅化(Rasterization)
  ↓   把三角形转换为像素覆盖
  ↓ 片段着色器(Fragment Shader)
  ↓   计算每个像素的颜色(光照、纹理、阴影)
  ↓ 深度测试 / 混合
  ↓   决定最终颜色,处理透明度
  ↓ 帧缓冲(Framebuffer)
  ↓   输出到屏幕
```

这条管线中,着色器(Shader) 是可编程的部分——开发者用 GLSL 或 HLSL 编写 GPU 程序,控制顶点变换和像素着色。

消费级图形硬件的可编程化有两个关键节点。1999 年,NVIDIA 把几何变换与光照(transform & lighting)整合进单芯片、宣称每秒至少处理 1000 万个多边形,并用"GPU"(图形处理器)一词为 GeForce 256 命名,这个缩写从此固定下来。但 GeForce 256 仍是固定管线(fixed-function),开发者只能调参数、不能改算法。真正的转折是 2000 年的 DirectX 8 与 2001 年的 GeForce 3——可编程的顶点与片段着色器第一次进入消费级硬件。而"着色器"概念其实更早:1984 年罗布·库克(Rob Cook)提出"着色树"(shade trees),1988 年皮克斯 RenderMan 规范正式引入 shader,只不过那都是为离线电影渲染服务的。

坐标变换与矩阵

计算机图形学的数学核心是线性变换。物体从局部坐标系到世界坐标系到相机坐标系到屏幕的过程,用一系列矩阵乘法表示:

Pclip=MprojectionMviewMmodelPlocalP_{clip} = M_{projection} \cdot M_{view} \cdot M_{model} \cdot P_{local}

其中每个矩阵是 4×44 \times 4 的齐次坐标矩阵(引入第四维使平移也能用矩阵乘法表示)。所有变换——平移、旋转、缩放、透视投影——都统一在这个框架下。

四元数(Quaternion) 用于表示三维旋转,避免了欧拉角的"万向节锁"(Gimbal Lock)问题,是游戏引擎和三维动画软件的标准旋转表示方式。

光照与着色模型

Phong 光照模型(裴祥风,1975)是最经典的实时光照近似,把光分为三部分: - 环境光(Ambient):来自环境的均匀漫射光,防止完全黑暗 - 漫反射(Diffuse):与光线入射角有关,符合朗伯余弦定律 - 镜面反射(Specular):产生高光,依赖视角和光线反射角的关系

I=kaIa+kd(LN)Id+ks(RV)nIsI = k_a I_a + k_d (L \cdot N) I_d + k_s (R \cdot V)^n I_s

其中 $L$ 是光线方向,$N$ 是法线,$R$ 是反射方向,$V$ 是视线方向,$n$ 是高光指数。

Phong 模型的局限:它是经验模型,不基于物理。现代游戏和电影使用基于物理的渲染(Physically Based Rendering,PBR),用微表面理论(Microfacet Theory)建模表面的粗糙度与金属度,产生更真实的效果。

光线追踪 vs 光栅化

这是图形学最重要的分野:

光栅化(Rasterization):对每个三角形,确定它覆盖了哪些像素,然后着色。速度极快,是实时图形(游戏)的主流方法。但全局光照效果(阴影、反射、折射、间接光)需要额外的近似技术(阴影贴图、屏幕空间反射等),效果有局限。

光线追踪(Ray Tracing):对每个像素,沿视线向场景发射光线,追踪光线与物体的交叉,递归地跟踪反射、折射和阴影光线。物理上更正确,自然产生逼真的阴影、反射和全局光照。计算量极大,传统上只用于离线渲染(电影)。

一个常见误解是:光线追踪是 RTX 显卡带来的"新技术"。其实它的历史几乎和这门学科一样长。1968 年,IBM 的阿瑟·阿佩尔(Arthur Appel)就用"光线投射"(ray casting)求解可见面与阴影;1980 年,贝尔实验室的特纳·惠特德(Turner Whitted)发表递归光线追踪,第一次让镜面反射、玻璃折射和阴影从同一个算法里自然涌现。2018 年 NVIDIA 的 RTX 系列(用 BVH 包围盒层级树加速光线求交)改变的不是思想,而是算力——它把这套已存在数十年、过去只能离线计算的算法,第一次塞进了能跑 60 帧的实时硬件里。

路径追踪(Path Tracing):光线追踪的随机版本。每条光线在交点处随机选择散射方向,通过大量采样(Monte Carlo 方法)收敛到物理正确的结果。这是皮克斯、迪士尼等电影制作公司的主流离线渲染方法。

渲染方程:所有渲染算法的共同目标

1986 年,吉姆·卡吉雅(Jim Kajiya)在 SIGGRAPH 提出渲染方程(The Rendering Equation),用一个积分方程概括了几乎所有渲染算法到底在求什么:

Lo(x,ωo)=Le(x,ωo)+Ωfr(x,ωi,ωo)Li(x,ωi)(ωin)dωiL_o(\mathbf{x}, \omega_o) = L_e(\mathbf{x}, \omega_o) + \int_{\Omega} f_r(\mathbf{x}, \omega_i, \omega_o)\, L_i(\mathbf{x}, \omega_i)\, (\omega_i \cdot \mathbf{n})\, \mathrm{d}\omega_i

它说的是:从一点 x\mathbf{x} 沿方向 ωo\omega_o 射出的光 LoL_o,等于该点自身发出的光 LeL_e,加上从四面八方(半球 Ω\Omega)射来、再被表面反射出去的那部分光的总和。其中 frf_r 是描述"材质如何反射光"的双向反射分布函数(BRDF)。

这个方程的关键在于:积分号里嵌着 LiL_i——照到这一点的光,本身又来自别处的表面,是同一个方程的解。光在场景里无穷次互相弹射,方程因此是递归的、没有解析解。

由此看,光栅化、光线追踪、路径追踪并不是三种割裂的技术,而是用不同精度去逼近同一个积分。路径追踪用蒙特卡洛随机采样估计它,代价是结果带噪点,往往要每像素成千上万次采样才能收敛干净——这正是电影单帧要算上几小时的根本原因。

抗锯齿

光栅化的一个根本问题是锯齿(Aliasing):连续的几何形状映射到离散像素网格时,边缘呈现台阶状。根本原因是采样频率(像素分辨率)低于信号频率(几何细节),违反了奈奎斯特定理。

主要解决方法: - 多重采样抗锯齿(MSAA):每像素多个采样点,取平均 - 时域抗锯齿(TAA):利用前几帧的信息,时间上积累采样 - 深度学习超采样(DLSS,AMD FSR):用 AI 从低分辨率推断高分辨率结果

代价与争议

实时 vs 离线的长期分野:长期以来,实时图形和离线渲染(电影)使用完全不同的技术栈。实时走极简化近似,离线走物理正确。GPU 性能的暴增和光线追踪硬件的出现正在模糊这条边界,但完全物理正确的实时渲染仍需数十年。

AI 对图形学的冲击:Stable Diffusion、Midjourney 等扩散模型可以直接生成逼真图像,不经过任何几何建模和光线模拟。这对传统 CG 工作流的冲击是深远的,艺术家和技术人员都在调整适应。NeRF(Neural Radiance Fields,2020)则用神经网络隐式编码三维场景,代表了传统图形学与机器学习融合的新方向。

跨域连接

  • 蒙特卡洛方法:路径追踪的噪声按采样数的平方根下降,噪点减半要四倍采样。这条收敛率直接决定了电影单帧要算上几小时的成本结构,也解释了去噪算法的边际收益为何如此之大——它省下的是平方级的采样量。推论是:把采样预算花在方差最大的那些路径上,比整体加倍采样更划算。
  • 傅里叶分析:锯齿的成因是采样率低于信号最高频率的两倍,高频被折叠成低频。可检验推论:抗锯齿不是把边缘涂糊,而是在采样之前限制带宽;顺着这条逻辑,纹理缩小时的闪烁与几何边缘的锯齿是同一个问题。同理,提高分辨率只是把折叠点推远,并没有消除混叠本身。
  • 几何光学与透镜:投影矩阵是针孔相机的理想化,它没有光圈也没有色散,所以景深、色差、镜头畸变一概不会自动出现。要让画面"像照片",就得把透镜模型显式补回管线,而不是靠后期滤镜去模拟。
  • 感知生理学:人眼对亮度近似取对数响应,对色度的空间分辨率又低于亮度,于是渲染与压缩都优先保亮度、砍色度。可检验推论:用像素均方差衡量画质,会系统性高估那些肉眼根本分辨不出的差别。换用感知度量之后,可接受的压缩率往往还能再提高一截。
  • 艺术:线性透视是画家先解决的投影几何问题,模型、视图与投影矩阵只是把它形式化。两者共享同一条硬约束:单一视点决定唯一正确的投影,因此把多个视点的图像强行拼进一幅画,几何上必然出现矛盾。这也是全景拼接必须依赖投影变换、而不能简单粘贴的原因。

参考文献

  • Pharr, M., Jakob, W., Humphreys, G. Physically Based Rendering: From Theory to Implementation. MIT Press, 2023. (第四版免费在线:pbrt.org)
  • Akenine-Möller, T. et al. Real-Time Rendering, 4th Ed. CRC Press, 2018.
  • Foley, J. et al. Computer Graphics: Principles and Practice. Addison-Wesley, 1995. (经典教材)
  • Mildenhall, B. et al. NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis. ECCV, 2020.
  • Sutherland, I. E. Sketchpad: A Man-Machine Graphical Communication System. PhD thesis, MIT, 1963.
  • Catmull, E. A Subdivision Algorithm for Computer Display of Curved Surfaces. PhD thesis, University of Utah, 1974.
  • Appel, A. "Some Techniques for Shading Machine Renderings of Solids." AFIPS Spring Joint Computer Conference, vol. 32, 1968, pp. 37–45.
  • Phong, B. T. "Illumination for Computer Generated Pictures." Communications of the ACM, 18(6):311–317, 1975.
  • Whitted, T. "An Improved Illumination Model for Shaded Display." Communications of the ACM, 23(6):343–349, 1980.
  • Kajiya, J. T. "The Rendering Equation." Computer Graphics (SIGGRAPH '86 Proceedings), 20(4):143–150, 1986.

延伸阅读

  • Shirley, P. Ray Tracing in One Weekend. 2016. (免费在线:https://raytracing.github.io/)