Android上的OpenGL sRGB配置

Android上的OpenGL sRGB配置,android,opengl-es,opengl-es-3.0,Android,Opengl Es,Opengl Es 3.0,我试图了解如何在Android上为默认帧缓冲区启用sRGB配置文件。Android SDK不清楚如何实际实现。例如,将纹理内部格式设置为sRGB就足够了。但他显然错了,因为我试过了,但没有改变任何事情 Khronos作为EGL的一部分提供。我已尝试将这些标志添加到表面配置: final int EGL_GL_COLORSPACE_KHR = 0x309D; final int EGL_GL_COLORSPACE_SRGB_KHR = 0x3089; int attribs

我试图了解如何在Android上为默认帧缓冲区启用sRGB配置文件。Android SDK不清楚如何实际实现。例如,将纹理内部格式设置为sRGB就足够了。但他显然错了,因为我试过了,但没有改变任何事情

Khronos作为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
    };
final int EGL\u GL\u COLORSPACE\u KHR=0x309D;
最终整数EGL\U GL\U颜色空间\U SRGB\U KHR=0x3089;
int attribs[]={
EGL10.EGL_级,0,
EGL10.EGL_RENDERABLE_TYPE,EGLExt.EGL_OPENGL_ES3_BIT_KHR,
EGL10.EGL_颜色_缓冲区_类型,EGL10.EGL_RGB_缓冲区,
EGL10.EGL_红色_尺寸,8,
EGL10.EGL_绿色_尺寸,8,
EGL10.EGL_蓝色_尺寸,8,
EGL10.EGL_深度_尺寸,最大深度,
EGL10.EGL_样本_缓冲器,1,
EGL10.EGL_样品,4,

EGL_GL_COLORSPACE_KHR,EGL_GL_COLORSPACE_SRGB_KHR//不,不幸的是,没有其他方法来创建SRGB默认帧缓冲区

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


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

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

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

“TheOtherGuy”完全正确,但默认帧缓冲区不是纹理,您无法直接设置其内部格式