本篇位置:模块一 · 开篇 | 前置:无 | 预计阅读:10 分钟
这是一个系列教程的开篇。它写给每天在 libgui / libhwui / SurfaceFlinger / libEGL / libvulkan 里打转,API 都会用,但数学基本忘光了的人。
标题里"够用"两个字是认真的:不追求把图形学数学讲完整,只讲读 AOSP 显示相关代码会撞上的那些。
本篇位置:模块一 · 开篇 | 前置:无 | 预计阅读:10 分钟
这是一个系列教程的开篇。它写给每天在 libgui / libhwui / SurfaceFlinger / libEGL / libvulkan 里打转,API 都会用,但数学基本忘光了的人。
标题里"够用"两个字是认真的:不追求把图形学数学讲完整,只讲读 AOSP 显示相关代码会撞上的那些。
本篇位置:模块一 · 附录 | 前置:无 | 不必顺读,随时回查
这一篇不是课,是一张备查表。
正文各篇会默认你认识 sin、log、∑ 这些记号。如果读到哪里卡在"这个符号是什么意思"上,翻到这里,找到对应那条,看完回去接着读——不要试图先把这一篇背下来。
本篇位置:模块一 · 第 1 篇 | 前置:无(系列开篇,符号不认识就翻数学速查表) | 预计阅读:35 分钟
先看两段你天天打交道的代码。第一段是 Rect(frameworks/native/libs/ui/include/ui/Rect.h,本系列源码摘自 Android 17 分支,不同版本可能略有出入):
本篇位置:模块一 · 第 2 篇 | 前置:坐标系与向量 | 预计阅读:40 分钟
上一篇讲的是坐标和向量。这一篇先把视线收窄到二维平面上的线性变换:缩放、翻转、旋转,以及把它们组合起来的矩阵乘法。
先暂时不看平移矩阵。平移不能由 2×2 矩阵完成,必须等下一篇引入齐次坐标后才能和其他变换统一写进一个矩阵。
本篇位置:模块一 · 第 3 篇 | 前置:2D 变换与矩阵 | 预计阅读:35 分钟
ui::Transform 明明只处理二维,内部却使用 3×3 矩阵;翻转、旋转和平移最终都被合并进同一个矩阵。
代码来自 frameworks/native/libs/ui/include/ui/Transform.h 和 Transform.cpp(本系列源码摘自 Android 17 分支,不同版本可能略有出入):
本篇位置:模块一 · 第 4 篇 | 前置:齐次坐标 | 预计阅读:45 分钟
从这一篇起,你不会有太多既视感。
前三篇讲的东西你天天在用,只是不知道它们的数学名字。而 3D 变换、相机、投影、深度——SurfaceFlinger 里基本没有。它是一个二维合成器:没有深度缓冲,没有真正的相机,asMatrix4() 的注释明说新插进来的第三维是单位变换、什么都不做。
本篇位置:模块一 · 第 5 篇 | 前置:3D 变换与 MVP 链 | 预计阅读:45 分钟
libvulkan 的 swapchain 实现里有这么一行(frameworks/native/vulkan/libvulkan/swapchain.cpp):
capabilities->supportedTransforms = kSupportedTransforms;
capabilities->currentTransform =
TranslateNativeToVulkanTransform(transform_hint);
本篇位置:模块一 · 第 6 篇 | 前置:投影与深度 | 预计阅读:40 分钟
从这一篇起回到你的主场。以下三段代码是一条链,从"图层被缩放了"一路走到"用哪种采样方式"。
第一步,判断这个图层是不是被缩放了(CompositionEngine/src/OutputLayer.cpp):
本篇位置:模块一 · 第 7 篇 | 前置:插值 | 预计阅读:45 分钟
SurfaceFlinger 做背景模糊时,第一件事是把图缩到四分之一(libs/renderengine/skia/filters/BlurFilter.h):
class BlurFilter {
public:
// Downsample FBO to improve performance
static constexpr float kInputScale = 0.25f;
// Downsample scale factor used to improve performance
static constexpr float kInverseInputScale = 1.0f / kInputScale;
// ...
};
本篇位置:模块一 · 第 8 篇 | 前置:采样、走样与滤波 | 预计阅读:40 分钟
ui::ColorSpace 里,sRGB 是这么定义的(frameworks/native/libs/ui/ColorSpace.cpp):
const ColorSpace ColorSpace::sRGB() {
return {
"sRGB IEC61966-2.1",
{{float2{0.640f, 0.330f}, {0.300f, 0.600f}, {0.150f, 0.060f}}},
{0.3127f, 0.3290f},
{2.4f, 1 / 1.055f, 0.055f / 1.055f, 1 / 12.92f, 0.04045f, 0.0f, 0.0f}
};
}