Math
模块一 · 图形学数学基础
一本写给 Android 显示图形工程师的图形学数学入门教材。
它假设你:会写代码,读过 libgui / libhwui / SurfaceFlinger / libEGL / libvulkan,但数学基本忘光了——初高中的东西只剩模糊印象,矩阵那一套没系统学过。
它的写法:不从零建立直觉,而是给你已有的工程直觉配上数学名字。你每天在 ui::Transform 里组合 ROT_90 和 FLIP_H,早就知道"变换能叠加、顺序会影响结果"——缺的只是有人告诉你,这件事叫矩阵乘法,它不满足交换律。
所以每篇都从一段你读过的 AOSP 源码开始,抛出几个"你可能从没细想过"的问题,正文推完,结尾再回到那段代码把问题答掉。
篇目
主线从你最熟的 2D 图层合成出发,一路推到最陌生的 3D 渲染,每一步都从已知推到未知。
| # | 篇目 | 源码锚点 / 要点 |
|---|---|---|
| 0 | Android系统工程师够用的图形学数学基础 | 开篇。从五段 AOSP 源码讲清为什么要补这块数学,附全系列篇目导航。先读这篇 |
| 附 | 数学速查表 | 弧度、sin/cos、函数图像、常用记号。不必顺读,随时回查 |
| Part 1 · 从你熟的 2D 说起 | ||
| 1 | 坐标系与向量 | Rect 为什么 top < bottom;四个 ProjectionSpace 为什么存在 |
| 2 | 2D 变换与矩阵 | 2×2 矩阵怎样表达缩放、镜像、旋转;组合顺序、行列式、逆矩阵与转置 |
| 3 | 齐次坐标:为什么是 3×3 不是 2×2 | ui::Transform::set 的平移与组合;SkMatrix 的 kMPersp0/1/2 和透视除法 |
| Part 2 · 升到 3D(对你是新大陆,节奏放慢) | ||
| 4 | 3D 变换与 MVP 链 | hwui 的 rotationX 为什么要动用一台相机;含小节「四元数是干吗的」 |
| 5 | 投影与深度 | currentTransform 该拿去干什么;24 位深度为什么还会 z-fighting |
| Part 3 · 像素级的数学(你的半懂地带,重点篇) | ||
| 6 | 插值 | needsFiltering() → SkFilterMode::kLinear 这条链;双线性放大为什么糊 |
| 7 | 采样、走样与滤波 | 模糊前的 kInputScale = 0.25f 为什么不算 bug |
| 8 | Gamma 与线性空间 | response() 为什么分段;OETF 和 EOTF 哪个是哪个 |
| 9 | 色域、YUV 与 HDR | Dataspace 三段位域各管什么;0.2126/0.7152/0.0722 从哪来 |
怎么读
- Part 1(1~3 篇)读得快一些。这些东西你天天在用,只是没有数学名字。
- Part 2(4~5 篇)要慢。SurfaceFlinger 是个二维合成器,没有深度缓冲、没有真正的相机,这两篇对你是全新的。
- Part 3(6~9 篇)最值得反复读。你知道这些 API 怎么用,但可能没系统学过背后的原理——半懂比不懂危险,不懂会去查,半懂会直接写错。第 8、9 两篇尤其如此。
- 速查表不用先读,卡在符号上时再翻。
- 每篇末尾的自测答案是折叠的,先自己答一遍再展开。
两个坐标约定
本模块里换过一次坐标系,这不是笔误:
| 用在哪 | 约定 | |
|---|---|---|
| 屏幕/图像坐标 | Part 1 与 Part 3(第 1~3、6~9 篇) | 原点左上, 右, 下 |
| 图形学右手系 | Part 2(第 4~5 篇) | 上,相机看向 |
合成器一套、渲染管线一套,真实世界里就是并存的。与其假装它们一样,不如在切换处说清楚——第 4 篇开头有专门的提示。
源码基准
正文引用的 AOSP 代码摘自 Android 17 分支(本机路径 ~/Project/a17-x6878),贴的是精简片段 + 文件路径,不带行号(行号必随版本漂移)。不同版本可能略有出入,但类名、字段名和整体结构是稳定的。
如何复现插图
每篇的插图都由 labs/m1/ 下的同名脚本生成,不是手绘,也不是从别处抄来的——图里的每个数字都和正文的算例同源。
python3 -m pip install -r ../../labs/requirements.txt
python3 ../../labs/m1/lab_02_transform_2d.py # 重新生成第 2 篇的全部插图脚本可从任意目录运行,会在 docs/assets/generated/ 下原地覆盖对应 SVG 并打印 [plotstyle] saved ...。配色、字号、中文字体统一遵循 STYLE.md。
如果系统 Python 连 pip 都没有,可在源项目的 labs/README.md 中查看 uv 方案。

觉得有用?关注公众号「阿豪讲Framework」
Android 系统开发,新文章第一时间推送。