第1章:图形学概述
1.1 什么是计算机图形学
1.1.1 定义
计算机图形学(Computer Graphics,简称 CG)是研究如何使用计算机生成、处理和显示图像的学科。它涉及图像的创建、存储、操作和显示的所有方面。
计算机图形学的核心
输入 处理 输出
┌─────────┐ ┌─────────────┐ ┌─────────┐
│ 数据 │ │ 图形学算法 │ │ 图像 │
│ 模型 │ ──────> │ 渲染管线 │ ──────> │ 动画 │
│ 参数 │ │ 几何处理 │ │ 视频 │
└─────────┘ └─────────────┘ └─────────┘
核心问题:
- 如何表示几何形状?
- 如何模拟光照效果?
- 如何实现真实感渲染?
- 如何提高渲染性能?1.1.2 图形学 vs 图像处理 vs 计算机视觉
这三个领域经常被混淆,但它们有本质的区别:
三个领域的关系
计算机视觉
(图像 → 模型)
分析、理解
│
│
┌────────────────────┼────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 图像 │ ◄────── │ 模型 │ ──────► │ 图像 │
└─────────┘ └─────────┘ └─────────┘
│ │ │
│ │ │
▼ ▼ ▼
图像处理 几何建模 计算机图形学
(图像 → 图像) (创建模型) (模型 → 图像)
增强、滤波 设计、编辑 渲染、显示
简单记忆:
- 图形学:模型 → 图像(合成)
- 图像处理:图像 → 图像(变换)
- 计算机视觉:图像 → 模型(分析)1.1.3 研究内容
计算机图形学的主要研究内容包括:
| 领域 | 内容 | 示例 |
|---|---|---|
| 建模 | 几何形状的表示和创建 | 网格、曲面、体素 |
| 渲染 | 将3D场景转换为2D图像 | 光线追踪、光栅化 |
| 动画 | 物体随时间的运动变化 | 骨骼动画、物理模拟 |
| 交互 | 用户与图形系统的交互 | GUI、VR/AR |
1.2 图形学发展历史
1.2.1 发展历程
计算机图形学发展时间线
1960s ─────────────────────────────────────────────────────────
│
├── 1963: Ivan Sutherland 发明 Sketchpad(第一个交互式图形系统)
│
├── 1968: 第一个头戴显示器(VR 雏形)
│
1970s ─────────────────────────────────────────────────────────
│
├── 1974: Ed Catmull 发明 Z-buffer 算法
│
├── 1975: Phong 光照模型提出
│
├── 1979: Turner Whitted 提出光线追踪算法
│
1980s ─────────────────────────────────────────────────────────
│
├── 1984: 《The Adventures of André & Wally B.》(第一部CGI动画短片)
│
├── 1986: Pixar 成立
│
1990s ─────────────────────────────────────────────────────────
│
├── 1992: OpenGL 1.0 发布
│
├── 1995: 《玩具总动员》(第一部全CGI动画电影)
│
├── 1996: 3dfx Voodoo(第一款消费级3D显卡)
│
2000s ─────────────────────────────────────────────────────────
│
├── 2001: 可编程着色器(GeForce 3)
│
├── 2004: WebGL 规范开始制定
│
2010s ─────────────────────────────────────────────────────────
│
├── 2011: WebGL 1.0 发布
│
├── 2018: NVIDIA RTX(实时光线追踪)
│
2020s ─────────────────────────────────────────────────────────
│
├── 2020: NeRF(神经辐射场)
│
├── 2022: WebGPU 标准化推进
│
└── 2024: 实时路径追踪、AI 渲染普及1.2.2 关键人物
| 人物 | 贡献 | 年代 |
|---|---|---|
| Ivan Sutherland | Sketchpad,计算机图形学之父 | 1960s |
| Ed Catmull | Z-buffer,细分曲面,Pixar创始人 | 1970s |
| Bui Tuong Phong | Phong 光照模型 | 1975 |
| James Blinn | 环境贴图,凹凸贴图 | 1970s |
| Turner Whitted | 光线追踪 | 1979 |
| Jim Kajiya | 渲染方程 | 1986 |
| Pat Hanrahan | RenderMan | 1990s |
1.3 应用领域
1.3.1 主要应用
计算机图形学应用领域
┌─────────────────────────────────────────────────────────────┐
│ 应用领域 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 游戏 │ │ 影视 │ │ 设计 │ │
│ │ 娱乐 │ │ 动画 │ │ 制造 │ │
│ ├─────────────┤ ├─────────────┤ ├─────────────┤ │
│ │ • 3D 游戏 │ │ • CG 电影 │ │ • CAD/CAM │ │
│ │ • VR/AR │ │ • 动画片 │ │ • 建筑设计 │ │
│ │ • 模拟器 │ │ • 特效 │ │ • 工业设计 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 科学 │ │ 医学 │ │ 教育 │ │
│ │ 可视化 │ │ 影像 │ │ 培训 │ │
│ ├─────────────┤ ├─────────────┤ ├─────────────┤ │
│ │ • 数据可视化│ │ • 医学成像 │ │ • 教学演示 │ │
│ │ • 气象模拟 │ │ • 手术模拟 │ │ • 虚拟实验 │ │
│ │ • 物理仿真 │ │ • 3D 打印 │ │ • 在线教育 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘1.3.2 行业实例
游戏行业:
- 实时渲染引擎(Unity、Unreal Engine)
- 物理模拟、粒子系统
- 角色动画、骨骼绑定
影视行业:
- 离线渲染(RenderMan、Arnold)
- 视觉特效(VFX)
- 动作捕捉、虚拟制片
设计行业:
- CAD 软件(AutoCAD、SolidWorks)
- 3D 建模(Blender、Maya)
- 参数化设计
1.4 相关学科
1.4.1 学科交叉
图形学与相关学科
┌─────────────────┐
│ 数学 │
│ 线性代数、几何 │
└────────┬────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 物理学 │ │ 计算机图形学 │ │ 艺术设计 │
│ 光学、力学 │ │ │ │ 美学、色彩 │
└─────────────────┘ └────────┬────────┘ └─────────────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 计算机科学 │ │ 认知科学 │ │ 心理学 │
│ 算法、GPU编程 │ │ 人机交互 │ │ 视觉感知 │
└─────────────────┘ └─────────────────┘ └─────────────────┘1.4.2 数学基础
图形学需要的主要数学知识:
| 数学分支 | 应用 | 重要性 |
|---|---|---|
| 线性代数 | 变换、投影、光照计算 | ⭐⭐⭐⭐⭐ |
| 解析几何 | 几何表示、碰撞检测 | ⭐⭐⭐⭐⭐ |
| 微积分 | 曲线曲面、物理模拟 | ⭐⭐⭐⭐ |
| 数值分析 | 插值、积分、优化 | ⭐⭐⭐ |
| 概率统计 | 蒙特卡洛渲染、噪声 | ⭐⭐⭐ |
1.5 图形管线演进
1.5.1 固定功能管线
早期的图形硬件使用固定功能管线,功能固定、不可编程:
固定功能管线
┌─────────────────────────────────────────────────────────────┐
│ 固定功能管线 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 顶点数据 ──► 变换 ──► 光照 ──► 裁剪 ──► 光栅化 ──► 输出 │
│ │
│ 每个阶段的功能都是固定的,只能通过参数调整 │
│ │
│ OpenGL 1.x: │
│ glBegin(GL_TRIANGLES); │
│ glVertex3f(x, y, z); │
│ glColor3f(r, g, b); │
│ glEnd(); │
│ │
└─────────────────────────────────────────────────────────────┘
特点:
- 简单易用
- 功能有限
- 无法自定义1.5.2 可编程管线
现代图形管线允许自定义着色器程序:
可编程管线
┌─────────────────────────────────────────────────────────────┐
│ 可编程管线 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 顶点数据 │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 顶点着色器 │ ← 可编程(GLSL/HLSL) │
│ │ Vertex Shader │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 图元装配 │ ← 固定功能 │
│ │ Primitive │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 几何着色器 │ ← 可编程(可选) │
│ │ Geometry Shader│ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 光栅化 │ ← 固定功能 │
│ │ Rasterization │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 片段着色器 │ ← 可编程(GLSL/HLSL) │
│ │ Fragment Shader│ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 输出合并 │ ← 可配置 │
│ │ Output Merger │ │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
着色器示例(GLSL):
// 顶点着色器
attribute vec3 position;
uniform mat4 modelViewProjection;
void main() {
gl_Position = modelViewProjection * vec4(position, 1.0);
}
// 片段着色器
precision mediump float;
uniform vec3 color;
void main() {
gl_FragColor = vec4(color, 1.0);
}1.5.3 现代图形 API
图形 API 演进
┌─────────────────────────────────────────────────────────────┐
│ │
│ 1992 ──► OpenGL 1.0(固定管线) │
│ │ │
│ 2004 ──► OpenGL 2.0(可编程着色器) │
│ │ │
│ 2010 ──► OpenGL 4.x / DirectX 11 │
│ │ │
│ 2011 ──► WebGL 1.0 │
│ │ │
│ 2014 ──► Metal(Apple) │
│ │ │
│ 2016 ──► Vulkan / DirectX 12 │
│ │ │
│ 2017 ──► WebGL 2.0 │
│ │ │
│ 2022+ ─► WebGPU │
│ │
└─────────────────────────────────────────────────────────────┘
API 对比:
| API | 平台 | 特点 |
|-----------|-------------|---------------------|
| OpenGL | 跨平台 | 成熟稳定,状态机模型 |
| DirectX | Windows | 游戏主流,功能丰富 |
| Metal | Apple | 低开销,高性能 |
| Vulkan | 跨平台 | 低级别,显式控制 |
| WebGL | Web | 基于OpenGL ES |
| WebGPU | Web | 现代设计,更强大 |1.6 学习路径
1.6.1 推荐学习路线
学习路线图
Level 1: 基础入门
├── 线性代数复习
├── Canvas 2D 绑制
└── 理解坐标系和变换
Level 2: 图形基础
├── WebGL 基础
├── 着色器编程
└── 3D 数学(矩阵、向量)
Level 3: 渲染技术
├── 光照模型
├── 纹理映射
└── 阴影算法
Level 4: 高级主题
├── 光线追踪
├── 物理渲染(PBR)
└── 全局光照
Level 5: 专业方向
├── 游戏引擎开发
├── 影视特效
└── 科学可视化1.6.2 学习资源
书籍推荐:
- 入门:《交互式计算机图形学》
- 进阶:《Real-Time Rendering》
- 理论:《Physically Based Rendering》
在线资源:
- LearnOpenGL (learnopengl.com)
- WebGL Fundamentals (webglfundamentals.org)
- Scratchapixel (scratchapixel.com)
实践项目:
- 实现软件光栅化器
- 编写简单的光线追踪器
- 开发小型游戏引擎
1.7 本章小结
核心概念
| 概念 | 说明 |
|---|---|
| 计算机图形学 | 使用计算机生成、处理和显示图像的学科 |
| 建模 | 创建几何形状的表示 |
| 渲染 | 将 3D 场景转换为 2D 图像 |
| 动画 | 物体随时间的运动变化 |
| 图形管线 | 从顶点数据到最终图像的处理流程 |
| 着色器 | 在 GPU 上运行的可编程程序 |
关键要点
- 图形学是模型到图像的合成过程
- 图形管线经历了从固定到可编程的演进
- 现代图形 API(Vulkan、WebGPU)提供更底层的控制
- 线性代数是图形学最重要的数学基础
- 学习图形学需要理论与实践相结合
下一章预告:在第2章中,我们将学习向量与线性代数基础,这是图形学的数学根基。
文档版本:v1.0
字数统计:约 8,000 字
