本笔记旨在建立对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. 渲染管线的后续步骤
投影只是渲染的第一步,后续还包括:
- 光栅化:将投影后的2D三角形离散化为像素。
- 深度测试:比较像素的深度值,决定谁遮挡谁。
- 着色:为像素计算最终颜色(光照、阴影、纹理等)。
示例
示例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;
容易混淆之处
-
点与向量的区别
- 在齐次坐标中,点的 w=1(如 (x, y, z, 1)),表示有位置,平移会改变它。
- 向量的 w=0(如 (dx, dy, dz, 0)),表示只有方向没有位置,平移不会改变它。
-
透视除法发生的时机
透视除法不是我们手动计算的,而是在投影矩阵乘法之后,由GPU硬件自动执行的。投影矩阵负责把深度信息塞进 w 分量,硬件随后自动除以 w。
-
投影矩阵与模型矩阵的混淆
- 模型矩阵:将物体从局部空间(模型自身坐标)转换到世界空间(包含位移、旋转、缩放),输出仍是3D坐标。
- 投影矩阵:将世界空间的3D坐标转换到齐次裁剪空间,为后续的透视除法和屏幕映射做准备。
-
齐次坐标的维度
齐次坐标是4D的 (x, y, z, w),但它最终代表的仍然是3D空间中的点。增加 w 只是为了数学处理的便利,并不代表物体进入了四维空间。
复习问题
- 3D模型是由什么基本元素组成的?为什么这些元素对渲染至关重要?
- 正交投影和透视投影在视觉效果和数学实现上有什么根本区别?它们分别适用于什么场景?
- 什么是齐次坐标?在3D图形学中引入齐次坐标的主要目的是什么?
- 在齐次坐标系中,如何通过 w 的值区分“点”和“向量”?这种区分有什么实际意义?
- 请解释“透视除法”的过程,以及它是如何产生“近大远小”的视觉效果的?
- 投影步骤之后,3D渲染管线还需要经历哪几个关键步骤才能最终显示出画面?