KNOWLEDGE NOTE

3D图形渲染:学习笔记

本文建立对3D图形渲染的总揽性认识,从投影原理、投影矩阵与齐次坐标,到光栅化、深度测试与着色,系统梳理3D渲染的核心概念与知识脉络。

本笔记旨在建立对3D图形渲染的总揽性认识,梳理核心技术名词与领域知识。内容从3D模型如何转变为2D屏幕画面的核心问题出发,深入探讨投影(正交投影与透视投影)、投影矩阵以及齐次坐标的数学原理,并概述投影之后的渲染管线步骤(光栅化、深度测试、着色)。


核心概念

  • 顶点与三角形:3D模型的基本组成单元。顶点是3D空间中的坐标点,三角形是连接三个顶点的面,是渲染的基本图元。
  • 投影:将3D坐标转换为2D屏幕坐标的过程。
  • 正交投影:物体大小不随距离变化,直接丢弃Z坐标,无近大远小效果。
  • 透视投影:模拟人眼视觉,具有近大远小效果,通过投影矩阵实现。
  • 投影矩阵:4x4数学矩阵,用于将3D坐标映射到齐次裁剪空间。
  • 齐次坐标:将3D坐标 (x, y, z) 扩展为4D坐标 (x, y, z, w) 的数学工具。
  • 透视除法:将齐次坐标除以 w 分量,转换回3D或2D坐标的过程。
  • 光栅化:将2D三角形转换为屏幕像素的过程。
  • 深度测试:根据像素的深度(Z值)判断物体遮挡关系。
  • 着色:计算像素的颜色,包括光照、纹理等效果。

知识脉络

1. 为什么需要投影?

3D模型存在于三维空间中,但屏幕是二维的。投影是连接3D世界与2D屏幕的桥梁,负责将3D坐标映射为屏幕上的2D坐标。

2. 投影的两种方式

  • 正交投影
    • 特点:近大远小效果消失,物体大小恒定。
    • 实现:直接丢弃Z坐标,保留X、Y坐标。
    • 应用:工程制图、2D游戏(如《我的世界》俯视图)。
  • 透视投影
    • 特点:模拟真实视觉,近大远小。
    • 实现:通过投影矩阵将3D坐标映射到齐次空间,保留深度信息。
    • 关键参数:视野(FOV)、宽高比(Aspect Ratio)、近裁剪面(Near)、远裁剪面(Far)。

3. 投影矩阵与齐次坐标

投影矩阵是一个4x4矩阵,它输出的结果是齐次坐标。齐次坐标通过引入第4个维度 w,实现了数学上的统一:

  • 统一变换:用4x4矩阵同时表示平移、旋转和缩放。
  • 透视除法:将齐次坐标 (x, y, z, w) 除以 w,得到真实的2D/3D坐标。在透视投影中,w 与深度相关,除以 w 后自然产生近大远小的效果。

4. 渲染管线的后续步骤

投影只是渲染的第一步,后续还包括:

  1. 光栅化:将投影后的2D三角形离散化为像素。
  2. 深度测试:比较像素的深度值,决定谁遮挡谁。
  3. 着色:为像素计算最终颜色(光照、阴影、纹理等)。

示例

示例1:齐次坐标的等价性

齐次坐标 (x, y, z, w) 与 (kx, ky, kz, kw)(k ≠ 0)代表同一个3D点,因为最终都要除以 w:

  • 齐次坐标 (2, 3, 4, 1) 除以 w=1,得到3D点 (2, 3, 4)。
  • 齐次坐标 (4, 6, 8, 2) 除以 w=2,同样得到3D点 (2, 3, 4)。

示例2:平移变换的矩阵表示

在普通3D坐标中,平移需要加法;在齐次坐标中,平移可以用矩阵乘法统一表示:

[ 1  0  0  tx ]   [ x ]   [ x + tx ]
[ 0  1  0  ty ] × [ y ] = [ y + ty ]
[ 0  0  1  tz ]   [ z ]   [ z + tz ]
[ 0  0  0  1  ]   [ 1 ]   [   1    ]

示例3:代码中的齐次坐标变换

// 3D点 (x, y, z) 转换为齐次坐标
vec4 point = vec4(x, y, z, 1.0);

// 4x4变换矩阵(包含平移、旋转、缩放) mat4 transform = ...;

// 矩阵乘法进行变换 vec4 transformed = transform * point;

// 透视除法,得到最终的3D坐标 vec3 result = transformed.xyz / transformed.w;

容易混淆之处

  1. 点与向量的区别
    • 在齐次坐标中,点的 w=1(如 (x, y, z, 1)),表示有位置,平移会改变它。
    • 向量的 w=0(如 (dx, dy, dz, 0)),表示只有方向没有位置,平移不会改变它。
  2. 透视除法发生的时机

    透视除法不是我们手动计算的,而是在投影矩阵乘法之后,由GPU硬件自动执行的。投影矩阵负责把深度信息塞进 w 分量,硬件随后自动除以 w。

  3. 投影矩阵与模型矩阵的混淆
    • 模型矩阵:将物体从局部空间(模型自身坐标)转换到世界空间(包含位移、旋转、缩放),输出仍是3D坐标。
    • 投影矩阵:将世界空间的3D坐标转换到齐次裁剪空间,为后续的透视除法和屏幕映射做准备。
  4. 齐次坐标的维度

    齐次坐标是4D的 (x, y, z, w),但它最终代表的仍然是3D空间中的点。增加 w 只是为了数学处理的便利,并不代表物体进入了四维空间。

复习问题

  1. 3D模型是由什么基本元素组成的?为什么这些元素对渲染至关重要?
  2. 正交投影和透视投影在视觉效果和数学实现上有什么根本区别?它们分别适用于什么场景?
  3. 什么是齐次坐标?在3D图形学中引入齐次坐标的主要目的是什么?
  4. 在齐次坐标系中,如何通过 w 的值区分“点”和“向量”?这种区分有什么实际意义?
  5. 请解释“透视除法”的过程,以及它是如何产生“近大远小”的视觉效果的?
  6. 投影步骤之后,3D渲染管线还需要经历哪几个关键步骤才能最终显示出画面?