3

在 OpenGL ES 中,我可以使用扩展名为 GL_EXT_sRGB 的 OpenGL ES 3.0 或 OpenGL ES 2.0 创建 sRGB 渲染缓冲区。我创建了一个内部格式为 GL_SRGB8_ALPHA8(或 GL_SRGB8_ALPHA8_EXT)的可渲染纹理,它在支持它的 Android 设备上运行良好。

但是,我找不到任何方法让默认渲染缓冲区在 Android 上使用 sRGB。我正在使用 GLSurfaceView,所以它通过 EGL 和 eglChooseConfig,但我找不到控制 sRGB 设置的属性(如果有的话)。

我当然可以通过渲染到一个 sRGB 目标然后在显示之前复制到后台缓冲区来解决它,但这相当浪费。在 OpenGL 和 DirectX 中执行起来要容易得多,但是 OpenGL ES 需要在创建渲染缓冲区/帧缓冲区时应用 sRGB 设置。

有任何想法吗?

4

1 回答 1

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_VG_COLORSPACE_sRGB在 EGL 1.2 中被称为EGL_COLORSPACE_sRGB 。如果 sRGB OpenGL 色彩空间被提升为 EGL 1.5 的核心,那么这个东西可能会再次重命名——回到 EGL 1.2 中的名称;)

长话短说,如果您的实现支持此扩展,您也可以将EGL_VG_COLORSPACE...常量用于 OpenGL 表面。它基本上扩展了 OpenVG 对 OpenGL 的功能,一直到对常量使用完全相同的数值。

于 2013-12-20T02:49:08.207 回答