色彩管理

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_p3EGL_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。有关标头,请参阅