2012-07-23 4 views
10

[iPad-3] - [iOS 5.0] - [Objective-C] - [XCode 4.3.3] - [Cocos2D] - [openGL | ES 2.0]Warum würde glBindFrambuffer (GL_FRAMEBUFFER, 0) in cocos2D-iphone zu einem leeren Bildschirm führen?

ich lerne, wie openGL verwenden | ES 2.0 und haben auf Frame Buffer Objects (FBO) s

gestolpert

Info: ich mit Cocos2D gerade arbeite, die eine Menge extra-fancy Handhabung für das Zeichnen hat. Ich stelle mir vor, dass dies mit dem Problem verbunden sein könnte. Wenn der ‚default‘ Frame-Buffer für cocos verschieden ist von dem eigentlichen Pufferstandardrahmen, der auf den Bildschirm zieht, könnte dies in einer Folge

Mein Problem falsch machen: in der init-Funktion meines „Hello World. m "Klasse, wenn ich platziere" glBindFrameBuffer (GL_FRAMEBUFFER, 0); " überall bekomme ich einfach einen leeren Bildschirm!

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

Fehle ich etwas Grundlegendes und Offensichtliches?

Soweit ich gelernt habe, die Funktion "glBindFramebuffer (GL_FRAMEBUFFER, 0);" Wenn Sie den Framebuffer einfach auf 0 setzen, wird der Standard-Framebuffer angewendet, der auf den Bildschirm zeichnet.

+0

Ich sehe, du bist neu hier. Herzlich willkommen! Der Weg, um anzuzeigen, dass Ihr Problem gelöst wurde, besteht darin, eine Antwort zu akzeptieren, die Antwort nicht in die Frage zu stellen und dem Titel das Wort "Gelöst" hinzuzufügen. Es ist völlig in Ordnung, eine Antwort auf Ihre eigene Frage zu posten und zu akzeptieren. (Sie müssen möglicherweise ein paar Stunden warten, um dies zu tun; es gibt einige temporäre Einschränkungen für neue Benutzer.) –

+0

Ich war mir nicht bewusst, dass es schlechte Etikette war, um das (gelöste) Ding zu tun. Ich habe es schon oft so gesehen gesehen, also nahm ich an, es sei so, dass pplz es einfach selbst gemacht hat. Ich habe versucht, mir selbst zu antworten, 8 Stunden warten. und ich bin bei der Arbeit und habe keine Geduld für solche Dinge. Ich werde jetzt bearbeiten und morgen erneut versuchen, die Antwort zu geben. wenn es immer noch nicht funktioniert, dann werde ich es einfach lassen. – JThora

+0

Ich habe deine letzte Zeile bearbeitet; wie geschrieben, bedeutet das, dass Sie keine Lösung für das Problem haben. –

Antwort

24

Das Problem war, dass entweder iOS oder Cocos2D (oder beide) einen einzigartigen Framebuffer haben können. Das Handle dieses einzigartigen Framebuffers würde sich von 0 unterscheiden und jedes Mal anders sein.

Um dies zu lösen, muss ich den Griff des aktuellen FBO greifen, meine eigenen Framebuffer-Sachen machen und dann den FBO-Griff wieder anbringen, nachdem ich fertig bin.

Erstellt eine Variable, die die ursprüngliche Frame Buffer Object

GLint oldFBO; 

Ordnet das aktuell verwendete FBO des Griffs Bezugnahme auf die Variable 'oldFBO'

(die eine 'GLint' ist)
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFBO); 

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

Danach legen Sie das ursprüngliche FBO als aktuelles Framebuf fest fer

glBindFramebuffer(GL_FRAMEBUFFER, oldFBO); 
+1

JA! Danke! Dies funktioniert auch auf Android. – Tyguy7

+0

Das hat mich verrückt gemacht ... Danke, dass du mich gerettet hast! – Matferib

+0

GAH! Einen halben Tag habe ich diese Idiotie verloren ... vielen Dank für den wichtigen Hinweis. –