0
votes

Here is my problem : I would like to render 2 images offscreen (which come from previous rendering) and then blend them together with a special algorithm. My first image/texture is RGB and the second one is in grayscale, so I only got the luminance.

I think the best way to achieve my goal is to use Frame Buffer Object. So I create one FBO for the first image, then I associate to that FBO a new texture which will received the rendering output. The texture's format is GL_RGB and it works fine, my first FBO contains the rendering in its texture. Then I do the same with the second image which its format is GL_LUMINANCE. But in the draw function, when I bind to this FrameBuffer and check the Status I got the error GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT. And if I change the texture to RGB it works.

But for the blending I need to access to the luminance and not the rgb component of my image.

Do you have any solutions?

I'm working with OpenGL ES 3.0 on the imx6q Freescale's SOC.

Here is my code : 1 - Creation of the Frame Buffer Object and texture

glGenFramebuffers(1, &m_uiFrameBufferObject);
glBindFramebuffer(GL_FRAMEBUFFER, m_uiFrameBufferObject);

glGenTextures(1, &m_uiTextureId[1]);
glBindTexture(GL_TEXTURE_2D, m_uiTextureId[1]);

glTexImage2D(   GL_TEXTURE_2D, 0, GL_LUMINANCE, 1280, 960,
                0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_uiTextureId[1], 0);
glDrawBuffers(1, attachments);    //GL_COLOR_ATTACHMENT0

Then in the draw function :

glBindFramebuffer(GL_FRAMEBUFFER, m_uiFrameBufferObject);

if( glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT )
{
     // I go there
}

glViewport(0, 0, 1280, 960);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glUseProgram(m_ProgCamera.GetHandle());

glVertexAttribPointer(0, 3, GL_FLOAT, 0, 0, vVertices);
glEnableVertexAttribArray(0);

// Bind the color attributes
glVertexAttribPointer(1, 3, GL_FLOAT, 0, 0, g_vertexColors);
glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, 0, 0, g_vertexTexCoords);
glEnableVertexAttribArray(2);
// Select Our Texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_textureCamera.GetHandle());

glDrawArrays( GL_TRIANGLES, 0, 6 );

// Cleanup
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);

Thanks for your time.

1

1 Answers

2
votes

GL_LUMINANCE is not a color renderable format in OpenGL ES 3.0. The specification states in Section 4.4.4 (Framebuffer Completeness):

An internal format is color-renderable if it is one of the formats from table 3.12 noted as color-renderable or if it is unsized format RGBA or RGB. No other formats, including compressed internal formats, are color-renderable.

Since GL_LUMINANCE is not included in this list, it is impossible to render to such a texture. Depending on your needs you could, for example, use GL_R8 instead.