前置知识: 计算机基础

计算机图形学

8 minIntermediate2026/6/14

计算机图形学:图形变换、光栅化、光照模型、着色与渲染管线

1. 形学基础

1.1 坐标系统

坐标系说明
模型空间物体局部坐标
世界空间全局坐标
观察空间相机坐标
裁剪空间投影后坐标
屏幕空间像素坐标

1.2 变换矩阵

平移

T=(100tx010ty001tz0001)T = \begin{pmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{pmatrix}

缩放

S=(sx0000sy0000sz00001)S = \begin{pmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

旋转(绕 Z 轴)

Rz=(cosθsinθ00sinθcosθ0000100001)R_z = \begin{pmatrix} \cos\theta & -\sin\theta & 0 & 0 \\ \sin\theta & \cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

1.3 MVP 变换

pclip=Mprojection×Mview×Mmodel×plocal\mathbf{p}_{clip} = M_{projection} \times M_{view} \times M_{model} \times \mathbf{p}_{local}

2. 投影

2.1 透视投影

近大远小,符合人眼视觉:

Mpersp=(2nrl0r+lrl002ntbt+btb000f+nfn2fnfn0010)M_{persp} = \begin{pmatrix} \frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0 \\ 0 & \frac{2n}{t-b} & \frac{t+b}{t-b} & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & -\frac{2fn}{f-n} \\ 0 & 0 & -1 & 0 \end{pmatrix}

其中 nn 为近裁剪面距离,ff 为远裁剪面距离。

2.2 正交投影

平行投影,无近大远小:

Mortho=(2rl00r+lrl02tb0t+btb002nfn+fnf0001)M_{ortho} = \begin{pmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{2}{n-f} & -\frac{n+f}{n-f} \\ 0 & 0 & 0 & 1 \end{pmatrix}

3. 光栅化

3.1 三角形光栅化

将三角形覆盖的像素标记为”内部”。

判断点在三角形内

使用叉积判断:

v0×v1>0v1×v2>0v2×v0>0\vec{v}_0 \times \vec{v}_1 > 0 \wedge \vec{v}_1 \times \vec{v}_2 > 0 \wedge \vec{v}_2 \times \vec{v}_0 > 0

3.2 重心坐标

三角形内任意点 PP 可表示为:

P=αA+βB+γCP = \alpha A + \beta B + \gamma C

α+β+γ=1,α,β,γ0\alpha + \beta + \gamma = 1, \quad \alpha, \beta, \gamma \geq 0

α=SPBCSABC,β=SPCASABC,γ=SPABSABC\alpha = \frac{S_{PBC}}{S_{ABC}}, \quad \beta = \frac{S_{PCA}}{S_{ABC}}, \quad \gamma = \frac{S_{PAB}}{S_{ABC}}

3.3 Z-Buffer 算法

维护深度缓冲区,解决遮挡问题:

for each triangle:
    for each pixel in triangle:
        if z < zbuffer[x][y]:
            zbuffer[x][y] = z
            framebuffer[x][y] = color

时间复杂度O(n)O(n)nn 为三角形数 × 每个三角形的像素数)

空间复杂度O(W×H)O(W \times H)(帧缓冲 + 深度缓冲)

4. 光照模型

4.1 Phong 光照模型

I=Iaka+Idkd(NL)+Isks(RV)nI = I_a \cdot k_a + I_d \cdot k_d (\mathbf{N} \cdot \mathbf{L}) + I_s \cdot k_s (\mathbf{R} \cdot \mathbf{V})^n

分量含义说明
环境光 IakaI_a k_a全局光照常量
反射 Idkd(NL)I_d k_d(\mathbf{N} \cdot \mathbf{L})Lambert 反射与视角无关
镜面反射 Isks(RV)nI_s k_s(\mathbf{R} \cdot \mathbf{V})^n高光与视角有关

Blinn-Phong 改进:用半程向量 H=L+VL+V\mathbf{H} = \frac{\mathbf{L}+\mathbf{V}}{\|\mathbf{L}+\mathbf{V}\|} 替代 R\mathbf{R}

Ispecular=ks(NH)nI_{specular} = k_s (\mathbf{N} \cdot \mathbf{H})^n

4.2 着色频率

着色方式计算位置效果
Flat 着色每个面面片感强
Gouraud 着色每个顶点较平滑
Phong 着色每个像素最平滑

5. 纹理映射

5.1 纹理坐标

将2D纹理映射到3D表面:

(u,v)[0,1]×[0,1](u, v) \in [0, 1] \times [0, 1]

5.2 纹理过滤

方法质量性能
最近邻差(锯齿)最快
双线性中等
三线性最好(Mipmap)较慢

Mipmap:预计算多级纹理,根据像素与纹理的距离选择级别:

级别=log2(max(dudx,dvdx,dudy,dvdy))\text{级别} = \log_2\left(\max\left(\frac{du}{dx}, \frac{dv}{dx}, \frac{du}{dy}, \frac{dv}{dy}\right)\right)

5.3 法线贴

用纹理存储法线方向,模拟表面细节而不增加几何复杂度:

N=normalize(Tnt)\mathbf{N}' = \text{normalize}(T \cdot \mathbf{n}_t)

其中 TT 为切线空间变换矩阵,nt\mathbf{n}_t 为纹理中的法线。

6. 渲染管线

6.1 形渲染管线

顶点数据 → 顶点着色器 → 图元装配 → 几何着色器 → 光栅化 → 片段着色器 → 混合 → 帧缓冲
阶段可编程功能
顶点着色器MVP 变换
元装配组装
几何着色器生成/修改
光栅化生成片段
片段着色器着色、纹理
混合深度测试、混合

6.2 光线追踪

从相机发射光线,与场景求交:

for each pixel:
    ray = generate_ray(pixel)
    hit = trace_ray(ray, scene)
    color = shade(hit)

递归光线追踪:在交点处继续发射反射/折射光线。

加速结构

结构构建时间查询时间
BVHO(nlogn)O(n\log n)O(logn)O(\log n)
KD-TreeO(nlogn)O(n\log n)O(logn)O(\log n)
八叉树O(n)O(n)O(logn)O(\log n)

6.3 路径追踪

蒙特卡洛方法求解渲染方程:

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

通过采样估计积分

LoLe+1Ni=1NfrLi(nωi)p(ωi)L_o \approx L_e + \frac{1}{N}\sum_{i=1}^{N}\frac{f_r L_i (\mathbf{n} \cdot \omega_i)}{p(\omega_i)}

收敛速度:O(1/N)O(1/\sqrt{N})