Android上的OpenGL sRGB配置

时间:2017-06-16 12:56:39

标签: android opengl-es opengl-es-3.0

我试图了解如何为Android上的默认帧缓冲启用sRGB配置文件.Android SDK不清楚如何实际操作。例如,here a guy states它足以将纹理内部格式设置为sRGB的。但他显然是错的,因为我试过了,它什么都没改变。

Khronos提供this extension作为EGL的一部分。我试图将这些标志添加到表面配置中:

    final int EGL_GL_COLORSPACE_KHR = 0x309D;
    final int EGL_GL_COLORSPACE_SRGB_KHR = 0x3089;
    int attribs[] = {
            EGL10.EGL_LEVEL, 0,
            EGL10.EGL_RENDERABLE_TYPE,EGLExt.EGL_OPENGL_ES3_BIT_KHR,
            EGL10.EGL_COLOR_BUFFER_TYPE, EGL10.EGL_RGB_BUFFER, 
            EGL10.EGL_RED_SIZE, 8,
            EGL10.EGL_GREEN_SIZE, 8,
            EGL10.EGL_BLUE_SIZE, 8,
            EGL10.EGL_DEPTH_SIZE, maxDepth,
            EGL10.EGL_SAMPLE_BUFFERS, 1,
            EGL10.EGL_SAMPLES, 4, 
            EGL_GL_COLORSPACE_KHR ,EGL_GL_COLORSPACE_SRGB_KHR //<--
            EGL10.EGL_NONE
    };

但在这种情况下,我正在测试的设备(谷歌NEXUS 6)崩溃了应用程序。 运行OpenGL扩展查看器我看到设备不支持

  

EGL_KHR_gl_colorspace

延伸。

事实上,我发现here以及其他在线演示,实际上使用了此设置。此外,iOS允许将默认FBO配置为带有标志的sRGB:

  

kEAGLColorFormatSRGBA8

是否有另一种方法可以在Android设备上打开sRGB而不是该扩展程序?(当然另一种方法是在着色器中进行伽马校正,但这正是我不想做的事情)

1 个答案:

答案 0 :(得分:0)

不,遗憾的是没有其他方法可以创建sRGB默认帧缓冲。

你可以做的是使用一种解决方法:渲染到内部格式为GL_SRGB8_ALPHA8的纹理,并将其视为帧缓冲,然后在最后使用上述纹理绘制一个全屏四边形到默认帧缓冲区和伽马校正着色器。 (当从纹理读取时,您将获得线性RGB的值,因此在写入默认帧缓冲区时需要将它们压缩回sRGB;帧缓冲区表面上是线性的,但其中的值将被显示解释为sRGB 。)

“另一个人”完全正确,但默认的帧缓冲区不是纹理,你不能直接设置其内部格式。