Simple framebuffer is not working....driving me crazy!

Started by
3 comments, last by Lil_Lloyd 11 years, 3 months ago

Hi people. I've had a tumultuous time with framebuffers in open gl 3.3. Once, in a n engine i managed to get them to work but alas I'm having problems again.

My Initialisation code is as follows, pretty standard stuff:


bool Framebuffer::InitFramebuffer(int height,int width,GLfloat magFilter,GLfloat minFilter,bool depth)
	{
		m_height = height;
		m_width  = width;
		


		glGenTextures(1,&m_texHandle);
		glBindTexture(GL_TEXTURE_2D,m_texHandle);

		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,minFilter);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,magFilter);

		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
		

		if(!depth)
		{
			glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,m_width,m_height,0,GL_RGB,GL_UNSIGNED_BYTE,NULL);
		}
		else
		{
			glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT24,m_width,m_height,0,GL_DEPTH_COMPONENT,GL_UNSIGNED_BYTE,NULL);
		}


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

		glGenRenderbuffers(1,&m_depthHandle);
		glBindRenderbuffer(GL_RENDERBUFFER,m_depthHandle);

		glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT24,m_width,m_height);

		glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER,m_depthHandle);


		if(!depth)
		{
			glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,fbo->GetTextureHandle(),0);
			GLenum drawBufs[] = {GL_COLOR_ATTACHMENT0};
			glDrawBuffers(1,drawBufs);
		}
		else
		{
			glFramebufferTexture(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,m_texHandle,0);
			glDrawBuffer(GL_NONE);
			glReadBuffer(GL_NONE);
		}

		
		

		 if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
		 {
			 std::cout<<"problem with framebuffer!";
			 return false;
		 }
		 else
		 {
			 std::cout<<"framebuffer ok! :)";
		 }

	    glBindFramebuffer(GL_FRAMEBUFFER,0);
		
		return true;
	}

The status check at the end is always ok. In the calling code I render a texture to a full screen quad and consequently to the framebuffer, and then try and render this stored texture to a full screen quad again, just a simple test. I've even run the code in gDebugger gl and checked the texture contents at runtime - the fb texture is a solid black. Please help me!


               glBindFramebuffer(GL_FRAMEBUFFER,fbo->GetFrameBufferHandle());
		  glViewport(0,0,512,512);
		  glUseProgram(test->GetHandle());
		  glBindTexture(GL_TEXTURE_2D,myTex->m_handle);
		  test->SetUniform("tex",0);
		  quad->Draw();
		  //render text
		glBindFramebuffer(GL_FRAMEBUFFER,0);

		 //glUseProgram(test->GetHandle());
		 glBindTexture(GL_TEXTURE_2D,fbo->GetTextureHandle());
		 test->SetUniform("tex",0);
		 quad->Draw();

		
		glfwSwapBuffers();

Advertisement
So I am assuming your FBO is 100% OK so problem will be elsewhere..
Well I'm not sure if this is your problem but there should be several things to chcek:
- from the code I can see that you unbind frambuffer using glBindFramebuffer(GL_FRAMEBUFFER,0); so you are rendering to nothing
- another thing to check is if you are not trying to render to texture which is also source texture (single texture for multiple FBO )
- last thing to check is clearing your FBO before render / disabling depth test if used

Thanks for your reply. I'm unbinding the framebuffer AFTER rendering the scene, so it should be rendered. In fact, now in gDebugger I can see a texture being rendered IF i draw an immediate mode triangle to the screen, as a simple test.

However, even if I bind this texture using the handle in the FB initialisation I cannot render it to the screen! I will now try with a few more different scenarios.

For some reason though, the FBO is still not rendered to if I try to 'capture' a full screen quad.

Have you tried clearing the appropriate buffer bits before rendering to FBO? Also check to see that the renderbuffer is black as well - when I used renderbuffers last I originally had an issue where the renderbuffer would have a valid texture but my FBO was solid black. Also, after glTexImage2D(), make sure to call glBindTexture(GL_TEXTURE_2D, 0);.

Edit: I believe the renderbuffer also needs unbound after glRenderbufferStorage()

Thanks for your replies, I'll try this and see what happens

This topic is closed to new replies.

Advertisement