前言
这是 COMP3271 的课程笔记页。内容围绕计算机图形学(Computer Graphics)的核心概念、渲染技术、图形管线和典型题型整理。
课程信息
- 课程代码:COMP3271
- 课程名称:Computer Graphics
- 学期:2026-2027 第一学期
这是 COMP3271 的课程笔记页。内容围绕计算机图形学(Computer Graphics)的核心概念、渲染技术、图形管线和典型题型整理。
开场 几何(Geometry)是计算机图形学的基础。渲染系统要处理物体形状、相机位置、光照方向、表面法向量和像素插值,这些都需要清楚区分标量、向量和点。 这一讲的重点不是抽象代数本身,而是建立图形学里最常用的一套计算语言:哪些对象可以相加,哪些对象不能随便相加,怎样表示线段、三角形和平面,以及为什么重心坐标可以用于插值。 标量 标量(Scalar)就是实数。它可以进行加法和乘法,并满足结合律、交换律、单位元和逆元等基本性质。 标量本身没有方向,也没有空间位置。长度、时间、质量、颜色通道值和插值系数都可以是标量。它们在几何计算中经常用来缩放向量、混合点或控制参数范围。 向量 向量(Vector)可以从物理上理解为同时具有方向和大小的量。力、速度和有向线段都是向量。图形学里最常见的向量是有向线段,因为它可以表达方向、位移、法向量和观察方向。 向量可以首尾相接相加,也可以乘以标量。 flowchart LR U[u] --> V[v] V --> W[u + v] 向量空间(Vector Space)中的对象要满足一组规则,例如交换律、结合律、零向量、逆向量、标量乘法和分配律。重要的是,向量空间不一定只由箭头构成。多项式、函数和图像在合适定义下也可以形成向量空间。 图形学中的常用向量 图形学中经常出现三类方向向量。 向量 含义 用途 光照向量(Light Vector) 指向光源或沿光传播方向的向量 计算光照方向 法向量(Normal Vector) 垂直于表面的向量 计算表面朝向和亮度 观察向量(View Vector) 指向相机或观察者的向量 计算视角相关效果 在光照模型中,法向量和光照向量之间的角度会影响亮度。表面正对光源时更亮,斜向光源时更暗。 点积和叉积 点积(Dot Product)把两个向量变成一个标量。 $$ \mathbf{v} \cdot \mathbf{w} = \lVert \mathbf{v} \rVert \lVert \mathbf{w} \rVert \cos \theta $$当两个向量都是单位向量时,点积等于夹角余弦。它可以度量一个向量在另一个向量方向上的投影程度。漫反射光照中常见的形式就是 $$ I = I_L k_d(\mathbf{n} \cdot \mathbf{l}) $$其中 $\mathbf{n}$ 是单位法向量,$\mathbf{l}$ 是单位光照方向,$I_L$ 是光源强度,$k_d$ 是漫反射系数。实际实现中通常还会把负值截断为 $0$,因为背向光源的表面不应该得到这部分直接漫反射。 叉积(Cross Product)只对三维向量定义,结果是一个新向量。 ...
开场 图形系统的目标是把应用程序给出的场景描述转换成屏幕上的图像。应用程序通常负责指定物体、材质、观察者和光源;底层系统负责把这些描述一步一步处理成像素。 图形管线(Graphics Pipeline)就是这种处理流程的核心抽象。它把复杂的成像过程拆成多个阶段,每个阶段接收上一阶段的输出,再生成下一阶段需要的数据。现代图形硬件可以把许多阶段放到 GPU 上并行执行,因此它特别适合实时渲染。 图形系统和 API 应用程序不应该直接控制图形硬件的每个细节。更合理的方式是通过应用程序编程接口(Application Programming Interface,API)描述“要画什么”,由图形系统决定“怎么画”。 flowchart LR A[图形应用程序] --> B[图形 API] B --> C[图形管线] C --> D[帧缓冲区] D --> E[屏幕显示] API 通常提供几类信息的入口。 信息 作用 物体 指定点、线段、多边形、曲线或曲面 观察者 指定相机位置、朝向、视口和投影方式 光源 指定光的位置、方向、颜色和强度 材质 指定表面对光的吸收、漫反射、镜面反射等性质 输入与系统能力 处理鼠标、键盘、显示设备和硬件功能 这种分层让应用开发者专注于场景组织,也让图形系统可以独立优化底层执行方式。 两种成像思路 从物理角度看,可以用光线追踪(Ray Tracing)模拟成像。它从投影中心或相机出发追踪光线,判断光线碰到哪些物体、发生反射还是折射,最后计算颜色。光线追踪适合处理全局效果,例如多次反射、透明物体和复杂阴影,但计算成本较高,而且通常需要在计算时访问完整场景数据。 实时图形系统常用另一种更实用的思路:按照应用程序生成物体的顺序,一个物体接一个物体处理。它通常重点处理局部光照,不完整模拟物体之间的复杂光传输。这个取舍牺牲了一部分物理真实性,但换来了更稳定的实时性能。 管线总览 一个基本图形管线可以概括成以下阶段。 flowchart LR A[顶点数据] --> B[顶点处理] B --> C[裁剪与图元组装] C --> D[光栅化] D --> E[片元处理] E --> F[像素] 每个阶段处理的数据粒度不同。顶点处理关注点的位置和属性;图元组装把点组织成线段、多边形、曲线或曲面;光栅化把几何对象覆盖到像素网格上;片元处理决定每个候选像素最终写入什么颜色。 顶点处理 顶点处理(Vertex Processing)的大量工作是坐标变换。一个点在建模时通常先处在物体自己的局部坐标系中;进入场景后,需要转换到世界坐标系;相机观察时,又需要转换到相机坐标系;最后投影到屏幕坐标系。 flowchart LR A[物体坐标] -->|模型变换| B[世界坐标] B -->|观察变换| C[相机坐标] C -->|投影变换| D[裁剪坐标] D -->|视口变换| E[屏幕坐标] 这些坐标变化通常都可以表示成矩阵变换。矩阵形式的好处是统一、可组合,并且非常适合 GPU 并行计算。顶点处理阶段还可以计算或传递顶点颜色、法向量、纹理坐标等属性。 ...
开场 计算机图形学(Computer Graphics)研究的是如何用计算方法生成、表示和处理视觉内容。它不等同于使用某个商业软件做图,而是关注视觉内容背后的数学模型、算法和系统实现。 从课程角度看,计算机图形学可以先理解为“视觉模拟的算法”。我们给计算机一个场景描述,包括物体、材质、相机和光源,系统再计算出屏幕上的图像。很多后续内容都可以围绕这个问题展开:一个三维世界怎样被表示,怎样运动,最后怎样变成二维图像。 三条主线 计算机图形学的核心内容通常可以分成建模(Modeling)、动画(Animation)和渲染(Rendering)三条主线。 flowchart LR A[建模 Modeling表示物体和环境] --> B[动画 Animation描述状态随时间变化] B --> C[渲染 Rendering模拟成像过程] C --> D[图像 Image屏幕上的像素数组] 建模要回答“场景里有什么”。一个物体不仅有形状(shape),还可能有外观属性(appearance),例如它是否发光、怎样反射光、是否允许光穿过。模型可以由公式手工描述,也可以通过交互建模、程序生成、三维扫描、计算机视觉或生成式模型得到。 动画要回答“物体如何运动”。最直接的方式是把位置、角度和其他状态写成时间的函数。实际系统里,动画可以由关键帧(Keyframing)指定,也可以通过物理模拟、动作捕捉或行为模拟得到。 渲染要回答“图像如何形成”。它需要模拟光从光源出发,在场景中传播,与物体表面相互作用,最后进入相机并形成图像。渲染既涉及几何,也涉及光照、材质和采样。 建模 建模的对象不只是“外轮廓”。在图形系统中,一个模型至少要说明两类信息。 信息 含义 例子 形状 物体在空间中的几何结构 点、线段、多边形网格、曲线、曲面 外观 物体与光相互作用的方式 颜色、粗糙度、反射、透明、发光 例如,一张桌子的几何模型可以说明桌面和桌腿的位置;材质模型则说明它看起来是木头、金属还是玻璃。只给出几何形状,系统通常还不能产生可信的图像,因为光照结果取决于表面如何吸收、反射或透射光。 动画 动画本质上是在时间维度上组织场景状态。一个静态模型只说明某一刻的形状和位置;动画还要说明这些量怎样随时间变化。 flowchart LR K[关键帧] --> I[插值] S[物理规律] --> M[模拟] C[动作捕捉] --> R[重建运动] I --> A[连续动画] M --> A R --> A 关键帧方法适合艺术家直接控制动作。物理模拟适合处理流体、布料、雪、碰撞和刚体运动。动作捕捉适合从真实表演中获取人体姿态。行为模拟则常用于让角色或对象根据规则自动行动。 渲染和成像 渲染可以类比真实相机的成像过程。光源产生照明,光在场景中传播,碰到物体后发生反射、吸收或透射,最后一部分光进入相机并在成像平面上形成图像。 flowchart LR L[光源] -->|照明| O[物体表面] O -->|反射或透射| C[相机] O -->|吸收| H[热或其他能量形式] C --> F[成像平面] F --> P[像素数组] 这条路径也叫光传输(Light Transport)。真实世界中的光可以看成由大量光子组成,也可以从波长和能量分布来描述。图形学中的渲染算法会根据目标取舍精度和速度。电影制作可以花很长时间计算一帧;交互应用则必须在很短时间内连续生成图像。 ...