跳转至

Lecture 7: Illumination, Shading and Graphics Pipeline

Illumination and Shading

Shading

着色(Shading) 是将光照模型应用于物体表面以计算颜色的过程。它是渲染管线中决定物体外观的关键步骤。

Blinn-Phong Model

Blinn-Phong 模型是经典的局部光照经验模型,由 漫反射(Diffuse)镜面反射(Specular)环境光(Ambient) 三个分量组成。

基本方向向量定义:

  • Viewer direction \(\mathbf{V}\): 观察者或摄像机的方向。
  • Surface normal \(\mathbf{N}\): 物体表面的法向量。
  • Light direction \(\mathbf{L}\): 光源的方向。
  • Surface parameters:颜色、反射率等。

漫反射(Diffuse Reflection)

漫反射(Diffuse Reflection):光线会被物体表面均匀散射。Lambert 余弦定律 描述了漫反射的强度变化规律。

Lambert's cosine law:

\[ I_d = k_d \cdot I_L \cdot \cos(\theta) = k_d \cdot \frac{\mathbf{I}}{\mathbf{r^2}} \cdot \max(0, \mathbf{N} \cdot \mathbf{L}) \]

其中,公式中的 \(k_d\) 是漫反射系数,\(I\) 是光源的强度,\(\theta\) 是光线与法向量之间的夹角,\(\mathbf{N} \cdot \mathbf{L}\) 是法向量与光线方向的点积。

漫反射的物理直觉

漫反射的核心假设是:物体表面是 粗糙的(Lambertian),光线打到表面后会向各个方向均匀散射。因此漫反射的强度与观察者位置无关,只取决于:

  1. 光源强度 \(I/r^2\) — 遵循平方反比定律
  2. 入射角 — 光线与法线夹角越小,单位面积接收的光能越多
  3. 材质系数 \(k_d\) — 决定物体对光的吸收率

镜面反射(Specular Reflection)

镜面反射 模拟光滑表面上的高光效果。当观察者方向接近光线的反射方向时,会看到明亮的高光。

在 Blinn-Phong 模型中,使用 半程向量(Halfway Vector) \(\mathbf{H}\) 来简化计算:

\[ \mathbf{H} = bisector(\mathbf{L}, \mathbf{V}) = \frac{\mathbf{L} + \mathbf{V}}{\left\lVert \mathbf{L} + \mathbf{V}\right\rVert} \]

\(\mathbf{H}\) 与法线 \(\mathbf{N}\) 越接近(即 \(\mathbf{N} \cdot \mathbf{H}\) 越大),高光越强。镜面反射分量的计算公式为:

\[ L_s = k_s \cdot \left(\frac{I}{r^2}\right) \cdot \max(0, \mathbf{N} \cdot \mathbf{H})^{p} \]

其中:

符号 含义
\(k_s\) 镜面反射系数,控制高光的强度
\(I/r^2\) 到达表面的光照强度(平方反比衰减)
\(p\) 高光指数(shininess),值越大高光越集中、越小
为什么用半程向量而不是反射向量

经典 Phong 模型使用反射向量 \(\mathbf{R}\),通过 \(\mathbf{R} \cdot \mathbf{V}\) 判断高光强度。Blinn-Phong 模型改为使用半程向量 \(\mathbf{H}\) 与法线 \(\mathbf{N}\) 的夹角。

优势:当观察者和光源都很远时(方向近似平行),\(\mathbf{H}\) 的计算比 \(\mathbf{R}\) 更稳定。且 \(\mathbf{H} \cdot \mathbf{N}\)\(\mathbf{R} \cdot \mathbf{V}\) 在大多数情况下视觉差异不大,但计算更高效。

高光指数 \(p\) 的效果: - \(p\) 较小(如 10):高光范围大、柔和 - \(p\) 较大(如 100+):高光范围小、锐利,类似金属表面


环境光(Ambient Reflection)

环境光 模拟的是经过多次反射的间接光照。在没有环境光项时,物体背光面会完全黑色,这不真实。环境光用一个简单的常数项近似:

\[ L_a = k_a \cdot I_a \]

其中:

  • \(k_a\) 是环境光系数,表示物体对环境光的反射率
  • \(I_a\) 是环境光强度,通常是一个全局常数

环境光的局限性

环境光是一个非常粗糙的近似。它假设所有方向的间接光照均匀,不考虑物体之间的遮挡和光线反弹。更精确的全局光照方法(如 光线追踪辐射度量学)将在后续课程中介绍。


Blinn-Phong 完整公式

将三个分量相加,得到 Blinn-Phong 着色模型 的完整公式:

\[ L = L_d + L_s + L_a = k_d \cdot \frac{I}{r^2} \cdot \max(0, \mathbf{N} \cdot \mathbf{L}) + k_s \cdot \frac{I}{r^2} \cdot \max(0, \mathbf{N} \cdot \mathbf{H})^{p} + k_a \cdot I_a \]

三个分量的对比:

  • 特点:与观察方向无关,各方向亮度相同
  • 表现:物体的基础颜色
  • 公式\(L_d = k_d \cdot (I/r^2) \cdot \max(0, \mathbf{N} \cdot \mathbf{L})\)
  • 特点:与观察方向强相关,产生高光
  • 表现:物体表面的光泽和高光
  • 公式\(L_s = k_s \cdot (I/r^2) \cdot \max(0, \mathbf{N} \cdot \mathbf{H})^{p}\)
  • 特点:常数项,与任何方向无关
  • 表现:保证物体暗面不会全黑
  • 公式\(L_a = k_a \cdot I_a\)

:material-pipeline: 图形渲染管线(Graphics Pipeline)

图形渲染管线 是将 3D 模型转换为 2D 图像的标准化流程。

graph LR
    V["顶点数据"] --> VP["顶点处理\n(Vertex Processing)\nMVP变换"]
    VP --> PA["图元装配\n(Primitive Assembly)\n组装三角形"]
    PA --> R["光栅化\n(Rasterization)\n三角形→片段"]
    R --> FP["片段处理\n(Fragment Processing)\n着色+纹理"]
    FP --> FBO["帧缓冲操作\n(Framebuffer Ops)\n深度测试+混合"]
    FBO --> FB["帧缓冲\n输出图像"]
  1. 顶点处理(Vertex Processing):对每个顶点应用 Model-View-Projection 变换,将其从模型空间投影到屏幕空间
  2. 三角形处理(Triangle Processing):将顶点组装成三角形图元
  3. 光栅化(Rasterization):将三角形离散化为片段(fragment),每个片段对应一个像素候选
  4. 片段处理(Fragment Processing):对每个片段执行着色计算(如 Blinn-Phong)和纹理采样
  5. 帧缓冲操作(Framebuffer Operations):深度测试、模板测试、混合,最终将颜色写入帧缓冲区