kalmiya
kalmiya

Reputation: 3106

"invalid framebuffer operation" on glClear - using sRGB in OpenGL ES3

Using openGL-ES3, running on an iPhone5s (hardware, not in the simulator) in Xcode 7.3 I receive an "invalid framebuffer operation" when doing a glClear.

The texture in question is a "final" texture for my GBuffer, much like in this tutorial http://ogldev.atspace.co.uk/www/tutorial37/tutorial37.html. Key difference being that I'm requesting an sRGB texture and that I use GL_COLOR_ATTACHMENT3 (instead of 4), due to ES3 limitations.

glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB8, WindowWidth, WindowHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
// glTexParameteri ...
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_2D, m_finalTexture, 0);
GLenum Status = glCheckFramebufferStatus(GL_FRAMEBUFFER); // No errors here

Now when I try to clear it, I get an "invalid framebuffer operation"

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
// Element at index**[i]** needs to match GL_COLOR_ATTACHMENT**i** on GL-ES3!
GLenum drawbuf[4] = { GL_NONE, GL_NONE, GL_NONE, GL_COLOR_ATTACHMENT3 };
glDrawBuffers(sizeof(drawbuf)/sizeof(drawbuf[0]), drawbuf); 

GLCheckError();  // no errors
glClear(GL_COLOR_BUFFER_BIT); 
GLCheckError();  // => glGetError 506 GL_INVALID_FRAMEBUFFER_OPERATION

Now if instead I initialise the texture like this (so without sRGB), OpenGL doesn't give an error on the clear:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, WindowWidth, WindowHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

Now as I understood it, sRGB is supported on OpenGL ES3... so why does glClear fail? Any ideas anyone?

Upvotes: 1

Views: 1603

Answers (2)

Sabby
Sabby

Reputation: 403

try this #define GL_COLOR_BUFFER_BIT 0x00004000

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Upvotes: 0

Reto Koradi
Reto Koradi

Reputation: 54592

GL_SRGB8 is not a color-renderable format in ES 3.0. In the spec document:

  • In the "Required Texture Format" section starting on page 128, SRGB8 is listed under "Texture-only color formats".
  • In table 3.13, starting on page 130, SRGB8 does not have a checkmark in the "Color-renderable" column.

This also matches the EXT_srgb extension specification, under "Issues":

Do we require SRGB8_EXT be supported for RenderbufferStorage?

No. Some hardware would need to pad this out to RGBA and instead of adding that unknown for application developers we will simply not support that format in this extension.

glCheckFramebufferStatus() should return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT in this case. If it's not doing that, that looks like a bug in the OpenGL implementation.

The closest alternative that is color-renderable is GL_SRGB8_ALPHA8.

Upvotes: 1

Related Questions