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:
其中,公式中的 \(k_d\) 是漫反射系数,\(I\) 是光源的强度,\(\theta\) 是光线与法向量之间的夹角,\(\mathbf{N} \cdot \mathbf{L}\) 是法向量与光线方向的点积。
漫反射的物理直觉
漫反射的核心假设是:物体表面是 粗糙的(Lambertian),光线打到表面后会向各个方向均匀散射。因此漫反射的强度与观察者位置无关,只取决于:
- 光源强度 \(I/r^2\) — 遵循平方反比定律
- 入射角 — 光线与法线夹角越小,单位面积接收的光能越多
- 材质系数 \(k_d\) — 决定物体对光的吸收率
镜面反射(Specular Reflection)¶
镜面反射 模拟光滑表面上的高光效果。当观察者方向接近光线的反射方向时,会看到明亮的高光。
在 Blinn-Phong 模型中,使用 半程向量(Halfway Vector) \(\mathbf{H}\) 来简化计算:
当 \(\mathbf{H}\) 与法线 \(\mathbf{N}\) 越接近(即 \(\mathbf{N} \cdot \mathbf{H}\) 越大),高光越强。镜面反射分量的计算公式为:
其中:
| 符号 | 含义 |
|---|---|
| \(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)¶
环境光 模拟的是经过多次反射的间接光照。在没有环境光项时,物体背光面会完全黑色,这不真实。环境光用一个简单的常数项近似:
其中:
- \(k_a\) 是环境光系数,表示物体对环境光的反射率
- \(I_a\) 是环境光强度,通常是一个全局常数
环境光的局限性
环境光是一个非常粗糙的近似。它假设所有方向的间接光照均匀,不考虑物体之间的遮挡和光线反弹。更精确的全局光照方法(如 光线追踪、辐射度量学)将在后续课程中介绍。
Blinn-Phong 完整公式¶
将三个分量相加,得到 Blinn-Phong 着色模型 的完整公式:
三个分量的对比:
- 特点:与观察方向无关,各方向亮度相同
- 表现:物体的基础颜色
- 公式:\(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输出图像"]
- 顶点处理(Vertex Processing):对每个顶点应用 Model-View-Projection 变换,将其从模型空间投影到屏幕空间
- 三角形处理(Triangle Processing):将顶点组装成三角形图元
- 光栅化(Rasterization):将三角形离散化为片段(fragment),每个片段对应一个像素候选
- 片段处理(Fragment Processing):对每个片段执行着色计算(如 Blinn-Phong)和纹理采样
- 帧缓冲操作(Framebuffer Operations):深度测试、模板测试、混合,最终将颜色写入帧缓冲区