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_p3
和EGL_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
。有關標題,請參閱:
-
system/core/include/system/graphics.h
-
system/core/include/system/graphics-base.h
-
HAL_DATASPACE_*
-
HAL_COLOR_MODE_*
-