Why would glBindFramebuffer(GL_FRAMEBUFFER, 0) result in blank screen in cocos2D-iphone?

JThora picture JThora · Jul 23, 2012 · Viewed 7.7k times · Source

[iPad-3]-[iOS 5.0]-[Objective-C]-[XCode 4.3.3]-[Cocos2D]-[openGL|ES 2.0]

I'm learning how to use openGL|ES 2.0 and have stumbled on Frame Buffer Objects (FBO)s

Info: I'm working with Cocos2D which has a lot of extra-fancy handling for drawing. I imagine that this may be linked with the issue. If the 'default' frame buffer for cocos is different from the actual default frame buffer that draws to the screen, this could result in a mis-draw

My Problem: in the init function of my "helloworld.m" class, if I place "glBindFrameBuffer(GL_FRAMEBUFFER, 0);" anywhere, I simply get a blank screen!

-(id) init
{
if( (self=[super init])) 
{

CGSize winSize = [CCDirector sharedDirector].winSize;

glBindFramebuffer(GL_FRAMEBUFFER, 0);


CCSprite * spriteBG = [[CCSprite alloc] initWithFile:@"cocos_retina.png"];
spriteBG.position = ccp(512,384);
//[self addChild:spriteBG z:1];

[self scheduleUpdate];
_mTouchDown = NO;


_mSprite = [CCSprite spriteWithTexture:_mMainTexture];
_mSprite.position = ccp(512,384);
[self addChild:_mSprite];

self.isTouchEnabled = YES;

} return self;}

Am I missing something basic and obvious?

As far as I've learned, the function "glBindFramebuffer(GL_FRAMEBUFFER, 0);" simply just setting the Framebuffer to 0 applies the default framebuffer that draws to the screen.

Answer

JThora picture JThora · Jul 24, 2012

The Problem was that either iOS or Cocos2D (or both) can have a unique framebuffer. The handle of that unique frame buffer would be different than 0, and may be different each time.

To solve this, I have to grab the current FBO's handle, do my custom Framebuffer stuff and then re-apply the FBO's handle after I'm done.

Creates a variable to reference the original Frame Buffer Object

GLint oldFBO;

Assigns the currently used FBO's handle (which is a 'GLint') to the variable 'oldFBO'

glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFBO);

//here is when you would create or manipulate custom framebuffers.//

After that, You set the original FBO as the current Framebuffer

glBindFramebuffer(GL_FRAMEBUFFER, oldFBO);