色彩管理

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 位浮點顏色分量的可呈現的 EGLSurfaces。優先級:高(預計這是寬色感知應用程序的默認像素格式)。需要驅動支持。
  • EGL_KHR_gl_colorspace 。對於想要使用 sRGB 格式默認幀緩衝區來更輕鬆地實現 sRGB 渲染到顯示設備的應用程序,此擴展允許創建 EGLSurfaces,這些 EGLSurfaces 將由支持該功能的 OpenGL 上下文在 sRGB 中渲染。需要驅動程序支持 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 渲染到顯示設備的應用程序,此擴展允許創建 EGLSurfaces,這些 EGLSurfaces 將由支持該功能的 OpenGL 上下文在 Display-P3 中渲染。這可以在 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 。有關標題,請參閱: