2012-07-23 6 views
10

[iPad-3] - [iOS 5.0] - [Objective-C] - [XCode 4.3.3] - [Cocos2d] - [openGL | ES 2.0]Perché glBindFramebuffer (GL_FRAMEBUFFER, 0) restituisce uno schermo vuoto in cocos2D-iphone?

sto imparando come usare openGL | ES 2.0 e si sono imbattuti in oggetti frame Buffer (FBO) s

Info: sto lavorando con cocos2d che ha un sacco di gestione extra-fantasia per il disegno. Immagino che questo possa essere collegato al problema. Se il frame buffer 'default' per cocos è diverso dal frame buffer di default attuale che disegna sullo schermo, questo potrebbe tradursi in una mis-disegnare

mio problema: nella funzione init del mio "helloworld. m "class, se metto" glBindFrameBuffer (GL_FRAMEBUFFER, 0); " ovunque, ottengo semplicemente uno schermo vuoto!

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

Mi manca qualcosa di semplice ed evidente?

Per quanto ho appreso, la funzione "glBindFramebuffer (GL_FRAMEBUFFER, 0);" semplicemente impostando il Framebuffer su 0 si applica il framebuffer predefinito che disegna sullo schermo.

+0

Vedo che sei nuovo qui. Benvenuto! Il modo per indicare che il problema è stato risolto è accettare una risposta, non mettere la risposta nella domanda e aggiungere la parola "Risolto" al titolo. È perfettamente accettabile pubblicare e accettare una risposta alla tua stessa domanda. (Potrebbe essere necessario attendere alcune ore per farlo, ci sono alcune restrizioni temporanee per i nuovi utenti.) –

+0

Non ero consapevole del fatto che fosse una scarsa etichetta fare la cosa (risolta). L'ho visto fare così tante volte già così, quindi ho pensato che fosse proprio così che pplz lo faceva da solo. Ho provato a risponderti, 8 ore di attesa. e sono al lavoro e non ho pazienza per queste cose. Ora modificherò e riproverò domani per avere la risposta. se ancora non funziona, allora lo lascerò. – JThora

+0

Ho modificato la tua ultima riga; come scritto, implicava che non avessi una soluzione per il problema. –

risposta

24

Il problema era che iOS o Cocos2D (o entrambi) possono avere un framebuffer univoco. L'handle di quel buffer di frame univoco dovrebbe essere diverso da 0 e potrebbe essere diverso ogni volta.

Per risolvere questo, devo prendere l'handle dell'FBO corrente, fare il mio materiale Framebuffer personalizzato e quindi riapplicare il manico dell'FBO dopo che ho finito.

crea una variabile per fare riferimento all'oggetto Frame Buffer originale

GLint oldFBO; 

Assegna la maniglia attualmente utilizzato di OSA (che è un 'GLint') alla variabile 'oldFBO'

glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFBO); 

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

Successivamente, si imposta l'FBO originale come Framebuf corrente fer

glBindFramebuffer(GL_FRAMEBUFFER, oldFBO); 
+1

SÌ! Grazie! Funziona anche su Android. – Tyguy7

+0

Questo mi stava facendo impazzire ... Grazie per avermi salvato! – Matferib

+0

GAH! Ho perso mezza giornata per questa idiozia ... molte grazie per l'indizio vitale. –