Java OpenGL ES 3.0上的sRGB帧缓冲区

Java OpenGL ES 3.0上的sRGB帧缓冲区,java,android,opengl-es,opengl-es-3.0,srgb,Java,Android,Opengl Es,Opengl Es 3.0,Srgb,我正在使用Java开发OpenGLES3.0Android项目。 我需要实现gamma校正,我在某个地方读到,opengles3.0将支持sRGB纹理。因此,我打算在渲染到默认帧缓冲区之前调用glEnable(GL_FRAMEBUFFER_SRGB) 然而,当我试着打电话时 GLES30.glEnable(GLES30.GL_FRAMEBUFFER_SRGB) 事实证明,没有GLES30.GL\u FRAMEBUFFER\u SRGB,但是对于像GLES30.GL\u SRGB这样的SRGB纹

我正在使用Java开发OpenGLES3.0Android项目。 我需要实现gamma校正,我在某个地方读到,opengles3.0将支持sRGB纹理。因此,我打算在渲染到默认帧缓冲区之前调用glEnable(GL_FRAMEBUFFER_SRGB)

然而,当我试着打电话时

GLES30.glEnable(GLES30.GL_FRAMEBUFFER_SRGB)
事实证明,没有GLES30.GL\u FRAMEBUFFER\u SRGB,但是对于像GLES30.GL\u SRGB这样的SRGB纹理格式,有一些常量

所以,我的问题是:有可能让OpenGLES3.0为我做伽马校正吗?如果是,如何进行


否则,我想,我将不得不手动进行伽马校正。

我意识到这个问题已经存在了2个月,但由于它是在谷歌提出的,我想我会为未来的谷歌发布一个答案:)

GL\u FRAMEBUFFER\u SRGB似乎只在OpenGL桌面上可用,并通过OpenGLES 2.0上的扩展实现。但通过实验(我目前正在研究这个课题),我意识到在OpenGLES 3.x上,每当帧缓冲区的纹理具有sRGB格式时,在写入帧缓冲区时颜色都会正确(并自动)转换为sRGB。因此,在渲染到SRGB纹理时,不需要使用GL_FRAMEBUFFER_SRGB来启用SRGB转换


现在,如果您直接写入到后台缓冲区,您可能有启用sRGB写入的选项,但这将在应用程序端进行控制(例如,在Windows上,如果我没有弄错的话,这是您在通过wgl创建上下文时指定的标志),不幸的是,我无法确认这一点,因为在我正在处理的框架中,我无法访问此部件。

这是正确的。OpenGL ES中不存在GL\U帧缓冲区\U SRGB。在OpenGL ES中:如果帧缓冲区位于sRGB中,则无法“禁用”-在启用了GL\u帧缓冲区\u sRGB的情况下,它的行为将始终与OpenGL中相同。OpenGL ES有一个exstension为您提供了此控件:EXT_sRGB_write_控件,但它可能可用,也可能不可用。添加到顶部,不仅是它的自动行为,为了使其真正工作,在创建OpenGL纹理时,不要忘记正确指定sRGB纹理格式,即
glTexImage2D
glCompressedTexImage2D
等,前提是输入纹理位于sRGB颜色空间中。例如,当我在支持DXT压缩的系统上使用
glCompressedTexImage2D
创建纹理时,我使用
GL\u COMPRESSED\u SRGB\u ALPHA\u S3TC\u DXT5\u EXT
。如果我没有指定一个合适的纹理格式,那么输入的sRGB纹理会更亮。