色彩管理

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,這些表面將由支援該功能的 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 渲染的應用程序,此擴充功能允許創建將由支援該功能的 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 。標題,請參閱: