2012-07-23 95 views
10

[ipad公司-3] - [5.0的iOS] - [目标C] - [4.3.3的XCode] - [Cocos2D中] - [openGL的| ES 2.0]为什么glBindFramebuffer(GL_FRAMEBUFFER,0)在cocos2D-iphone中导致空白屏幕?

我学习如何使用OpenGL | ES 2.0和无意中发现了帧缓冲对象(FBO)■

信息: 我与Cocos2D中具有绘制了很多额外的花哨处理工作。我想这可能与问题有关。如果科科斯“默认”帧缓冲是绘制到屏幕实际的默认帧缓冲区的不同,这可能会导致误画

我的问题:在我的“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即可应用绘制到屏幕的默认帧缓冲区。

+0

我看到你是新来的。欢迎!表明您的问题已经解决的方法是接受答案,而不是在问题中提供答案,并在标题中添加“已解决”一词。发布并接受对自己问题的答案是完全可以的。 (您可能需要等待几个小时才能做到这一点;对新用户有一些暂时的限制。) – 2012-07-23 19:57:08

+0

我不知道做(解决)事情是不礼貌的。我已经看过很多次了,所以我认为这是pplz为自己做的。我试图回答自己,等待8小时。我在工作,对这些事情没有耐心。我现在编辑并且明天再试一次以作出答案。如果它仍然不起作用,那么我就放弃它。 – JThora 2012-07-23 21:25:59

+0

我编辑了你的最后一行;正如所写,这意味着你没有解决问题的办法。 – 2012-07-23 22:09:11

回答

24

问题是iOS或Cocos2D(或两者)都可以拥有唯一的帧缓冲区。 该唯一帧缓冲区的句柄将不同于0,并且可能每次都不相同。

为了解决这个问题,我必须抓住当前的FBO的手柄,做我自定义的Framebuffer的东西,然后在完成后重新应用FBO的手柄。

创建变量引用原始帧缓冲对象

GLint oldFBO; 

分配当前使用的FBO的句柄(这是一个 '闪烁')将变量 'oldFBO'

glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFBO); 

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

之后,您将原始的FBO设置为当前的Framebuf fer

glBindFramebuffer(GL_FRAMEBUFFER, oldFBO); 
+1

是的!谢谢!这也适用于Android。 – Tyguy7 2015-12-16 14:37:16

+0

这让我发疯了......谢谢救救我! – Matferib 2016-02-18 15:02:41

+0

GAH!这个白痴失去了半天......非常感谢你的重要线索。 – 2016-06-08 17:33:49