Android 8.1 及更高版本包含色彩管理支持,该支持可用于在各种显示技术之间提供一致的体验。在 Android 上运行的应用可以访问广色域显示屏的全部功能,以充分利用显示设备。
之前的 Android 版本不包含色彩管理支持,而是依赖于内容和显示屏的兼容性(电视行业通常会帮助实现这一目标)。但是,最新的显示技术允许使用色域大得多的显示屏,这些显示屏无法按预期显示现有内容。借助 Android 8.1 及更高版本,使用广色域显示屏的设备(例如,有源矩阵有机发光二极管或 AMOLED、某些 LCD)可以看到来自应用的广色域内容。
确定设备支持
运行 Android 8.1 或更高版本的具有广色域显示屏的设备应支持色彩管理(广色域)。在启用此功能之前,请确保设备满足以下要求
- 设备显示屏满足硬件要求,其中包括支持 Display-P3 色彩空间的特性良好的显示屏。如果显示屏不满足此要求,请勿启用色彩管理。为了减少 CPU 和 GPU 的影响,最好在显示流水线中支持扩展的 sRGB 和 HDR10。
- 设备支持工厂校准流程,该流程生成校准数据(存储在设备上)以调整显示行为中的制造差异。至少,校准数据应允许显示屏准确显示 sRGB 内容以及 D65 和 D73 白点。
如果满足这些要求,您可以为设备启用色彩管理功能。
实现色彩管理
要实现色彩管理,首先更新 Hardware Composer 2 (HWC2) 驱动程序,使其了解颜色模式并将这些模式应用于硬件。具体来说,HWC2 合成器必须使用 HWCDisplay::GetColorModes
报告 Display-P3 和 sRGB 颜色模式。
接下来,启用必要的 OpenGL 扩展程序和库支持,以将 OpenGL 色彩空间转换为 HAL 数据空间。所需的 OpenGL 扩展程序包括
-
EGL_EXT_pixel_format_float
。允许应用创建具有 16 位浮点颜色分量的可呈现 EGLSurface。优先级:高(预计这是广色域感知应用的默认像素格式)。需要驱动程序支持。 -
EGL_KHR_gl_colorspace
。对于想要使用 sRGB 格式默认帧缓冲区以更轻松地实现 sRGB 渲染到显示设备的应用,此扩展程序允许创建将在支持该功能的 OpenGL 上下文中以 sRGB 渲染的 EGLSurface。需要驱动程序支持 sRGB 行为。
Android 还提供了以下可选扩展程序
-
EGL_EXT_colorspace_scrgb_linear
。此扩展程序提供了一个新的颜色空间选项 scRGB,应用可以在创建 EGLSurface 时选择该选项。scRGB 颜色空间定义了一个线性显示引用空间,该空间具有与 sRGB 相同的白点和原色(因此向后兼容 sRGB)。这不应需要驱动程序支持,并且可以在 Android EGL 封装容器中实现。要发挥作用,此扩展程序需要支持 16 位浮点 (FP16)。 -
EGL_EXT_gl_colorspace_display_p3
和EGL_EXT_gl_colorspace_display_p3_linear
。对于想要使用 Display-P3 格式默认帧缓冲区以更轻松地实现 sRGB 渲染到显示设备的应用,此扩展程序允许创建将在支持该功能的 OpenGL 上下文中以 Display-P3 渲染的 EGLSurface。这可以在 EGL 驱动程序封装容器中实现。 -
VK_EXT_swapchain_colorspace
(Vulkan)。使应用能够使用其使用的颜色空间标记交换链。包括许多常见的颜色空间,如 DCI-P3、Display-P3、AdobeRGB 和 BT2020。
自定义
您可以通过包含对各种颜色标准(如 DCI-P3、AdobeRGB、Rec709 和 Rec2020)的支持来自定义色彩管理功能。其他自定义项包括
- 显示流水线中用于颜色转换的硬件支持。 启用对硬件中多种颜色转换的支持。
- 支持在多个图层上进行独立的颜色转换(例如,某些图层可以是 sRGB,而另一些图层可以是扩展的 sRGB,每个图层都有自己的颜色流水线)。当有多个颜色空间可见时,某些颜色空间需要转换为显示屏的颜色空间。理想情况下,此转换最好由显示引擎提供(否则 Android 必须执行 GPU 合成)。
测试
要测试色彩管理,请使用 opengl/tests
中的以下资源
gl2_basic
是一个简单的 OpenGL 演示,它请求 Display-P3 色彩空间。-
EGL_test
测试必要的扩展程序和配置支持(10:10:10:2 和 FP16)。 test_wide_color
以与 SurfaceFlinger 相同的方式(例如,配置、颜色空间和像素格式)创建表面。
参考实现
有关参考实现,请参阅 frameworks/native
。有关标头,请参阅
system/core/include/system/graphics.h
system/core/include/system/graphics-base.h
HAL_DATASPACE_*
HAL_COLOR_MODE_*