在OpenGL ES中,我可以使用OpenGL ES 3.0或OpenGL ES 2.0以及扩展名GL_EXT_sRGB创建sRGB渲染缓冲区。我创建了一个内部格式为GL_SRGB8_ALPHA8(或GL_SRGB8_ALPHA8_EXT)的可渲染纹理,它在支持它的Android设备上运行良好。
但是,我找不到任何方法让默认渲染缓冲区在Android上使用sRGB。 我正在使用GLSurfaceView,所以它通过EGL和eglChooseConfig,但我找不到什么属性,如果有的话,控制sRGB设置。
我当然可以通过渲染到sRGB目标然后在显示之前复制到后台缓冲区来解决它,但这相当浪费。 在OpenGL和DirectX中更容易做,但OpenGL ES需要在创建渲染缓冲区/帧缓冲区时应用sRGB设置。
有什么想法吗?
答案 0 :(得分:3)
你肯定是在正确的轨道上,在OpenGL ES中获得 sRGB 默认帧缓冲的唯一方法是涉及通过EGL。现在,EGL 1.4没有内置支持GL默认帧缓冲区上的不同颜色空间,但是您的系统可能支持名为EGL_KHR_gl_colorspace
的扩展。
如果您的EGL实现支持此扩展,那么您可以在创建窗口表面时将以下属性对传递给EGL:
EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_SRGB_KHR
现在,事情变得有趣......常量 EGL_GL_COLORSPACE_SRGB_KHR 与EGL 1.3中的 EGL_VG_COLORSPACE_sRGB 具有相同的值。在EGL 1.2中, EGL_VG_COLORSPACE_sRGB 被称为 EGL_COLORSPACE_sRGB 。如果将sRGB OpenGL颜色空间提升为EGL 1.5的核心,那么该东西可能会再次重命名 - 回到它在EGL 1.2中调用的内容;)
简而言之,如果您的实现支持此扩展,您也可以将 EGL_VG_COLORSPACE ... 常量用于OpenGL表面。它基本上扩展了OpenVG对OpenGL的功能,直到使用与常量完全相同的数值。