การจัดการสี

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 จะต้องรายงานโหมดสี Display-P3 และ sRGB โดยใช้ HWCDisplay::GetColorModes

จากนั้น เปิดใช้งานส่วนขยาย OpenGL และการสนับสนุนไลบรารีที่จำเป็นเพื่อแปลปริภูมิสี OpenGL เป็นพื้นที่ข้อมูล HAL ส่วนขยาย OpenGL ที่จำเป็นประกอบด้วย:

  • EGL_EXT_pixel_format_float . อนุญาตให้แอปสร้าง EGLSurfaces ที่แสดงได้ด้วยองค์ประกอบสีลอย 16 บิต ลำดับความสำคัญ: สูง (คาดว่านี่คือรูปแบบพิกเซลเริ่มต้นสำหรับแอปที่ใช้สีกว้าง) ต้องมีการสนับสนุนคนขับ
  • EGL_KHR_gl_colorspace สำหรับแอปที่ต้องการใช้เฟรมบัฟเฟอร์เริ่มต้นในรูปแบบ sRGB เพื่อให้บรรลุผลการเรนเดอร์ sRGB บนอุปกรณ์แสดงผลได้ง่ายขึ้น ส่วนขยายนี้อนุญาตให้สร้าง EGLSurfaces ที่จะแสดงผลใน sRGB โดยบริบท OpenGL ที่รองรับความสามารถนั้น ต้องการการสนับสนุนไดรเวอร์สำหรับพฤติกรรม sRGB

Android ยังมีส่วนขยายเพิ่มเติมดังต่อไปนี้:

  • EGL_EXT_colorspace_scrgb_linear ส่วนขยายนี้มีตัวเลือกพื้นที่สีใหม่ scRGB ซึ่งแอปสามารถเลือกได้เมื่อสร้าง EGLSurface พื้นที่สี scRGB กำหนดพื้นที่อ้างอิงการแสดงผลเชิงเส้นที่มีจุดสีขาวและแม่สีเดียวกันกับ sRGB (ดังนั้นจึงเข้ากันได้กับ sRGB รุ่นเก่า) สิ่งนี้ไม่ควรต้องการการสนับสนุนไดรเวอร์และสามารถนำไปใช้ใน wrapper EGL ของ Android เพื่อให้มีประโยชน์ ส่วนขยายนี้จำเป็นต้องรองรับจุดลอยตัว 16 บิต (FP16)
  • EGL_EXT_gl_colorspace_display_p3 และ EGL_EXT_gl_colorspace_display_p3_linear สำหรับแอปที่ต้องการใช้เฟรมบัฟเฟอร์เริ่มต้นรูปแบบ Display-P3 เพื่อให้บรรลุการเรนเดอร์ sRGB บนอุปกรณ์แสดงผลได้ง่ายขึ้น ส่วนขยายนี้อนุญาตให้สร้าง EGLSurfaces ที่จะแสดงผลใน Display-P3 โดยบริบท OpenGL ที่รองรับความสามารถนั้น สิ่งนี้สามารถนำไปใช้ใน wrapper ไดรเวอร์ EGL
  • VK_EXT_swapchain_colorspace (วัลแคน) ช่วยให้แอปสามารถแท็กกลุ่มการแลกเปลี่ยนด้วยปริภูมิสีที่พวกเขาใช้ รวมปริภูมิสีทั่วไปจำนวนหนึ่ง เช่น 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 สำหรับส่วนหัว โปรดดูที่: