Android 上的 OpenGL sRGB 配置

OpenGL sRGB configuration on Android

我正在尝试了解如何为默认帧缓冲区启用 sRGB 配置文件 Android.Android SDK 不清楚如何操作 practically.For 示例,here a guy states 就足够了将纹理内部格式设置为 sRGB。但他显然是错的,因为我试过了,但没有任何改变。

Khronos 提供 this extension 作为 EGL.I 的一部分已尝试将这些标志添加到表面配置:

    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
    };

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

EGL_KHR_gl_colorspace

扩展。

事实上,我发现 here 和其他在线演示,此设置实际上是 used.Also,iOS 允许将默认 FBO 配置为带有标志的 sRGB :

kEAGLColorFormatSRGBA8

除了那个扩展之外,还有其他方法可以在 Android 设备上打开 sRGB 吗?(当然,另一种方法是在着色器中进行伽玛校正,但这正是我不想做的)

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

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

"The other guy"完全正确,但默认的帧缓冲区不是纹理,您不能直接设置其内部格式。