Почему glBindFramebuffer (GL_FRAMEBUFFER, 0) приведет к пустым экранам в cocos2D-iphone?

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

Я изучаю, как использовать openGL | ES 2.0 и наткнулся на объекты буфера кадров (FBO) s

Информация: Я работаю с Cocos2D, у которого много привлекательной обработки для рисования. Я полагаю, что это может быть связано с проблемой. Если буфер кадров по умолчанию для кокосов отличается от фактического буфера кадров по умолчанию, который рисует на экране, это может привести к неправильному рисованию

Моя проблема: в функции init моего класса "helloworld.m", если я помещаю "glBindFrameBuffer (GL_FRAMEBUFFER, 0)"; где угодно, я просто получаю пустой экран!

-(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;}

Я пропустил что-то основное и очевидное?

Насколько я узнал, функция "glBindFramebuffer (GL_FRAMEBUFFER, 0);" просто установка параметра Framebuffer в 0 применяет фреймбуфер по умолчанию, который рисует на экране.

Ответ 1

Проблема заключалась в том, что либо iOS, либо Cocos2D (или оба) могут иметь уникальный фреймбуфер. Ручка этого уникального буфера кадров будет отличаться от 0 и может быть разным каждый раз.

Чтобы решить эту проблему, я должен захватить текущий дескриптор FBO, сделать свой собственный материал Framebuffer, а затем снова применить дескриптор FBO после того, как я закончу.

Создает переменную для ссылки на исходный объект буфера кадров

GLint oldFBO;

Назначает текущий используемый дескриптор FBO (который является "GLint" ) переменной "oldFBO"

glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFBO);

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

После этого вы устанавливаете исходное FBO в качестве текущего Framebuffer

glBindFramebuffer(GL_FRAMEBUFFER, oldFBO);