Skip to content

第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 SutherlandSketchpad,计算机图形学之父1960s
Ed CatmullZ-buffer,细分曲面,Pixar创始人1970s
Bui Tuong PhongPhong 光照模型1975
James Blinn环境贴图,凹凸贴图1970s
Turner Whitted光线追踪1979
Jim Kajiya渲染方程1986
Pat HanrahanRenderMan1990s

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 上运行的可编程程序

关键要点

  1. 图形学是模型到图像的合成过程
  2. 图形管线经历了从固定到可编程的演进
  3. 现代图形 API(Vulkan、WebGPU)提供更底层的控制
  4. 线性代数是图形学最重要的数学基础
  5. 学习图形学需要理论与实践相结合

下一章预告:在第2章中,我们将学习向量与线性代数基础,这是图形学的数学根基。


文档版本:v1.0
字数统计:约 8,000 字

如有转载或 CV 的请标注本站原文地址