为何未做特殊配置的OpenGL能正确显示P3色彩空间图像?
我正在开发基于Android平台的OpenGL项目,用于显示带有P3色彩配置文件的图像。令人意外的是,即使未对OpenGL Surface做任何特殊配置,图像仍能在屏幕上正确显示,例如可清晰查看该P3图像中的logo:

在应用中,所有Bitmap解码时均将inPreferredColorSpace设为Display.getPreferredWideGamutColorSpace,因此解码后的Bitmap可能处于Display P3、sRGB等任意色彩空间,具体取决于inPreferredColorSpace的返回结果。之后通过如下代码将Bitmap转为纹理:
GLUtils.texImage2D( GL_TEXTURE_2D, // target 0, // level Source, // bitmap 0); // border
我的疑问是:为何未针对不同色彩空间做特殊OpenGL配置,图像颜色仍能正确显示?OpenGL是否在后台进行了自动转换或兼容性处理?
解释
解码阶段已匹配屏幕色彩空间:你设置
inPreferredColorSpace为Display.getPreferredWideGamutColorSpace,这一步已经让解码后的Bitmap色彩空间和当前屏幕的首选色彩空间完全对齐——如果设备屏幕支持Display P3,Bitmap就会被解码为P3色彩空间;如果屏幕仅支持sRGB,Bitmap就会是sRGB。这种情况下,OpenGL直接渲染纹理到Surface时,色彩空间天然匹配,不需要额外配置。GLUtils自动传递色彩空间信息:Android的
GLUtils.texImage2D方法在将Bitmap上传为纹理时,会自动把Bitmap携带的色彩空间信息绑定到OpenGL纹理对象上。当Surface的色彩空间与纹理一致时,系统会直接使用原始色彩数据渲染,不会做额外处理。系统底层的透明转换机制:如果后续纹理和Surface的色彩空间出现不一致的情况,Android系统的OpenGL渲染管线会在底层自动完成色彩空间转换,这个过程对上层应用完全透明,不需要你手动编写着色器来处理色彩转换逻辑。
内容的提问来源于stack exchange,提问作者zeus

