Perraco
Perraco

Reputation: 17380

Error rendering with GLSL framebuffer

I am trying to get into screen a video frame in a 2d texture covering the screen, I must use framebuffers, because eventually I wish to do the ping-pong rendering technique. But for the time being I want first to achieve just to render on the screen by using framebuffers.

This is my setup code:

 // Texture setup

 int[] text = new int[1];
 glGenTextures(1, text, 0);
 glActiveTexture(GL_TEXTURE0);
 glBindTexture(GL_TEXTURE_2D, text[0]);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 512, 512, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, null);

 // Frambuffer setup

 int[] fbo = new int[1];
 glGenFramebuffers(1, fbo, 0);
 glBindFramebuffer(GL_FRAMEBUFFER, fbo[0]);
 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, text[0], 0);
 glBindFramebuffer(GL_FRAMEBUFFER, 0);

Till here all ok, I didn't write here the testing code to keep it small, but right after I check if the frame buffer was created correctly, and all is fine.

Now in my Render loop I do next:

 // Use the GLSL program

 glUseProgram(programHandle);

 // Swap to my FBO

 glBindTexture(GL_TEXTURE_2D, 0);
 glBindFramebuffer(GL_FRAMEBUFFER, fbo[0]);
 glViewport(0, 0, 512, 512);

 // Pass the new image data to the program so the fragment shader processes it.
 // Using glTexSubImage2D to speed up

 glActiveTexture(GL_TEXTURE0);
 glBindTexture(GL_TEXTURE_2D, text[0]);
 glUniform1i(glGetUniformLocation(programHandle, "u_texture"), 0);
 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 512, 512, GL_LUMINANCE, GL_UNSIGNED_BYTE, NewImageData);

 // Draw the quad

 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

 // Swap back to the default screen frambuffer

 glBindFramebuffer(GL_FRAMEBUFFER, 0);
 glBindTexture(GL_TEXTURE_2D, 0);

At this point I get a black screen, and on the log I can see a GL_INVALID_FRAMEBUFFER_OPERATION 1286. I tried putting the glDrawArrays after the glBindFramebuffer call, but then the application crashes. Any thoughts? Thanks in advance.

Upvotes: 2

Views: 2219

Answers (1)

Dr. Snoopy
Dr. Snoopy

Reputation: 56407

LUMINANCE textures are not renderable, this means you can't render to them using a FBO. This problem is solved with the GL_ARB_texture_rg extension, which introduces one and two channel texture formats that are renderable.

Upvotes: 2

Related Questions